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 per...@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

Reply via email to