From 5af2385cc354f7feb15d8455c9771469133095d1 Mon Sep 17 00:00:00 2001 From: Duncan Ogilvie Date: Thu, 6 Oct 2022 18:22:51 +0200 Subject: [PATCH] Fix the way target.headers is merged into target.sources - It would crash if you did not specify target.sources - Headers with condition would be merged incorrectly --- include/project_parser.hpp | 1 - src/project_parser.cpp | 17 ++++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/include/project_parser.hpp b/include/project_parser.hpp index a4ce581..94418b2 100644 --- a/include/project_parser.hpp +++ b/include/project_parser.hpp @@ -67,7 +67,6 @@ struct Target { TargetType type = target_last; std::string type_name; - ConditionVector headers; ConditionVector sources; // https://cmake.org/cmake/help/latest/manual/cmake-commands.7.html#project-commands diff --git a/src/project_parser.cpp b/src/project_parser.cpp index a117bf6..98b27a4 100644 --- a/src/project_parser.cpp +++ b/src/project_parser.cpp @@ -487,9 +487,18 @@ Project::Project(const Project *parent, const std::string &path, bool build) { throw std::runtime_error(format_key_error(error, target.type_name, t.find("type"))); } - t.optional("headers", target.headers); t.optional("sources", target.sources); + // Merge the headers into the sources + ConditionVector headers; + t.optional("headers", headers); + for (const auto &itr : headers) { + auto &dest = target.sources[itr.first]; + for (const auto &jtr : itr.second) { + dest.push_back(jtr); + } + } + t.optional("compile-definitions", target.compile_definitions); t.optional("private-compile-definitions", target.private_compile_definitions); @@ -514,12 +523,6 @@ Project::Project(const Project *parent, const std::string &path, bool build) { t.optional("precompile-headers", target.precompile_headers); t.optional("private-precompile-headers", target.private_precompile_headers); - if (!target.headers.empty()) { - auto &sources = target.sources.nth(0).value(); - const auto &headers = target.headers.nth(0)->second; - sources.insert(sources.end(), headers.begin(), headers.end()); - } - t.optional("condition", target.condition); t.optional("alias", target.alias);