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