summaryrefslogtreecommitdiffhomepage
path: root/Builder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Builder.cpp')
-rw-r--r--Builder.cpp39
1 files changed, 30 insertions, 9 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)};