diff options
-rw-r--r-- | Builder.cpp | 39 | ||||
-rw-r--r-- | Builder.h | 4 | ||||
-rw-r--r-- | LanguageSettings.cpp | 2 |
3 files changed, 34 insertions, 11 deletions
diff --git a/Builder.cpp b/Builder.cpp index 57f731e..e74809b 100644 --- a/Builder.cpp +++ b/Builder.cpp @@ -179,6 +179,16 @@ Builder::Builder(const pt::ptree& ptree, const std::string& target): // to prevent creation of .d files in clean() } +// given a compiled compile unit (*.o), find its source file +fs::path Builder::get_compile_unit_source_from_object(const fs::path& path) { + std::vector<fs::path> source_files{dependencies_of(path)}; + auto it{std::find_if(source_files.begin(), source_files.end(), is_compile_unit_source_by_extension)}; + if (it == source_files.end()) { + throw std::runtime_error(fmt::format("No source file found for {}", path.string())); + } + return *it; +} + std::vector<fs::path> Builder::dependencies_of(const fs::path& p) const { try { @@ -197,10 +207,26 @@ std::vector<std::string> Builder::link_libs_of(const fs::path& p) const } } -std::vector<fs::path> Builder::include_paths_of(const fs::path& p) const +fs::path Builder::target_from_object(const fs::path& object) const +{ + for (const auto& target: _all_targets) { + const auto& deps{dependencies_of(target)}; + auto it{std::find(deps.cbegin(), deps.cend(), object)}; + if (it != deps.cend()) { + return target; + } + } + + throw std::runtime_error("No target found which depends on object "s + object.string()); +} + +std::vector<fs::path> Builder::include_paths_of_object(const fs::path& object) const { + fs::path target{target_from_object(object)}; + + // include paths from target try { - return _include_paths.at(p); + return _include_paths.at(target); } catch (const std::out_of_range& ex) { return {}; // empty by default } @@ -288,13 +314,8 @@ void Builder::build_file(const fs::path& p) { if (p.extension() == ".o") { // compile - std::vector<fs::path> source_files{dependencies_of(p)}; - auto it{std::find_if(source_files.begin(), source_files.end(), is_compile_unit_source_by_extension)}; - if (it == source_files.end()) { - throw std::runtime_error(fmt::format("No source file found for {}", p.string())); - } - //std::cout << "DEBUG: " << (*_include_paths.begin()).first << " " << (*_include_paths.begin()).second.size() << " " << p.string() << std::endl; - command = _lang.getCompileCommand(p, *it, include_paths_of(p)); + fs::path source_file{get_compile_unit_source_from_object(p)}; + command = _lang.getCompileCommand(p, source_file, include_paths_of_object(p)); } else { // link std::vector<fs::path> objects{dependencies_of(p)}; @@ -24,11 +24,13 @@ public: private: std::unordered_map<std::filesystem::path, std::vector<std::filesystem::path>> get_dependencies(const boost::property_tree::ptree& ptree) const; std::vector<std::filesystem::path> dependencies_of(const std::filesystem::path& p) const; - std::vector<std::filesystem::path> include_paths_of(const std::filesystem::path& p) const; + std::vector<std::filesystem::path> include_paths_of_object(const std::filesystem::path& p) const; + std::filesystem::path target_from_object(const std::filesystem::path& object) const; std::vector<std::string> link_libs_of(const std::filesystem::path& p) const; bool is_outdated(const std::filesystem::path& p) const; bool is_outdated(const std::filesystem::path& p, const std::vector<std::filesystem::path> &dependencies) const; std::vector<std::filesystem::path> make_depfile_from(const std::filesystem::path& p) const; + std::filesystem::path get_compile_unit_source_from_object(const std::filesystem::path& path); void build_file(const std::filesystem::path& p); void build_filelist(); diff --git a/LanguageSettings.cpp b/LanguageSettings.cpp index 57a550d..1d243d5 100644 --- a/LanguageSettings.cpp +++ b/LanguageSettings.cpp @@ -73,7 +73,7 @@ std::string LanguageSettings::getCompileCommand(const std::filesystem::path& tar const std::vector<std::filesystem::path>& includepaths) const { std::string includes{std::accumulate(includepaths.begin(), includepaths.end(), std::string{}, - [](const std::string& sum, const fs::path& p){ return sum + " " + p.string();})}; + [](const std::string& sum, const fs::path& p){ return sum + " -I" + p.string();})}; // compile: $(CXX) $(CXXFLAGS) -c $< -o $@ return fmt::format("{}{}{} -c {} -o {}", |