From a5fd0f039fa3d067d641595e4043dd5e8e3c0820 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Fri, 1 Dec 2017 13:08:09 +0200 Subject: [PATCH] Interrogate the compiler for the system path Rather than trying to guesstimate it from the compiler version. --- source/androidcompiler.cpp | 18 ++++++++++++++ source/gnucompiler.cpp | 49 ++++++++++++++++++++++---------------- source/gnucompiler.h | 3 --- 3 files changed, 47 insertions(+), 23 deletions(-) diff --git a/source/androidcompiler.cpp b/source/androidcompiler.cpp index 490c198..53f4de1 100644 --- a/source/androidcompiler.cpp +++ b/source/androidcompiler.cpp @@ -1,9 +1,13 @@ #include #include +#include #include +#include #include "androidcompiler.h" #include "androidtools.h" #include "builder.h" +#include "externaltask.h" +#include "filetarget.h" using namespace std; using namespace Msp; @@ -23,6 +27,20 @@ void AndroidCompiler::do_prepare() GnuCompiler::do_prepare(); if(executable && tag=="CXX") { + ExternalTask::Arguments argv; + argv.push_back(executable->get_path().str()); + argv.push_back("-dumpversion"); + + builder.get_logger().log("auxcommands", format("Running %s", join(argv.begin(), argv.end()))); + string version; + try + { + version = strip(ExternalTask::run_and_capture_output(argv)); + builder.get_logger().log("tools", format("%s version is %s", FS::basename(executable->get_path()), version)); + } + catch(const runtime_error &) + { } + FS::Path libstdcxx_path = ndk.get_root_dir()/"sources"/"cxx-stl"/"gnu-libstdc++"/version; FS::Path public_dir = libstdcxx_path/"include"; diff --git a/source/gnucompiler.cpp b/source/gnucompiler.cpp index ea04fbe..8d0bca7 100644 --- a/source/gnucompiler.cpp +++ b/source/gnucompiler.cpp @@ -1,6 +1,4 @@ #include -#include -#include #include #include #include @@ -54,14 +52,7 @@ GnuCompiler::GnuCompiler(Builder &b, const Architecture &a, const string &t, con set_command((tag=="CXX" ? "g++" : "gcc"), true); if(!sysroot.empty()) - { build_info.sysroot = sysroot; - system_path.push_back(sysroot/"usr/include"); - } - else if(architecture->is_native()) - system_path.push_back("/usr/include"); - else - system_path.push_back("/usr/"+architecture->get_cross_prefix()+"/include"); } Target *GnuCompiler::create_source(const Component &comp, const FS::Path &path) const @@ -116,24 +107,42 @@ void GnuCompiler::do_prepare() { ExternalTask::Arguments argv; argv.push_back(executable->get_path().str()); - argv.push_back("-dumpversion"); + argv.push_back("-Wp,-v"); + argv.push_back("-E"); + if(tag=="CXX") + argv.push_back("-xc++"); + const FS::Path &sysroot = build_info.sysroot; + if(!sysroot.empty()) + argv.push_back("--sysroot="+sysroot.str()); + argv.push_back("-"); + string prog = FS::basename(executable->get_path()); builder.get_logger().log("auxcommands", format("Running %s", join(argv.begin(), argv.end()))); try { - version = strip(ExternalTask::run_and_capture_output(argv)); - builder.get_logger().log("tools", format("%s version is %s", FS::basename(executable->get_path()), version)); - - if(tag=="CXX") + string output = ExternalTask::run_and_capture_output(argv, FS::Path(), true); + string::size_type start = 0; + bool record_path = false; + while(start search starts here:")) + record_path = true; + else if(!output.compare(start, 19, "End of search list.")) + record_path = false; + else if(record_path) + { + FS::Path path = strip(output.substr(start, newline-start)); + builder.get_logger().log("tools", format("Got %s (%s) system path: %s", prog, tag, path)); + system_path.push_back(path); + } + start = newline+1; } } - catch(const runtime_error &) - { } + catch(const runtime_error &e) + { + problems.push_back("Unable to determine system path"); + } } } diff --git a/source/gnucompiler.h b/source/gnucompiler.h index 0eb25d0..4b82e6f 100644 --- a/source/gnucompiler.h +++ b/source/gnucompiler.h @@ -12,9 +12,6 @@ appropriate type. */ class GnuCompiler: public Tool { -protected: - std::string version; - public: GnuCompiler(Builder &, const Architecture &, const std::string &, const Msp::FS::Path & = Msp::FS::Path()); -- 2.43.0