diff options
Diffstat (limited to 'src/tools.cc')
| -rw-r--r-- | src/tools.cc | 151 |
1 files changed, 84 insertions, 67 deletions
diff --git a/src/tools.cc b/src/tools.cc index dfabdff..e9c9b33 100644 --- a/src/tools.cc +++ b/src/tools.cc @@ -51,6 +51,7 @@ std::ostream& operator<<(std::ostream& stream, const ctor::cxx_opt& opt) case ctor::cxx_opt::warn_shadow: stream << "ctor::cxx_opt::warn_shadow"; break; case ctor::cxx_opt::warn_extra: stream << "ctor::cxx_opt::warn_extra"; break; case ctor::cxx_opt::warnings_as_errors: stream << "ctor::cxx_opt::warnings_as_errors"; break; + case ctor::cxx_opt::exceptions: stream << "ctor::cxx_opt::exceptions"; break; case ctor::cxx_opt::generate_dep_tree: stream << "ctor::cxx_opt::generate_dep_tree"; break; case ctor::cxx_opt::no_link: stream << "ctor::cxx_opt::no_link"; break; case ctor::cxx_opt::include_path: stream << "ctor::cxx_opt::include_path"; break; @@ -112,7 +113,7 @@ std::ostream& operator<<(std::ostream& stream, const ctor::asm_opt& opt) return stream; } -ctor::toolchain getToolChain(const std::string& compiler) +ctor::toolchain getToolChain(std::string_view compiler) { std::filesystem::path cc(compiler); auto cc_cmd = cc.stem().string(); @@ -209,7 +210,7 @@ std::string get_arch(ctor::output_system system) return arch; } -ctor::arch get_arch(const std::string& str) +ctor::arch get_arch(std::string_view str) { // gcc -v 2>&1 | grep Target // Target: x86_64-apple-darwin19.6.0 @@ -244,24 +245,24 @@ ctor::arch get_arch(const std::string& str) return ctor::arch::unknown; } -ctor::c_flag c_option(const std::string& flag) +ctor::c_flag c_option(std::string_view flag) { if(flag.starts_with("-I")) { - std::string path = flag.substr(2); + std::string path(flag.substr(2)); path.erase(0, path.find_first_not_of(' ')); return { ctor::c_opt::include_path, path }; } if(flag.starts_with("-std=")) { - std::string std = flag.substr(5); + auto std = flag.substr(5); return { ctor::c_opt::c_std, std }; } if(flag.starts_with("-O")) { - std::string opt = flag.substr(2, 1); + auto opt = flag.substr(2, 1); return { ctor::c_opt::optimization, opt }; } @@ -297,7 +298,7 @@ ctor::c_flag c_option(const std::string& flag) if(flag.starts_with("-D")) { - std::string def = flag.substr(2); + auto def = flag.substr(2); auto pos = def.find('='); if(pos != def.npos) { @@ -311,24 +312,24 @@ ctor::c_flag c_option(const std::string& flag) return { ctor::c_opt::custom, flag }; } -ctor::cxx_flag cxx_option(const std::string& flag) +ctor::cxx_flag cxx_option(std::string_view flag) { if(flag.starts_with("-I")) { - std::string path = flag.substr(2); + std::string path(flag.substr(2)); path.erase(0, path.find_first_not_of(' ')); return { ctor::cxx_opt::include_path, path }; } if(flag.starts_with("-std=")) { - std::string std = flag.substr(5); + auto std = flag.substr(5); return { ctor::cxx_opt::cpp_std, std }; } if(flag.starts_with("-O")) { - std::string opt = flag.substr(2, 1); + auto opt = flag.substr(2, 1); return { ctor::cxx_opt::optimization, opt }; } @@ -357,6 +358,11 @@ ctor::cxx_flag cxx_option(const std::string& flag) return { ctor::cxx_opt::warn_extra}; } + if(flag.starts_with("-fexceptions")) + { + return { ctor::cxx_opt::exceptions}; + } + if(flag.starts_with("-g")) { return { ctor::cxx_opt::debug }; @@ -364,7 +370,7 @@ ctor::cxx_flag cxx_option(const std::string& flag) if(flag.starts_with("-D")) { - std::string def = flag.substr(2); + auto def = flag.substr(2); auto pos = def.find('='); if(pos != def.npos) { @@ -379,11 +385,11 @@ ctor::cxx_flag cxx_option(const std::string& flag) return { ctor::cxx_opt::custom, flag }; } -ctor::ld_flag ld_option(const std::string& flag) +ctor::ld_flag ld_option(std::string_view flag) { if(flag.starts_with("-L")) { - std::string path = flag.substr(2); + std::string path(flag.substr(2)); path.erase(0, path.find_first_not_of(' ')); return { ctor::ld_opt::library_path, path }; } @@ -396,18 +402,18 @@ ctor::ld_flag ld_option(const std::string& flag) return { ctor::ld_opt::custom, flag }; } -ctor::ar_flag ar_option(const std::string& flag) +ctor::ar_flag ar_option(std::string_view flag) { return { ctor::ar_opt::custom, flag }; } -std::vector<std::string> cxx_option(ctor::cxx_opt opt, const std::string& arg, - const std::string& arg2) +std::vector<std::string> cxx_option(ctor::cxx_opt opt, std::string_view arg, + std::string_view arg2) { switch(opt) { case ctor::cxx_opt::output: - return {"-o", arg}; + return {"-o", std::string(arg)}; case ctor::cxx_opt::debug: return {"-g"}; case ctor::cxx_opt::warn_all: @@ -420,16 +426,18 @@ std::vector<std::string> cxx_option(ctor::cxx_opt opt, const std::string& arg, return {"-Wextra"}; case ctor::cxx_opt::warnings_as_errors: return {"-Werror"}; + case ctor::cxx_opt::exceptions: + return {"-fexceptions"}; case ctor::cxx_opt::generate_dep_tree: return {"-MMD"}; case ctor::cxx_opt::no_link: return {"-c"}; case ctor::cxx_opt::include_path: - return {"-I" + arg}; + return {"-I" + std::string(arg)}; case ctor::cxx_opt::cpp_std: - return {"-std=" + arg}; + return {"-std=" + std::string(arg)}; case ctor::cxx_opt::optimization: - return {"-O" + arg}; + return {"-O" + std::string(arg)}; case ctor::cxx_opt::position_independent_code: return {"-fPIC"}; case ctor::cxx_opt::position_independent_executable: @@ -437,9 +445,9 @@ std::vector<std::string> cxx_option(ctor::cxx_opt opt, const std::string& arg, case ctor::cxx_opt::define: if(!arg2.empty()) { - return {"-D" + arg + "=" + arg2}; + return {"-D" + std::string(arg) + "=" + std::string(arg2)}; } - return {"-D" + arg}; + return {"-D" + std::string(arg)}; case ctor::cxx_opt::custom: return argsplit(arg); } @@ -448,13 +456,13 @@ std::vector<std::string> cxx_option(ctor::cxx_opt opt, const std::string& arg, return {}; } -std::vector<std::string> c_option(ctor::c_opt opt, const std::string& arg, - const std::string& arg2) +std::vector<std::string> c_option(ctor::c_opt opt, std::string_view arg, + std::string_view arg2) { switch(opt) { case ctor::c_opt::output: - return {"-o", arg}; + return {"-o", std::string(arg)}; case ctor::c_opt::debug: return {"-g"}; case ctor::c_opt::warn_all: @@ -472,11 +480,11 @@ std::vector<std::string> c_option(ctor::c_opt opt, const std::string& arg, case ctor::c_opt::no_link: return {"-c"}; case ctor::c_opt::include_path: - return {"-I" + arg}; + return {"-I" + std::string(arg)}; case ctor::c_opt::c_std: - return {"-std=" + arg}; + return {"-std=" + std::string(arg)}; case ctor::c_opt::optimization: - return {"-O" + arg}; + return {"-O" + std::string(arg)}; case ctor::c_opt::position_independent_code: return {"-fPIC"}; case ctor::c_opt::position_independent_executable: @@ -484,9 +492,9 @@ std::vector<std::string> c_option(ctor::c_opt opt, const std::string& arg, case ctor::c_opt::define: if(!arg2.empty()) { - return {"-D" + arg + "=" + arg2}; + return {"-D" + std::string(arg) + "=" + std::string(arg2)}; } - return {"-D" + arg}; + return {"-D" + std::string(arg)}; case ctor::c_opt::custom: return argsplit(arg); } @@ -495,23 +503,23 @@ std::vector<std::string> c_option(ctor::c_opt opt, const std::string& arg, return {}; } -std::vector<std::string> ld_option(ctor::ld_opt opt, const std::string& arg, - [[maybe_unused]]const std::string& arg2) +std::vector<std::string> ld_option(ctor::ld_opt opt, std::string_view arg, + [[maybe_unused]]std::string_view arg2) { switch(opt) { case ctor::ld_opt::output: - return {"-o", arg}; + return {"-o", std::string(arg)}; case ctor::ld_opt::warn_all: return {"-Wall"}; case ctor::ld_opt::warnings_as_errors: return {"-Werror"}; case ctor::ld_opt::library_path: - return {"-L" + arg}; + return {"-L" + std::string(arg)}; case ctor::ld_opt::link: - return {"-l" + arg}; + return {"-l" + std::string(arg)}; case ctor::ld_opt::cpp_std: - return {"-std=" + arg}; + return {"-std=" + std::string(arg)}; case ctor::ld_opt::build_shared: return {"-shared"}; case ctor::ld_opt::threads: @@ -528,8 +536,8 @@ std::vector<std::string> ld_option(ctor::ld_opt opt, const std::string& arg, return {}; } -std::vector<std::string> ar_option(ctor::ar_opt opt, const std::string& arg, - [[maybe_unused]]const std::string& arg2) +std::vector<std::string> ar_option(ctor::ar_opt opt, std::string_view arg, + [[maybe_unused]]std::string_view arg2) { switch(opt) { @@ -540,7 +548,7 @@ std::vector<std::string> ar_option(ctor::ar_opt opt, const std::string& arg, case ctor::ar_opt::create: return {"-c"}; case ctor::ar_opt::output: - return {arg}; + return {std::string(arg)}; case ctor::ar_opt::custom: return argsplit(arg); } @@ -549,8 +557,8 @@ std::vector<std::string> ar_option(ctor::ar_opt opt, const std::string& arg, return {}; } -std::vector<std::string> asm_option(ctor::asm_opt opt, const std::string& arg, - [[maybe_unused]]const std::string& arg2) +std::vector<std::string> asm_option(ctor::asm_opt opt, std::string_view arg, + [[maybe_unused]]std::string_view arg2) { switch(opt) { @@ -578,7 +586,7 @@ std::string get_arch(ctor::output_system system) return {}; } -ctor::arch get_arch(ctor::output_system system, const std::string& str) +ctor::arch get_arch(ctor::output_system system, std::string_view str) { auto toolchain = getToolChain(system); switch(toolchain) @@ -595,8 +603,8 @@ ctor::arch get_arch(ctor::output_system system, const std::string& str) std::vector<std::string> c_option(ctor::toolchain toolchain, ctor::c_opt opt, - const std::string& arg, - const std::string& arg2) + std::string_view arg, + std::string_view arg2) { switch(toolchain) { @@ -628,8 +636,8 @@ std::vector<std::string> c_option(ctor::toolchain toolchain, std::vector<std::string> cxx_option(ctor::toolchain toolchain, ctor::cxx_opt opt, - const std::string& arg, - const std::string& arg2) + std::string_view arg, + std::string_view arg2) { switch(toolchain) { @@ -661,8 +669,8 @@ std::vector<std::string> cxx_option(ctor::toolchain toolchain, std::vector<std::string> ld_option(ctor::toolchain toolchain, ctor::ld_opt opt, - const std::string& arg, - const std::string& arg2) + std::string_view arg, + std::string_view arg2) { switch(toolchain) { @@ -694,8 +702,8 @@ std::vector<std::string> ld_option(ctor::toolchain toolchain, std::vector<std::string> ar_option(ctor::toolchain toolchain, ctor::ar_opt opt, - const std::string& arg, - const std::string& arg2) + std::string_view arg, + std::string_view arg2) { switch(toolchain) { @@ -727,8 +735,8 @@ std::vector<std::string> ar_option(ctor::toolchain toolchain, std::vector<std::string> asm_option(ctor::toolchain toolchain, ctor::asm_opt opt, - const std::string& arg, - const std::string& arg2) + std::string_view arg, + std::string_view arg2) { switch(toolchain) { @@ -759,7 +767,7 @@ std::vector<std::string> asm_option(ctor::toolchain toolchain, } -ctor::c_flag c_option(const std::string& flag, ctor::toolchain toolchain) +ctor::c_flag c_option(std::string_view flag, ctor::toolchain toolchain) { switch(toolchain) { @@ -774,7 +782,7 @@ ctor::c_flag c_option(const std::string& flag, ctor::toolchain toolchain) return { ctor::c_opt::custom, flag }; } -ctor::cxx_flag cxx_option(const std::string& flag, ctor::toolchain toolchain) +ctor::cxx_flag cxx_option(std::string_view flag, ctor::toolchain toolchain) { switch(toolchain) { @@ -789,7 +797,7 @@ ctor::cxx_flag cxx_option(const std::string& flag, ctor::toolchain toolchain) return { ctor::cxx_opt::custom, flag }; } -ctor::ld_flag ld_option(const std::string& flag, ctor::toolchain toolchain) +ctor::ld_flag ld_option(std::string_view flag, ctor::toolchain toolchain) { switch(toolchain) { @@ -804,7 +812,7 @@ ctor::ld_flag ld_option(const std::string& flag, ctor::toolchain toolchain) return { ctor::ld_opt::custom, flag }; } -ctor::ar_flag ar_option(const std::string& flag, ctor::toolchain toolchain) +ctor::ar_flag ar_option(std::string_view flag, ctor::toolchain toolchain) { switch(toolchain) { @@ -819,7 +827,7 @@ ctor::ar_flag ar_option(const std::string& flag, ctor::toolchain toolchain) return { ctor::ar_opt::custom, flag }; } -ctor::asm_flag asm_option(const std::string& flag, ctor::toolchain toolchain) +ctor::asm_flag asm_option(std::string_view flag, ctor::toolchain toolchain) { switch(toolchain) { @@ -896,7 +904,7 @@ std::vector<std::string> to_strings(ctor::toolchain toolchain, } namespace { -ctor::toolchain guess_toolchain(const std::string& opt) +ctor::toolchain guess_toolchain(std::string_view opt) { if(opt.empty()) { @@ -916,32 +924,33 @@ ctor::toolchain guess_toolchain(const std::string& opt) } } + template<> -ctor::flag<ctor::c_opt>::flag(const char* str) +void ctor::flag<ctor::c_opt>::to_flag(std::string_view str) { *this = c_option(str, guess_toolchain(str)); } template<> -ctor::flag<ctor::cxx_opt>::flag(const char* str) +void ctor::flag<ctor::cxx_opt>::to_flag(std::string_view str) { *this = cxx_option(str, guess_toolchain(str)); } template<> -ctor::flag<ctor::ld_opt>::flag(const char* str) +void ctor::flag<ctor::ld_opt>::to_flag(std::string_view str) { *this = ld_option(str, guess_toolchain(str)); } template<> -ctor::flag<ctor::ar_opt>::flag(const char* str) +void ctor::flag<ctor::ar_opt>::to_flag(std::string_view str) { *this = ar_option(str, guess_toolchain(str)); } template<> -ctor::flag<ctor::asm_opt>::flag(const char* str) +void ctor::flag<ctor::asm_opt>::to_flag(std::string_view str) { *this = asm_option(str, guess_toolchain(str)); } @@ -965,7 +974,14 @@ ctor::target_type target_type_from_extension(ctor::toolchain toolchain, if(ext == ".so" || ext == ".dylib") { - return ctor::target_type::dynamic_library; + if(file.filename().string().substr(0, 3) != "lib") + { + return ctor::target_type::module; + } + else + { + return ctor::target_type::shared_library; + } } if(ext == ".o") @@ -994,7 +1010,7 @@ ctor::target_type target_type_from_extension(ctor::toolchain toolchain, if(ext == ".dll") { - return ctor::target_type::dynamic_library; + return ctor::target_type::shared_library; } if(ext == ".obj") @@ -1078,7 +1094,8 @@ std::filesystem::path extension(ctor::toolchain toolchain, break; } break; - case ctor::target_type::dynamic_library: + case ctor::target_type::shared_library: + case ctor::target_type::module: switch(arch) { case ctor::arch::unix: |
