aboutsummaryrefslogtreecommitdiff
path: root/backend/ninja/Ninja.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'backend/ninja/Ninja.cpp')
-rw-r--r--backend/ninja/Ninja.cpp104
1 files changed, 92 insertions, 12 deletions
diff --git a/backend/ninja/Ninja.cpp b/backend/ninja/Ninja.cpp
index f4beeb8..802ffd8 100644
--- a/backend/ninja/Ninja.cpp
+++ b/backend/ninja/Ninja.cpp
@@ -122,6 +122,7 @@ namespace backend
case CVersion::C89: return { ninja::NinjaArg("-std=c89"), ninja::NinjaArg("-pedantic") };
case CVersion::C99: return { ninja::NinjaArg("-std=c99"), ninja::NinjaArg("-pedantic") };
case CVersion::C11: return { ninja::NinjaArg("-std=c11"), ninja::NinjaArg("-pedantic") };
+ case CVersion::C20: return { ninja::NinjaArg("-std=c20"), ninja::NinjaArg("-pedantic") };
}
break;
}
@@ -147,9 +148,12 @@ namespace backend
{
switch(cppVersion)
{
+ case CPPVersion::CPP03: return { ninja::NinjaArg("-std=c++03"), ninja::NinjaArg("-pedantic") };
+ case CPPVersion::CPP98: return { ninja::NinjaArg("-std=c++98"), ninja::NinjaArg("-pedantic") };
case CPPVersion::CPP11: return { ninja::NinjaArg("-std=c++11"), ninja::NinjaArg("-pedantic") };
case CPPVersion::CPP14: return { ninja::NinjaArg("-std=c++14"), ninja::NinjaArg("-pedantic") };
case CPPVersion::CPP17: return { ninja::NinjaArg("-std=c++17"), ninja::NinjaArg("-pedantic") };
+ case CPPVersion::CPP20: return { ninja::NinjaArg("-std=c++20"), ninja::NinjaArg("-pedantic") };
}
break;
}
@@ -158,9 +162,12 @@ namespace backend
switch(cppVersion)
{
// Use /Za flag?
+ case CPPVersion::CPP03: return { ninja::NinjaArg("/std:c++03") };
+ case CPPVersion::CPP98: return { ninja::NinjaArg("/std:c++98") };
case CPPVersion::CPP11: return { ninja::NinjaArg("/std:c++11") };
case CPPVersion::CPP14: return { ninja::NinjaArg("/std:c++14") };
case CPPVersion::CPP17: return { ninja::NinjaArg("/std:c++17") };
+ case CPPVersion::CPP20: return { ninja::NinjaArg("/std:c++20") };
}
break;
}
@@ -372,6 +379,37 @@ namespace backend
return {};
}
+ static ninja::NinjaArg getCompilerCpuFlag(const SibsConfig &config)
+ {
+ // TODO: Also use -mcpu=native on non x86 systems
+ switch(config.getCompiler()) {
+ case Compiler::GCC:
+ case Compiler::MINGW_W64: {
+ switch(config.cpu) {
+ case sibs::CPU_INVALID:
+ case sibs::CPU_BASELINE:
+ return {};
+ case sibs::CPU_NATIVE:
+ return ninja::NinjaArg::createRaw("-march=native");
+ }
+ break;
+ }
+ case Compiler::MSVC: {
+ // msvc doesn't have any equivalent to gcc -march=native.
+ // TODO: Detect features at runtime here to manually add the cpu feature flags instead
+ switch(config.cpu) {
+ case sibs::CPU_INVALID:
+ case sibs::CPU_BASELINE:
+ return {};
+ case sibs::CPU_NATIVE:
+ return ninja::NinjaArg::createRaw("-march=native");
+ }
+ break;
+ }
+ }
+ return {};
+ }
+
static vector<ninja::NinjaArg> getCompilerOptimizationFlags(const SibsConfig &config)
{
switch (config.getCompiler())
@@ -802,8 +840,14 @@ namespace backend
// TODO: Allow configuring default linking flags. Maybe have `package.useThreads = false` to disable this flag
string allLinkerFlags;
- if(isSamePlatformFamily(config.platform, PLATFORM_LINUX))
- allLinkerFlags = "-pthread";
+
+ if(config.linker == "mold")
+ allLinkerFlags += " -B/usr/lib/mold/";
+ else if(!config.linker.empty())
+ allLinkerFlags += " -fuse-ld=" + config.linker;
+
+ if(isSamePlatformFamily(config.platform, PLATFORM_POSIX))
+ allLinkerFlags += " -pthread";
// TODO: Somehow check loading order, because it has to be correct to work.. Or does it for dynamic libraries?
// Anyways it's required for static libraries
@@ -1000,13 +1044,21 @@ namespace backend
vector<ninja::NinjaArg> optimizationFlags = getCompilerOptimizationFlags(config);
compileCCommand.insert(compileCCommand.end(), optimizationFlags.begin(), optimizationFlags.end());
+ for(auto &optFlag : optimizationFlags) {
+ allLinkerFlags += " " + optFlag.arg;
+ }
+
+ ninja::NinjaArg cpuFlag = getCompilerCpuFlag(config);
+ if(cpuFlag.type != ninja::NinjaArg::Type::NONE)
+ compileCCommand.push_back(std::move(cpuFlag));
+
ninja::NinjaArg sanitizerFlag = getCompilerSanitizerFlag(config);
if(sanitizerFlag.type != ninja::NinjaArg::Type::NONE)
compileCCommand.push_back(std::move(sanitizerFlag));
compileCppCommand = compileCCommand;
compileCppCommand.insert(compileCppCommand.end(), {
- ninja::NinjaArg("-fexceptions"),
+ ninja::NinjaArg(config.enableExceptions ? "-fexceptions" : "-fno-exceptions"),
ninja::NinjaArg("-Wnon-virtual-dtor")
});
@@ -1054,6 +1106,14 @@ namespace backend
vector<ninja::NinjaArg> optimizationFlags = getCompilerOptimizationFlags(config);
compileCCommand.insert(compileCCommand.end(), optimizationFlags.begin(), optimizationFlags.end());
+ for(auto &optFlag : optimizationFlags) {
+ allLinkerFlags += " " + optFlag.arg;
+ }
+
+ ninja::NinjaArg cpuFlag = getCompilerCpuFlag(config);
+ if(cpuFlag.type != ninja::NinjaArg::Type::NONE)
+ compileCCommand.push_back(std::move(cpuFlag));
+
ninja::NinjaArg sanitizerFlag = getCompilerSanitizerFlag(config);
if(sanitizerFlag.type != ninja::NinjaArg::Type::NONE)
compileCCommand.push_back(std::move(sanitizerFlag));
@@ -1304,6 +1364,7 @@ namespace backend
case LibraryType::EXECUTABLE:
{
vector<ninja::NinjaArg> buildExeArgs;
+ vector<ninja::NinjaArg> lastBuildExeArgs;
string executableName = config.getPackageName();
if(isSamePlatformFamily(config.platform, PLATFORM_WIN))
executableName += ".exe";
@@ -1374,7 +1435,7 @@ namespace backend
#else
if(!isSamePlatformFamily(config.platform, PLATFORM_WIN))
{
- buildExeArgs.insert(buildExeArgs.end(), {
+ lastBuildExeArgs.insert(lastBuildExeArgs.end(), {
ninja::NinjaArg::createRaw("-ldl"),
ninja::NinjaArg::createRaw("-lm")
});
@@ -1417,6 +1478,8 @@ namespace backend
if (!allLinkerFlags.empty())
buildExeArgs.push_back(ninja::NinjaArg::createRaw(allLinkerFlags));
+ buildExeArgs.insert(buildExeArgs.end(), lastBuildExeArgs.begin(), lastBuildExeArgs.end());
+
buildExeArgs.push_back(ninja::NinjaArg::createRaw(packagingFlags));
if(config.getCompiler() == Compiler::MINGW_W64)
{
@@ -1526,6 +1589,7 @@ namespace backend
case LibraryType::DYNAMIC:
{
vector<ninja::NinjaArg> buildDynamicArgs;
+ vector<ninja::NinjaArg> lastBuildDynamicArgs;
string generatedFile;
switch (config.getCompiler())
{
@@ -1606,7 +1670,7 @@ namespace backend
#else
if(!isSamePlatformFamily(config.platform, PLATFORM_WIN))
{
- buildDynamicArgs.insert(buildDynamicArgs.end(), {
+ lastBuildDynamicArgs.insert(lastBuildDynamicArgs.end(), {
ninja::NinjaArg::createRaw("-ldl"),
ninja::NinjaArg::createRaw("-lm")
});
@@ -1648,6 +1712,8 @@ namespace backend
if (!allLinkerFlags.empty())
buildDynamicArgs.push_back(ninja::NinjaArg::createRaw(allLinkerFlags));
+ buildDynamicArgs.insert(buildDynamicArgs.end(), lastBuildDynamicArgs.begin(), lastBuildDynamicArgs.end());
+
buildDynamicArgs.push_back(ninja::NinjaArg::createRaw(packagingFlags));
if(config.getCompiler() == Compiler::MINGW_W64)
{
@@ -1690,13 +1756,15 @@ namespace backend
if (fileOverwriteResult.isErr())
return fileOverwriteResult;
- Result<bool> buildResult = compile(savePath);
- if (!buildResult)
- return buildResult;
+ if(!config.skipCompile) {
+ Result<bool> buildResult = compile(savePath);
+ if (!buildResult)
+ return buildResult;
+ }
if((config.isMainProject() && !config.shouldBuildTests()) || config.isTest())
{
- buildResult = buildCompilationDatabase(savePath, config.getProjectPath());
+ Result<bool> buildResult = buildCompilationDatabase(savePath, config.getProjectPath());
if(!buildResult)
return buildResult;
}
@@ -1735,8 +1803,13 @@ namespace backend
SibsTestConfig sibsTestConfig(config.getCompiler(), testSourceDirNative.data, config.getOptimizationLevel());
sibsTestConfig.platform = config.platform;
sibsTestConfig.setSanitize(config.getSanitize());
- sibsTestConfig.zigTestFiles = move(config.zigTestFiles);
+ sibsTestConfig.cpu = config.cpu;
+ sibsTestConfig.zigTestFiles = config.zigTestFiles;
sibsTestConfig.zigTestAllFiles = config.zigTestAllFiles;
+ sibsTestConfig.cVersion = config.cVersion;
+ sibsTestConfig.cppVersion = config.cppVersion;
+ sibsTestConfig.linker = config.linker;
+ sibsTestConfig.skipCompile = config.skipCompile;
if(projectConfFileType == FileType::REGULAR)
{
Result<bool> result = Config::readFromFile(projectConfFilePath.data.c_str(), sibsTestConfig);
@@ -1818,9 +1891,16 @@ namespace backend
if (!buildFileResult)
return buildFileResult;
- if(!zigTest)
+ if(!zigTest && !config.testsBuildOnly)
{
- Result<ExecResult> runTestResult = exec({ Path(buildPath).join(toFileString(sibsTestConfig.getPackageName())).data }, true);
+ FileString executableName = toFileString(sibsTestConfig.getPackageName());
+ if(isSamePlatformFamily(sibsTestConfig.platform, PLATFORM_WIN))
+ executableName += TINYDIR_STRING(".exe");
+
+ std::vector<FileString> args = { Path(buildPath).join(executableName).data };
+ args.insert(args.end(), config.testRunArgs.begin(), config.testRunArgs.end());
+
+ Result<ExecResult> runTestResult = exec(args, true);
if(!runTestResult)
return Result<bool>::Err(runTestResult);