Build managers

Atila Neves via Digitalmars-d digitalmars-d at puremagic.com
Mon Feb 2 08:05:58 PST 2015


XML? Please, no. Anything but XML.

Atila

On Monday, 2 February 2015 at 10:54:16 UTC, Rikki Cattermole 
wrote:
> So I'm going to through a massive spanner in the works here.
> I want to clarify something first. I love dub and what it 
> stands for.  I don't want to change it.
>
> Just before dub came about, I was working on a build manager as 
> well. Except it was based heavily on Maven, but had more native 
> usage.
>
> The reason I believe this should at least be made out in the 
> open is that we have people who want more control over their 
> project building and dub will not provide that. Especially 
> mixing c/c++ and D.
>
> There was a recent suggestion to split dub up into a package 
> manager and builder. This might be a worthwhile alternative as 
> a builder.
>
> Here was the spec that I wrote for it:
>
> <Languages>
> 	<Language>
> 		<Name>D</Name>
> 		<Extensions>
> 			<Extension>d</Extension>
> 			<Extension>di</Extension>
> 		</Extensions>
> 		<Compilers>
> 			<Compiler>
> 				<Application>dmd</Application>
> 				<CompileCommand>{cmd} -c {source} 
> -of{ObjectDir}/{source}.obj {includesArgument}</CompileCommand>
> 				<LinkCommand>{cmd} {objects} {libraries} 
> -of{OuputDir}/{name}{extension} {includes}</LinkCommand>
> 				<IncludesArgument> -I{include}</IncludesArgument>
> 				<StaticLibraryArgument> -lib</StaticLibraryArgument>
> 				<DynamicLibraryArgument> -lib</DynamicLibraryArgument>
> 				<Platforms>
> 					<Platform>
> 						<Type>windows</Type>
> 						<Targets>
> 							<Target>win32</Target>
> 							<Target>win64</Target>
> 						</Targets>
> 						<CompilerLocation>C:/D/dmd2/windows/bin/</CompilerLocation>
> 						<StandardLibrary 
> include="false">C:/D/dmd2/windows/lib/phobos.lib</StandardLibrary>
> 						<BinaryExtension>.exe</BinaryExtension>
> 						<DynamicLibraryExtension>.dll</DynamicLibraryExtension>
> 						<StaticLibraryExtension>.lib</StaticLibraryExtension>
> 						<Compatibility>
> 						</Compatibility>
> 					</Platform>
> 					<Platform>
> 						<Type>linux</Type>
> 						<BinaryExtension></BinaryExtension>
> 						<DynamicLibraryExtension>.so</DynamicLibraryExtension>
> 						<StaticLibraryExtension>.a</StaticLibraryExtension>
> 						<Compatibility>
> 							<Language objectsOnly="true">c</Language>
> 						</Compatibility>
> 					</Platform>
> 				</Platforms>
> 				<Profiles>
> 					<Profile default="true">
> 						<Name>Release</Name>
> 						<LinkCommand> -release</LinkCommand>
> 					</Profile>
> 					<Profile>
> 						<Name>Debug</Name>
> 						<CompileCommand> -debug -gc</CompileCommand>
> 						<LinkCommand> -debug -gc</LinkCommand>
> 					</Profile>
> 					<Profile>
> 						<Name>Unittest</Name>
> 						<CompileCommand> -unittest -gc</CompileCommand>
> 						<LinkCommand> -unittest -gc</LinkCommand>
> 					</Profile>
> 				</Profiles>
> 				<Project>
> 					<SourceDir>{project_dir}/src</SourceDir>
> 					<OutputDir 
> clean="true">{project_dir}/bin/{target}</OutputDir>
> 					<ObjectDir 
> clean="true">{project_dir}/obj/{target}</ObjectDir>
> 					<ResourceDir>{project_dir}/resources</ResourceDir>
> 					<Includes>
> 					</Includes>
> 					<ProvidesModules>
> 					</ProvidesModules>
> 					<target>{hostPlatform}</target>
> 				</Project>
> 			</Compiler>
> 		</Compilers>
> 	</Language>
> 	<Language>
> 		<Name>C</Name>
> 		<Extensions>
> 			<Extension>c</Extension>
> 		</Extensions>
> 		<Compilers>
> 			<Compiler>
> 				<Application>gcc</Application>
> 				<CompileCommand>{cmd} -c {source} 
> -o{ObjectDir}/{source}.obj {includesArgument}</CompileCommand>
> 				<LinkCommand>{cmd} {objects} {libraries} 
> -o{OuputDir}/{name}{extension} {includes}</LinkCommand>
> 				<IncludesArgument> -I{include}</IncludesArgument>
> 				<StaticLibraryArgument> -lib</StaticLibraryArgument>
> 				<DynamicLibraryArgument> -lib</DynamicLibraryArgument>
> 				<Platforms>
> 					<Platform>
> 						<Type>windows</Type>
> 						<Targets>
> 							<Target>win32</Target>
> 							<Target>win64</Target>
> 						</Targets>
> 						<CompilerLocation>C:/MinGW/bin/</CompilerLocation>
> 						<BinaryExtension>.exe</BinaryExtension>
> 						<DynamicLibraryExtension>.dll</DynamicLibraryExtension>
> 						<StaticLibraryExtension>.lib</StaticLibraryExtension>
> 						<Compatibility>
> 							<Language objectsOnly="true">C++</Language>
> 						</Compatibility>
> 					</Platform>
> 					<Platform>
> 						<Type>linux</Type>
> 						<BinaryExtension></BinaryExtension>
> 						<DynamicLibraryExtension>.so</DynamicLibraryExtension>
> 						<StaticLibraryExtension>.a</StaticLibraryExtension>
> 						<Compatibility>
> 							<Language objectsOnly="true">C++</Language>
> 							<Language objectsOnly="true" 
> requireStandardLibrary="true">D</Language>
> 						</Compatibility>
> 					</Platform>
> 				</Platforms>
> 				<Profiles>
> 					<Profile default="true">
> 						<Name>Release</Name>
> 					</Profile>
> 					<Profile>
> 						<Name>Debug</Name>
> 						<CompileCommand> -ggdb</CompileCommand>
> 						<LinkCommand> -ggdb</LinkCommand>
> 					</Profile>
> 				</Profiles>
> 				<Project>
> 					<SourceDir>{project_dir}/src</SourceDir>
> 					<OutputDir 
> clean="true">{project_dir}/bin/{target}</OutputDir>
> 					<ObjectDir 
> clean="true">{project_dir}/obj/{target}</ObjectDir>
> 					<ResourceDir>{project_dir}/resources</ResourceDir>
> 					<Includes>
> 						<Include>{project_dir}/headers</Include>
> 					</Includes>
> 					<ProvidesModules>
> 					</ProvidesModules>
> 					<target>{hostPlatform}</target>
> 				</Project>
> 			</Compiler>
> 		</Compilers>
> 	</Language>
> 	<Language>
> 		<Name>C++</Name>
> 		<Extensions>
> 			<Extension>cpp</Extension>
> 		</Extensions>
> 		<Compilers>
> 			<Compiler>
> 				<Application>g++</Application>
> 				<CompileCommand>{cmd} -c {source} 
> -o{ObjectDir}/{source}.obj {includesArgument}</CompileCommand>
> 				<LinkCommand>{cmd} {objects} {libraries} 
> -o{OuputDir}/{name}{extension} {includes}</LinkCommand>
> 				<IncludesArgument> -I{include}</IncludesArgument>
> 				<StaticLibraryArgument> -lib</StaticLibraryArgument>
> 				<DynamicLibraryArgument> -lib</DynamicLibraryArgument>
> 				<Platforms>
> 					<Platform>
> 						<Type>windows</Type>
> 						<Targets>
> 							<Target>win32</Target>
> 							<Target>win64</Target>
> 						</Targets>
> 						<CompilerLocation>C:/MinGW/bin/</CompilerLocation>
> 						<BinaryExtension>.exe</BinaryExtension>
> 						<DynamicLibraryExtension>.dll</DynamicLibraryExtension>
> 						<StaticLibraryExtension>.lib</StaticLibraryExtension>
> 						<Compatibility>
> 							<Language>C</Language>
> 						</Compatibility>
> 					</Platform>
> 					<Platform>
> 						<Type>linux</Type>
> 						<BinaryExtension></BinaryExtension>
> 						<DynamicLibraryExtension>.so</DynamicLibraryExtension>
> 						<StaticLibraryExtension>.a</StaticLibraryExtension>
> 						<Compatibility>
> 							<CompatibilityLanguage>C</CompatibilityLanguage>
> 							<CompatibilityLanguage objectsOnly="true" 
> requireStandardLibrary="true">D</CompatibilityLanguage>
> 						</Compatibility>
> 					</Platform>
> 				</Platforms>
> 				<Profiles>
> 					<Profile default="true">
> 						<Name>Release</Name>
> 					</Profile>
> 					<Profile>
> 						<Name>Debug</Name>
> 						<CompileCommand> -ggdb</CompileCommand>
> 						<LinkCommand> -ggdb</LinkCommand>
> 					</Profile>
> 				</Profiles>
> 				<Project>
> 					<SourceDir>{project_dir}/src</SourceDir>
> 					<OutputDir 
> clean="true">{project_dir}/bin/{target}</OutputDir>
> 					<ObjectDir 
> clean="true">{project_dir}/obj/{target}</ObjectDir>
> 					<ResourceDir>{project_dir}/resources</ResourceDir>
> 					<Includes>
> 						<Include>{project_dir}/headers</Include>
> 					</Includes>
> 					<ProvidesModules>
> 					</ProvidesModules>
> 					<Target>{hostPlatform}</Target>
> 					<Repositories>
> 						<Repository>
> 							<Name>Main Repository</Name>
> 							<BaseURL>http://example.com/repo</BaseURL>
> 						</Repository>
> 						<Repository>
> 							<Name>Local repository</Name>
> 							<Directory>{bspDataDir}/repo</Directory>
> 						</Repository>
> 					</Repositories>
> 				</Project>
> 			</Compiler>
> 		</Compilers>
> 	</Language>
> </Languages>
>
> If targets is not specified for a platform of a compiler then 
> check
> against it's type.
> The type insignifies the binary of the compiler is in. Not the 
> output it produces.
> The output of a compiler is the type.
> The type should match one of these:
> 	windows
> 	linux
> 	osx
> 	freeBSD
> 	solaris
> 	posix
> Targets are made up of the platform and a more specific 
> information.
> 	win32
> 	win64
>
> <Project>
> 	<Name>ABC project</Name>
> 	<Version>x.y.z</Version>
> 	<Description>An amazing project!</Description>
> 	<Profile>Release</Profile>
> 	<ProvidesModules>
> 		<Module>project.abc.test</Module>
> 	</ProvidesModules>
> 	<Developers>
> 		<Developer>Person here person at company.com</Developer>
> 	</Developers>
> 	<VCS>https://example.com/repo/abc.git</VCS>
> 	<URL>http://example.com/project/abc</URL>
> 	
> 	<Dependencies>
> 		<Dependency>
> 			<Name>DEF project</Name>
> 			<Version>i.j.k</Version>
> 			<Module>project.def.test</Module>
> 			<Directory>{ProjectDir}/../DEF</Directory>
> 		</Dependency>
> 	</Dependencies>
> </Project>
>
> Configuration 'flattening' occurs in these steps
> 1. Load all files and keep output seperate
> 2. Create list of all languages which have unique names
> 3. Add to list of languages a new version of each language that 
> has conflicts
> 	If append is available append to previous value for property 
> otherwise overide.
> 	Prefer the later files not the first ones.
> 4. For each project in languages create a new one and use it as 
> the base then overlay the projects configuration.
> 5. For each project created in last step gather the 
> application, compile command, link command, includes, dynamic 
> library and static library arguments.
> 6. Create base command to be executed for each project for 
> storage.
>
> Make sure 1-4 can be made into a cached file. (Preferably a 
> mmfile).
>
> Folder structure
> ~/.bsp/languages.xml
> e.g. ~/.bsp/repo/m.o.d.u.l.e/v.e.r.s.i.o.n/project.xml
> e.g. ~/.bsp/repo/m.o.d.u.l.e/v.e.r.s.i.o.n/languages.xml
> e.g. ~/.bsp/repo/m.o.d.u.l.e/v.e.r.s.i.o.n/src
> e.g. ~/.bsp/repo/m.o.d.u.l.e/v.e.r.s.i.o.n/bin/win32/bin.dll
> e.g. ~/.bsp/repo/m.o.d.u.l.e/v.e.r.s.i.o.n/bin/win32/bin.lib
> project_dir/project.xml
> project_dir/languages.xml
> project_dir/project_cached.xml
> e.g. project_dir/bin/win32/bin.dll
> e.g. project_dir/src
> e.g. project_dir/obj/win32/bin.obj
> e.g. project_dir/obj/win32/dependencies/m.o.d.u.l.e/bin.lib
> e.g. project_dir/resources



More information about the Digitalmars-d mailing list