Skip to content

Commit

Permalink
Merge pull request atilaneves#204 from atilaneves/delete-dub-default-…
Browse files Browse the repository at this point in the history
…reggaefile

Delete dub default reggaefile
  • Loading branch information
atilaneves authored Aug 11, 2023
2 parents f2e76ee + 3944ac0 commit 435516e
Show file tree
Hide file tree
Showing 10 changed files with 201 additions and 151 deletions.
10 changes: 4 additions & 6 deletions .github/workflows/d.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ jobs:
os: [ubuntu-22.04, windows-2019]
# Remember to change the compiler versions further below as well as here
dc:
- dmd-2.104.1
- ldc-1.32.2
- dmd-2.105.0
- ldc-1.33.0

runs-on: ${{ matrix.os }}
steps:
Expand Down Expand Up @@ -68,10 +68,8 @@ jobs:
matrix:
os: [ubuntu-22.04, macos-12, windows-2022]
dc:
- dmd-2.103.1
- dmd-2.100.0
- ldc-1.32.2
- ldc-1.30.0
- dmd-2.105.0
- ldc-1.33.0
runs-on: ${{ matrix.os }}
defaults:
run:
Expand Down
6 changes: 5 additions & 1 deletion payload/reggae/options.d
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,11 @@ struct Options {
}

string[] reggaeFileDependencies() @safe const {
return [ranFromPath, reggaeFilePath] ~ getReggaeFileDependenciesDlang ~ dependencies;
import std.file: exists;
auto maybeReggaeFile = reggaeFilePath.exists
? [reggaeFilePath]
: [];
return ranFromPath ~ maybeReggaeFile ~ getReggaeFileDependenciesDlang ~ dependencies;
}

bool isJsonBuild() @safe const {
Expand Down
82 changes: 64 additions & 18 deletions payload/reggae/rules/dub.d
Original file line number Diff line number Diff line change
Expand Up @@ -38,16 +38,35 @@ static if(isDubProject) {
CompilationMode compilationMode = CompilationMode.options)
()
{
enum config = "default";
enum dubInfo = configToDubInfo[config];
enum targetName = dubInfo.targetName;
enum linkerFlags = dubInfo.mainLinkerFlags ~ linkerFlags.value;
import reggae.config: options;

return dubDefaultTarget(
options,
configToDubInfo,
compilerFlags,
linkerFlags,
compilationMode
);
}

Target dubDefaultTarget(C)(
in imported!"reggae.options".Options options,
in C configToDubInfo,
CompilerFlags compilerFlags = CompilerFlags(),
LinkerFlags linkerFlags = LinkerFlags(),
CompilationMode compilationMode = CompilationMode.options)
{
const config = "default";
const dubInfo = configToDubInfo[config];
const targetName = dubInfo.targetName;
const allLinkerFlags = dubInfo.mainLinkerFlags ~ linkerFlags.value;

return dubTarget(
options,
targetName,
dubInfo,
compilerFlags.value,
linkerFlags,
allLinkerFlags,
compilationMode,
);
}
Expand Down Expand Up @@ -79,7 +98,26 @@ static if(isDubProject) {
CompilationMode compilationMode)
()
{
import reggae.config: options;
return dubTestTarget(
options,
configToDubInfo,
compilerFlags,
linkerFlags,
compilationMode
);
}

Target dubTestTarget(C)
(in imported!"reggae.options".Options options,
in C configToDubInfo,
CompilerFlags compilerFlags = CompilerFlags(),
LinkerFlags linkerFlags = LinkerFlags(),
CompilationMode compilationMode = CompilationMode.options)
{
import reggae.build : Target;
import reggae.dub.info: TargetType, targetName;
import reggae.rules.dub: dubTarget;
import std.exception : enforce;

// No `dub test` config? Then it inherited some `targetType "none"`, and
Expand All @@ -102,7 +140,8 @@ static if(isDubProject) {
name = targetName(TargetType.executable, "ut");
}

return dubTarget(name,
return dubTarget(options,
name,
dubInfo,
compilerFlags.value,
linkerFlags.value,
Expand All @@ -120,8 +159,12 @@ static if(isDubProject) {
)
() if(isCallable!objsFunction)
{
import reggae.config: options;

const dubInfo = configToDubInfo[config.value];
return dubTarget(dubInfo.targetName,

return dubTarget(options,
dubInfo.targetName,
dubInfo,
compilerFlags.value,
linkerFlags.value,
Expand All @@ -139,17 +182,21 @@ static if(isDubProject) {
)
()
{
return dubTarget(targetName,
configToDubInfo[config.value],
compilerFlags.value,
linkerFlags.value,
compilationMode,
objsFunction(),
);
}
import reggae.config: options;

return dubTarget(
options,
targetName,
configToDubInfo[config.value],
compilerFlags.value,
linkerFlags.value,
compilationMode,
objsFunction(),
);
}

Target dubTarget(
in imported!"reggae.options".Options options,
in TargetName targetName,
in DubInfo dubInfo,
in string[] compilerFlags,
Expand All @@ -159,7 +206,6 @@ static if(isDubProject) {
in size_t startingIndex = 0,
)
{
import reggae.config: options;
import reggae.rules.common: staticLibraryTarget, link;
import reggae.types: TargetName;
import std.path: relativePath, buildPath;
Expand Down Expand Up @@ -300,7 +346,7 @@ static if(isDubProject) {
}


private Target[] objs(in TargetName targetName,
/*private*/ Target[] objs(in TargetName targetName,
in DubInfo dubInfo,
in string[] compilerFlags,
in CompilationMode compilationMode,
Expand All @@ -320,7 +366,7 @@ static if(isDubProject) {
return allObjs;
}

private string realName(in TargetName targetName, in DubInfo dubInfo) {
/*private*/ string realName(in TargetName targetName, in DubInfo dubInfo) {

import std.path: buildPath;

Expand Down
118 changes: 61 additions & 57 deletions src/reggae/dub/interop/package.d
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@ import reggae.from;
public import reggae.dub.interop.reggaefile;


private from!"reggae.dub.info".DubInfo[string] gDubInfos;


void writeDubConfig(O)(ref O output,
in from!"reggae.options".Options options,
from!"std.stdio".File file) {
Expand All @@ -27,34 +24,44 @@ void writeDubConfig(O)(ref O output,
return;
}

// must check for dub.selections.json before creating dub instance
const dubSelectionsJson = ensureDubSelectionsJson(output, options);

auto dub = Dub(options);
auto dubInfos = dubInfos(output, options);

dubFetch(output, dub, options, dubSelectionsJson);
const targetType = dubInfos["default"].packages.length
? dubInfos["default"].packages[0].targetType
: TargetType.sourceLibrary;

file.writeln("import reggae.dub.info;");
file.writeln("enum isDubProject = true;");

output.log(" Getting dub build information");
auto dubInfo = getDubInfo(output, dub, options);
output.log(" Got dub build information");

const targetType = dubInfo.packages.length
? dubInfo.packages[0].targetType
: TargetType.sourceLibrary;

file.writeln(`const configToDubInfo = assocList([`);

const keys = () @trusted { return gDubInfos.keys; }();
foreach(config; keys) {
file.writeln(` assocEntry("`, config, `", `, gDubInfos[config], `),`);
foreach(k, v; dubInfos) {
file.writeln(` assocEntry("`, k, `", `, v, `),`);
}
file.writeln(`]);`);

file.writeln;
}

auto dubInfos(O)(ref O output,
in from!"reggae.options".Options options) {
import reggae.io: log;
import reggae.dub.info: TargetType;
import reggae.dub.interop.fetch: dubFetch;
import reggae.dub.interop.dublib: Dub;

// must check for dub.selections.json before creating dub instance
const dubSelectionsJson = ensureDubSelectionsJson(output, options);

auto dub = Dub(options);

dubFetch(output, dub, options, dubSelectionsJson);

output.log(" Getting dub build information");
auto ret = getDubInfos(output, dub, options);
output.log(" Got dub build information");

return ret;
}

private string ensureDubSelectionsJson
(O)
Expand All @@ -81,60 +88,57 @@ private string ensureDubSelectionsJson
}



private from!"reggae.dub.info".DubInfo getDubInfo
private from!"reggae.dub.info".DubInfo[string] getDubInfos
(O)
(ref O output,
ref from!"reggae.dub.interop.dublib".Dub dub,
in from!"reggae.options".Options options)
{
import reggae.dub.interop: gDubInfos;
import reggae.io: log;
import reggae.path: buildPath;
import reggae.dub.info: DubInfo;
import std.file: exists;
import std.exception: enforce;

version(unittest) gDubInfos = null;

if("default" !in gDubInfos) {

enforce(buildPath(options.projectPath, "dub.selections.json").exists,
"Cannot find dub.selections.json");

auto settings = dub.getGeneratorSettings(options);
const configs = dubConfigurations(output, dub, options, settings);
const haveTestConfig = configs.test != "";
bool atLeastOneConfigOk;
Exception dubInfoFailure;

foreach(config; configs.configurations) {
const isTestConfig = haveTestConfig && config == configs.test;
try {
gDubInfos[config] = handleDubConfig(output, dub, options, settings, config, isTestConfig);
atLeastOneConfigOk = true;
} catch(Exception ex) {
output.log("ERROR: Could not get info for configuration ", config, ": ", ex.msg);
if(dubInfoFailure is null) dubInfoFailure = ex;
}
DubInfo[string] ret;

enforce(buildPath(options.projectPath, "dub.selections.json").exists,
"Cannot find dub.selections.json");

auto settings = dub.getGeneratorSettings(options);
const configs = dubConfigurations(output, dub, options, settings);
const haveTestConfig = configs.test != "";
bool atLeastOneConfigOk;
Exception dubInfoFailure;

foreach(config; configs.configurations) {
const isTestConfig = haveTestConfig && config == configs.test;
try {
ret[config] = handleDubConfig(output, dub, options, settings, config, isTestConfig);
atLeastOneConfigOk = true;
} catch(Exception ex) {
output.log("ERROR: Could not get info for configuration ", config, ": ", ex.msg);
if(dubInfoFailure is null) dubInfoFailure = ex;
}
}

if(!atLeastOneConfigOk) {
assert(dubInfoFailure !is null,
"Internal error: no configurations worked and no exception to throw");
throw dubInfoFailure;
}
if(!atLeastOneConfigOk) {
assert(dubInfoFailure !is null,
"Internal error: no configurations worked and no exception to throw");
throw dubInfoFailure;
}

gDubInfos["default"] = gDubInfos[configs.default_];
ret["default"] = ret[configs.default_];

// (additionally) expose the special `dub test` config as `unittest` config in the DSL (`configToDubInfo`)
// (for `dubTestTarget!()`, `dubConfigurationTarget!(Configuration("unittest"))` etc.)
if(haveTestConfig && configs.test != "unittest" && configs.test in gDubInfos)
gDubInfos["unittest"] = gDubInfos[configs.test];
}
// (additionally) expose the special `dub test` config as `unittest` config in the DSL (`configToDubInfo`)
// (for `dubTestTarget!()`, `dubConfigurationTarget!(Configuration("unittest"))` etc.)
if(haveTestConfig && configs.test != "unittest" && configs.test in ret)
ret["unittest"] = ret[configs.test];

return gDubInfos["default"];
return ret;
}


private from!"reggae.dub.interop.configurations".DubConfigurations
dubConfigurations
(O)
Expand Down
Loading

0 comments on commit 435516e

Please sign in to comment.