This commit is contained in:
parent
7ff426b2f0
commit
a25b0a1ded
5 changed files with 53 additions and 77 deletions
|
|
@ -1,21 +1,5 @@
|
||||||
/*
|
//SPDX-License-Identifier: LGPL-3.0-only
|
||||||
Crafter® Build
|
//SPDX-FileCopyrightText: Copyright (C) 2026 Catcrafts®
|
||||||
Copyright (C) 2026 Catcrafts®
|
|
||||||
Catcrafts.net
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License version 3.0 as published by the Free Software Foundation;
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
module;
|
module;
|
||||||
#if defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc) || defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_w64_mingw32)
|
#if defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc) || defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_w64_mingw32)
|
||||||
|
|
@ -1441,6 +1425,7 @@ ArgQuery Crafter::ApplyStandardArgs(Configuration& cfg, std::span<const std::str
|
||||||
else if (a.starts_with("--target=")) cfg.target = std::string(a.substr(std::string_view("--target=").size()));
|
else if (a.starts_with("--target=")) cfg.target = std::string(a.substr(std::string_view("--target=").size()));
|
||||||
else if (a.starts_with("--march=")) cfg.march = std::string(a.substr(std::string_view("--march=").size()));
|
else if (a.starts_with("--march=")) cfg.march = std::string(a.substr(std::string_view("--march=").size()));
|
||||||
else if (a.starts_with("--mtune=")) cfg.mtune = std::string(a.substr(std::string_view("--mtune=").size()));
|
else if (a.starts_with("--mtune=")) cfg.mtune = std::string(a.substr(std::string_view("--mtune=").size()));
|
||||||
|
else if (a.starts_with("--sysroot=")) cfg.sysroot = std::string(a.substr(std::string_view("--sysroot=").size()));
|
||||||
}
|
}
|
||||||
if (sawLib && cfg.type == ConfigurationType::Executable) cfg.type = ConfigurationType::LibraryStatic;
|
if (sawLib && cfg.type == ConfigurationType::Executable) cfg.type = ConfigurationType::LibraryStatic;
|
||||||
if (sawShared && cfg.type == ConfigurationType::LibraryStatic) cfg.type = ConfigurationType::LibraryDynamic;
|
if (sawShared && cfg.type == ConfigurationType::LibraryStatic) cfg.type = ConfigurationType::LibraryDynamic;
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,6 @@
|
||||||
/*
|
//SPDX-License-Identifier: LGPL-3.0-only
|
||||||
Crafter® Build
|
//SPDX-FileCopyrightText: Copyright (C) 2026 Catcrafts®
|
||||||
Copyright (C) 2026 Catcrafts®
|
|
||||||
Catcrafts.net
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License version 3.0 as published by the Free Software Foundation;
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
module;
|
module;
|
||||||
#if defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc) || defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_w64_mingw32)
|
#if defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc) || defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_w64_mingw32)
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
@ -767,6 +752,13 @@ std::string Crafter::BuildStdPcm(const Configuration& config, fs::path stdPcm) {
|
||||||
stdCppm = "/usr/share/libc++/v1/std.cppm";
|
stdCppm = "/usr/share/libc++/v1/std.cppm";
|
||||||
} else {
|
} else {
|
||||||
stdCppm = std::format("{}/usr/share/libc++/v1/std.cppm", config.sysroot);
|
stdCppm = std::format("{}/usr/share/libc++/v1/std.cppm", config.sysroot);
|
||||||
|
// not every distro ships the std module sources (Alpine's
|
||||||
|
// libc++-dev doesn't); the host copy is interchangeable as long
|
||||||
|
// as the libc++ versions line up, which the compile of the PCM
|
||||||
|
// against the sysroot's headers verifies anyway
|
||||||
|
if (!fs::exists(stdCppm) && fs::exists("/usr/share/libc++/v1/std.cppm")) {
|
||||||
|
stdCppm = "/usr/share/libc++/v1/std.cppm";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
std::string sysrootFlag = config.sysroot.empty()
|
std::string sysrootFlag = config.sysroot.empty()
|
||||||
? std::string()
|
? std::string()
|
||||||
|
|
@ -784,6 +776,13 @@ std::string Crafter::BuildStdPcm(const Configuration& config, fs::path stdPcm) {
|
||||||
if (isWasm) {
|
if (isWasm) {
|
||||||
for (const std::string& f : config.wasmVariantFlags) archFlags += " " + f;
|
for (const std::string& f : config.wasmVariantFlags) archFlags += " " + f;
|
||||||
}
|
}
|
||||||
|
// non-wasm cross builds: the driver ranks the host toolchain's own
|
||||||
|
// libc++ headers (<install>/../include/c++/v1) above --sysroot, so
|
||||||
|
// the PCM would mix host libc++ with the foreign libc — force the
|
||||||
|
// sysroot's copy (same trick as the Windows LIBCXX_DIR path)
|
||||||
|
if (!isWasm && !config.sysroot.empty()) {
|
||||||
|
archFlags += std::format(" -nostdinc++ -isystem {}/usr/include/c++/v1", config.sysroot);
|
||||||
|
}
|
||||||
if(!fs::exists(stdPcm) || fs::last_write_time(stdPcm) < fs::last_write_time(stdCppm)) {
|
if(!fs::exists(stdPcm) || fs::last_write_time(stdPcm) < fs::last_write_time(stdCppm)) {
|
||||||
return RunCommand(std::format("clang++ --target={} -std=c++26 -stdlib=libc++{}{} -O3 -Wno-reserved-identifier -Wno-reserved-module-identifier --precompile {} -o {}", config.target, sysrootFlag, archFlags, stdCppm, stdPcm.string()));
|
return RunCommand(std::format("clang++ --target={} -std=c++26 -stdlib=libc++{}{} -O3 -Wno-reserved-identifier -Wno-reserved-module-identifier --precompile {} -o {}", config.target, sysrootFlag, archFlags, stdCppm, stdPcm.string()));
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,5 @@
|
||||||
/*
|
//SPDX-License-Identifier: LGPL-3.0-only
|
||||||
Crafter® Build
|
//SPDX-FileCopyrightText: Copyright (C) 2026 Catcrafts®
|
||||||
Copyright (C) 2026 Catcrafts®
|
|
||||||
Catcrafts.net
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License version 3.0 as published by the Free Software Foundation;
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
module;
|
module;
|
||||||
export module Crafter.Build:Test_impl;
|
export module Crafter.Build:Test_impl;
|
||||||
|
|
@ -298,7 +282,13 @@ TestRunner TestRunner::ForTarget(const Configuration& cfg) {
|
||||||
// which execvp's its argument list directly without going through a
|
// which execvp's its argument list directly without going through a
|
||||||
// shell. A bare VAR=value would be exec'd as a command path and
|
// shell. A bare VAR=value would be exec'd as a command path and
|
||||||
// fail with "No such file or directory".
|
// fail with "No such file or directory".
|
||||||
r.exec = std::format("env QEMU_LD_PREFIX={} {}", cfg.sysroot, r.exec);
|
// QEMU_LD_PREFIX only redirects the ELF interpreter lookup; the
|
||||||
|
// emulated loader then searches ITS default paths against the
|
||||||
|
// host filesystem, picking up host-arch libraries from /lib —
|
||||||
|
// LD_LIBRARY_PATH steers it back into the sysroot.
|
||||||
|
r.exec = std::format(
|
||||||
|
"env QEMU_LD_PREFIX={0} LD_LIBRARY_PATH={0}/lib:{0}/usr/lib {1}",
|
||||||
|
cfg.sysroot, r.exec);
|
||||||
}
|
}
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
@ -474,6 +464,7 @@ TestBuilder Configuration::AddTest(std::string_view name, std::span<fs::path> in
|
||||||
t.config.target = this->target;
|
t.config.target = this->target;
|
||||||
t.config.march = this->march;
|
t.config.march = this->march;
|
||||||
t.config.mtune = this->mtune;
|
t.config.mtune = this->mtune;
|
||||||
|
t.config.sysroot = this->sysroot;
|
||||||
t.config.debug = this->debug;
|
t.config.debug = this->debug;
|
||||||
t.config.type = ConfigurationType::Executable;
|
t.config.type = ConfigurationType::Executable;
|
||||||
|
|
||||||
|
|
@ -499,6 +490,7 @@ void Configuration::AddMarchVariants(std::string_view name,
|
||||||
t.config.target = this->target;
|
t.config.target = this->target;
|
||||||
t.config.march = tier.march;
|
t.config.march = tier.march;
|
||||||
t.config.mtune = tier.mtune;
|
t.config.mtune = tier.mtune;
|
||||||
|
t.config.sysroot = this->sysroot;
|
||||||
t.config.debug = this->debug;
|
t.config.debug = this->debug;
|
||||||
t.config.type = ConfigurationType::Executable;
|
t.config.type = ConfigurationType::Executable;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,5 @@
|
||||||
/*
|
//SPDX-License-Identifier: LGPL-3.0-only
|
||||||
Crafter® Build
|
//SPDX-FileCopyrightText: Copyright (C) 2026 Catcrafts®
|
||||||
Copyright (C) 2026 Catcrafts®
|
|
||||||
Catcrafts.net
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License version 3.0 as published by the Free Software Foundation;
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
module;
|
module;
|
||||||
#include "Crafter.Build-Api.h"
|
#include "Crafter.Build-Api.h"
|
||||||
|
|
@ -190,10 +174,10 @@ export namespace Crafter {
|
||||||
std::vector<Test> tests;
|
std::vector<Test> tests;
|
||||||
CRAFTER_API void GetInterfacesAndImplementations(std::span<fs::path> interfaces, std::span<fs::path> implementations);
|
CRAFTER_API void GetInterfacesAndImplementations(std::span<fs::path> interfaces, std::span<fs::path> implementations);
|
||||||
// Declare a test. Sources default to `tests/<name>/main.cpp` resolved
|
// Declare a test. Sources default to `tests/<name>/main.cpp` resolved
|
||||||
// against this Configuration's path; target/march/mtune/debug are
|
// against this Configuration's path; target/march/mtune/sysroot/debug
|
||||||
// inherited from this Configuration so cross-arch projects don't have
|
// are inherited from this Configuration so cross-arch projects don't
|
||||||
// to re-specify. Returns a builder for chaining defines, deps, etc.
|
// have to re-specify. Returns a builder for chaining defines, deps,
|
||||||
// Defined in Crafter.Build:Test.
|
// etc. Defined in Crafter.Build:Test.
|
||||||
CRAFTER_API struct TestBuilder AddTest(std::string_view name);
|
CRAFTER_API struct TestBuilder AddTest(std::string_view name);
|
||||||
// Same as AddTest, but compiles the parent's `interfaces` directly
|
// Same as AddTest, but compiles the parent's `interfaces` directly
|
||||||
// into this test's Configuration (rather than going through a dep).
|
// into this test's Configuration (rather than going through a dep).
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,6 @@
|
||||||
|
//SPDX-License-Identifier: LGPL-3.0-only
|
||||||
|
//SPDX-FileCopyrightText: Copyright (C) 2026 Catcrafts®
|
||||||
|
|
||||||
import std;
|
import std;
|
||||||
import Crafter.Build;
|
import Crafter.Build;
|
||||||
using namespace Crafter;
|
using namespace Crafter;
|
||||||
|
|
@ -30,6 +33,19 @@ int main() {
|
||||||
Check(cfg.mtune == "cortex-a72", "--mtune= should overwrite cfg.mtune");
|
Check(cfg.mtune == "cortex-a72", "--mtune= should overwrite cfg.mtune");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --sysroot= sets cfg.sysroot (cross-compiles against a foreign root,
|
||||||
|
// e.g. an Alpine aarch64 tree; also picked up by the std.cppm lookup
|
||||||
|
// and the qemu test-runner's QEMU_LD_PREFIX).
|
||||||
|
{
|
||||||
|
Configuration cfg;
|
||||||
|
std::array<std::string_view, 2> raw = {
|
||||||
|
"--target=aarch64-alpine-linux-musl", "--sysroot=/opt/alpine-aarch64",
|
||||||
|
};
|
||||||
|
ApplyStandardArgs(cfg, raw);
|
||||||
|
Check(cfg.sysroot == "/opt/alpine-aarch64", "--sysroot= should set cfg.sysroot");
|
||||||
|
Check(cfg.target == "aarch64-alpine-linux-musl", "--target= combines with --sysroot=");
|
||||||
|
}
|
||||||
|
|
||||||
// --lib promotes Executable -> LibraryStatic; --shared then promotes to Dynamic.
|
// --lib promotes Executable -> LibraryStatic; --shared then promotes to Dynamic.
|
||||||
{
|
{
|
||||||
Configuration cfg;
|
Configuration cfg;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue