diff --git a/examples/generated-sources/dub.json b/examples/generated-sources/dub.json new file mode 100644 index 0000000..33ed82e --- /dev/null +++ b/examples/generated-sources/dub.json @@ -0,0 +1,7 @@ +{ + "name": "generated-sources", + "description": "Example of using pre generate commands to generate source code.", + "preGenerateCommands": [ + "echo int fun() { return 42; } > source/test.d" + ] +} diff --git a/examples/generated-sources/source/app.d b/examples/generated-sources/source/app.d new file mode 100644 index 0000000..02bf868 --- /dev/null +++ b/examples/generated-sources/source/app.d @@ -0,0 +1,7 @@ +import std.stdio; +import test; + +void main() +{ + writefln("Result: %s", fun()); +} diff --git a/source/dub/generators/build.d b/source/dub/generators/build.d index a05e0c8..7d5c025 100644 --- a/source/dub/generators/build.d +++ b/source/dub/generators/build.d @@ -125,10 +125,6 @@ // determine basic build properties auto generate_binary = !(buildsettings.options & BuildOptions.syntaxOnly); - // run pre-/post-generate commands and copy "copyFiles" - prepareGeneration(buildsettings); - finalizeGeneration(buildsettings, generate_binary); - logInfo("Building %s configuration \"%s\", build type %s.", pack.name, config, settings.buildType); if( buildsettings.preBuildCommands.length ){ @@ -190,9 +186,6 @@ flags ~= buildsettings.dflags; flags ~= mainsrc.relativeTo(cwd).toNativeString(); - prepareGeneration(buildsettings); - finalizeGeneration(buildsettings, generate_binary); - if (buildsettings.preBuildCommands.length){ logInfo("Running pre-build commands..."); runCommands(buildsettings.preBuildCommands); @@ -229,8 +222,6 @@ logInfo("Building configuration \""~config~"\", build type "~settings.buildType); - prepareGeneration(buildsettings); - // make all target/import paths relative string makeRelative(string path) { auto p = Path(path); if (p.absolute) p = p.relativeTo(cwd); return p.toNativeString(); } buildsettings.targetPath = makeRelative(buildsettings.targetPath); @@ -251,8 +242,6 @@ exe_file_path = Path(buildsettings.targetPath) ~ getTargetFileName(buildsettings, settings.platform); } - finalizeGeneration(buildsettings, generate_binary); - if( buildsettings.preBuildCommands.length ){ logInfo("Running pre-build commands..."); runBuildCommands(buildsettings.preBuildCommands, buildsettings); diff --git a/source/dub/generators/generator.d b/source/dub/generators/generator.d index 9f7218d..99e95be 100644 --- a/source/dub/generators/generator.d +++ b/source/dub/generators/generator.d @@ -55,6 +55,11 @@ TargetInfo[string] targets; string[string] configs = m_project.getPackageConfigs(settings.platform, settings.config); + foreach (pack; m_project.getTopologicalPackageList(true, null, configs)) { + auto buildsettings = pack.getBuildSettings(settings.platform, configs[pack.name]); + prepareGeneration(pack.name, buildsettings); + } + string[] mainfiles; collect(settings, m_project.rootPackage, targets, configs, mainfiles, null); downwardsInheritSettings(m_project.rootPackage.name, targets, targets[m_project.rootPackage.name].buildSettings); @@ -62,6 +67,12 @@ if (bs.targetType == TargetType.executable) bs.addSourceFiles(mainfiles); generateTargets(settings, targets); + + foreach (pack; m_project.getTopologicalPackageList(true, null, configs)) { + auto buildsettings = pack.getBuildSettings(settings.platform, configs[pack.name]); + bool generate_binary = !(buildsettings.options & BuildOptions.syntaxOnly); + finalizeGeneration(pack.name, buildsettings, generate_binary); + } } abstract void generateTargets(GeneratorSettings settings, in TargetInfo[string] targets); @@ -224,10 +235,10 @@ /** Runs pre-build commands and performs other required setup before project files are generated. */ -void prepareGeneration(in BuildSettings buildsettings) +private void prepareGeneration(string pack, in BuildSettings buildsettings) { if( buildsettings.preGenerateCommands.length ){ - logInfo("Running pre-generate commands..."); + logInfo("Running pre-generate commands for %s...", pack); runBuildCommands(buildsettings.preGenerateCommands, buildsettings); } } @@ -235,10 +246,10 @@ /** Runs post-build commands and copies required files to the binary directory. */ -void finalizeGeneration(in BuildSettings buildsettings, bool generate_binary) +private void finalizeGeneration(string pack, in BuildSettings buildsettings, bool generate_binary) { if (buildsettings.postGenerateCommands.length) { - logInfo("Running post-generate commands..."); + logInfo("Running post-generate commands for %s...", pack); runBuildCommands(buildsettings.postGenerateCommands, buildsettings); } @@ -247,7 +258,7 @@ mkdirRecurse(buildsettings.targetPath); if (buildsettings.copyFiles.length) { - logInfo("Copying files..."); + logInfo("Copying files for %s...", pack); foreach (f; buildsettings.copyFiles) { auto src = Path(f); auto dst = Path(buildsettings.targetPath) ~ Path(f).head; diff --git a/source/dub/generators/visuald.d b/source/dub/generators/visuald.d index e9e52c6..75ac0a8 100644 --- a/source/dub/generators/visuald.d +++ b/source/dub/generators/visuald.d @@ -46,12 +46,10 @@ override void generateTargets(GeneratorSettings settings, in TargetInfo[string] targets) { auto bs = targets[m_project.name].buildSettings; - prepareGeneration(bs); logDebug("About to generate projects for %s, with %s direct dependencies.", m_project.rootPackage.name, m_project.rootPackage.dependencies.length); generateProjectFiles(settings, targets); generateSolutionFile(settings, targets); logInfo("VisualD project generated."); - finalizeGeneration(bs, true); } private {