@@ -11,7 +11,7 @@ export module mcpp.build.flags;
1111import std;
1212import mcpp.build.plan;
1313import mcpp.toolchain.detect;
14- import mcpp.xlings ;
14+ import mcpp.toolchain.registry ;
1515
1616export namespace mcpp ::build {
1717
@@ -37,30 +37,8 @@ namespace mcpp::build {
3737
3838namespace {
3939
40- std::filesystem::path derive_c_compiler (const std::filesystem::path& cxxPath) {
41- auto stem = cxxPath.stem ().string ();
42- auto parent = cxxPath.parent_path ();
43- auto ext = cxxPath.extension ();
44-
45- // g++ → gcc, clang++ → clang, x86_64-linux-musl-g++ → x86_64-linux-musl-gcc
46- std::string cc_stem;
47- if (stem.ends_with (" ++" )) {
48- cc_stem = stem.substr (0 , stem.size () - 2 );
49- // g++ → gcc; x86_64-linux-musl-g++ → x86_64-linux-musl-gcc;
50- // clang++ → clang.
51- if (cc_stem == " g" || cc_stem.ends_with (" -g" ))
52- cc_stem += " cc" ; // g → gcc
53- // else clang++ → clang (already correct after stripping ++)
54- } else {
55- cc_stem = stem; // fallback: same as cxx
56- }
57- return parent / (cc_stem + ext.string ());
58- }
59-
6040std::filesystem::path staged_std_bmi_path (const BuildPlan& plan) {
61- if (plan.toolchain .compiler == mcpp::toolchain::CompilerId::Clang)
62- return plan.outputDir / " pcm.cache" / " std.pcm" ;
63- return plan.outputDir / " gcm.cache" / " std.gcm" ;
41+ return mcpp::toolchain::staged_std_bmi_path (plan.toolchain , plan.outputDir );
6442}
6543
6644// Escape a path for embedding in ninja rule strings.
@@ -81,7 +59,7 @@ std::string escape_path(const std::filesystem::path& p) {
8159CompileFlags compute_flags (const BuildPlan& plan) {
8260 CompileFlags f;
8361 f.cxxBinary = plan.toolchain .binaryPath ;
84- f.ccBinary = derive_c_compiler (plan.toolchain . binaryPath );
62+ f.ccBinary = mcpp::toolchain:: derive_c_compiler (plan.toolchain );
8563 f.toolEnv = mcpp::toolchain::compiler_env_prefix (plan.toolchain );
8664
8765 // PIC?
@@ -109,14 +87,13 @@ CompileFlags compute_flags(const BuildPlan& plan) {
10987 }
11088
11189 // Binutils -B flag
112- bool isMuslTc = plan. toolchain . targetTriple . find ( " -musl " ) != std::string::npos ;
113- bool isClang = plan. toolchain . compiler == mcpp::toolchain::CompilerId::Clang ;
90+ bool isMuslTc = mcpp::toolchain::is_musl_target (plan. toolchain ) ;
91+ bool isClang = mcpp::toolchain::is_clang (plan. toolchain ) ;
11492 std::filesystem::path binutilsBin;
11593 if (!isMuslTc && !isClang) {
116- if (auto ar = mcpp::xlings::paths::find_sibling_binary (
117- plan.toolchain .binaryPath , " binutils" , " bin/ar" )) {
118- binutilsBin = ar->parent_path (); // bin/ar → bin/
119- }
94+ auto ar = mcpp::toolchain::archive_tool (plan.toolchain );
95+ if (!ar.empty ())
96+ binutilsBin = ar.parent_path ();
12097 }
12198 std::string b_flag;
12299 if (!binutilsBin.empty ()) {
@@ -125,17 +102,7 @@ CompileFlags compute_flags(const BuildPlan& plan) {
125102 }
126103
127104 // AR binary
128- if (isClang) {
129- auto llvmAr = plan.toolchain .binaryPath .parent_path () / " llvm-ar" ;
130- if (std::filesystem::exists (llvmAr))
131- f.arBinary = llvmAr;
132- } else if (!binutilsBin.empty ()) {
133- f.arBinary = binutilsBin / " ar" ;
134- } else if (isMuslTc) {
135- auto muslAr = plan.toolchain .binaryPath .parent_path () / " x86_64-linux-musl-ar" ;
136- if (std::filesystem::exists (muslAr))
137- f.arBinary = muslAr;
138- }
105+ f.arBinary = mcpp::toolchain::archive_tool (plan.toolchain );
139106
140107 // Opt level (musl ICE workaround)
141108 std::string opt_flag = isMuslTc ? " -Og" : " -O2" ;
0 commit comments