Splitting a project into different executable files

evilrat evilrat666 at gmail.com
Sat Oct 12 05:22:57 UTC 2024


On Saturday, 12 October 2024 at 01:09:56 UTC, Alexander Zhirov 
wrote:
> Is it possible to organize a project that will consist of 
> several main files. I want to write several simple programs in 
> one project, but for them to be divided into different files. 
> So that it would be possible to choose during compilation what 
> to build, via dub. Is this possible?

Not sure if this what you need, but anyway.

I using this project structure, have a root dub folder, and then 
have a subfolders for isolated components of the project.
My project is game so in the future it might to have main 
executable and dedicated server, this should be able to choose 
what to build with configurations.

overall here is the dub config, I have root package to build 
everything I need at once (using dependencies declaration), and 
then it should be possible to add second configuration.

And as usual, dub can build any subpackage like this `dub build 
game:somepackage`.

*(don't mind that it is a dynamic library, i have external app 
loading lib but principle will be the same for regular 
executables with main function)*

__dub.json__
```json
{
     "authors": [
         "John Smith"
     ],
     "copyright": "Copyright © 2023, John Smith",
     "description": "some game",
     "license": "proprietary",
     "name": "game",

     "subPackages": [
         {
             "name": "core",
             "targetType": "dynamicLibrary",
             "targetPath": "coregame/bin",
             "sourcePaths": ["coregame/source"],
             "importPaths": ["coregame/source"],
             "dependencies": {
                 "gameengine" : "~>0.1.0"
             }
         }
     ],
     "dependencies": {
         "game:core": "*"
     },
     "configurations": [
         {
             "name": "default",
             "targetType": "none"
         }
     ]
}
```

If later I need to add dedicated server build it would be another 
entry in "configurations" something like this, where D version 
will be choosing between two main() functions or just modify 
control flow if needed.

then choosing between targets will be just like this

**`dub build`** for regular app
**`dub build -c dedicated`** for server build

```json
"configurations": [
     {
             "name": "default",
             "targetType": "none"
     },
     {
             "name": "dedicated",
             "targetType": "none",
             "versions": [ "DedicatedServer" ]
     },
]
```


More information about the Digitalmars-d-learn mailing list