Build managers
wobbles via Digitalmars-d
digitalmars-d at puremagic.com
Mon Feb 2 08:30:21 PST 2015
While I've no doubt the functionality here is good, I think
following the Ant colony down the XML branch will ultimately be a
pest that's hard to control.
In my current job, we have ant scripts to install our dev builds
that is 10k+ lines long! And noone knows all of it. A single line
change gives me nightmares!! It started off nice and small, but
grew to a monster.
We're now moving towards gradle as we can control the install
much better with a fully fledged programming environment. Should
be much easier read too.
Seems strange to be talking about dub as, ahem, Antique software
already. Surely it's still salvageable?
On Monday, 2 February 2015 at 16:06:00 UTC, Atila Neves wrote:
> 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