diff --git a/Source/cmCxxModuleUsageEffects.cxx b/Source/cmCxxModuleUsageEffects.cxx index 9684309193..1130c37fdf 100644 --- a/Source/cmCxxModuleUsageEffects.cxx +++ b/Source/cmCxxModuleUsageEffects.cxx @@ -4,15 +4,16 @@ #include #include +#include #include #include +#include #include "cmCryptoHash.h" #include "cmGeneratorTarget.h" #include "cmListFileCache.h" #include "cmMakefile.h" -#include "cmRange.h" #include "cmStringAlgorithms.h" #include "cmTarget.h" #include "cmValue.h" @@ -70,34 +71,6 @@ bool IsGNUWarning(cm::string_view flag) return long_names.find(flag) != long_names.end(); } -bool UnknownFilter(cm::string_view) -{ - return false; -} - -using FlagFilter = bool (*)(cm::string_view flag); - -FlagFilter GetFlagFilter(cmGeneratorTarget const* gt) -{ - static FlagFilter filter = nullptr; - if (filter) { - return filter; - } - - cmValue frontendVariant = - gt->Makefile->GetDefinition("CMAKE_CXX_COMPILER_FRONTEND_VARIANT"); - - if (frontendVariant == "GNU") { - filter = IsGNUWarning; - } else if (frontendVariant == "MSVC") { - filter = IsMSVCWarning; - } else { - filter = UnknownFilter; - } - - return filter; -} - void AppendUsage(std::string& usageHashInput, std::string const& entry) { usageHashInput += entry; @@ -121,28 +94,216 @@ void AppendUsageEntries(std::string& usageHashInput, Range const& entries) usageHashInput.push_back('\0'); } + +enum class CompileOptionUsage +{ + Hash, + Ignore, + SavePreprocessor, +}; + +struct CompileOptionClassification +{ + CompileOptionClassification( + CompileOptionUsage usage = CompileOptionUsage::Hash, + bool saveFollowingArgument = false) + : Usage(usage) + , SaveFollowingArgument(saveFollowingArgument) + { + } + + CompileOptionUsage Usage = CompileOptionUsage::Hash; + bool SaveFollowingArgument = false; +}; + +CompileOptionClassification SaveIfStartsWith(cm::string_view flag, + cm::string_view prefix) +{ + if (flag.rfind(prefix, 0) == 0) { + return { CompileOptionUsage::SavePreprocessor, + flag.size() == prefix.size() }; + } + + return {}; +} + +CompileOptionClassification ClassifyGNUCompileOption(cm::string_view flag) +{ + if (IsGNUWarning(flag)) { + return { CompileOptionUsage::Ignore, false }; + } + + if (flag.size() < 2 || flag.front() != '-') { + return {}; + } + + flag.remove_prefix(1); + switch (flag.front()) { + case 'D': + case 'I': + case 'U': + return { CompileOptionUsage::SavePreprocessor, flag.size() == 1 }; + case 'i': { + CompileOptionClassification classification = + SaveIfStartsWith(flag, "isystem"_s); + if (classification.Usage != CompileOptionUsage::Hash) { + return classification; + } + } + { + CompileOptionClassification classification = + SaveIfStartsWith(flag, "iquote"_s); + if (classification.Usage != CompileOptionUsage::Hash) { + return classification; + } + } + { + CompileOptionClassification classification = + SaveIfStartsWith(flag, "idirafter"_s); + if (classification.Usage != CompileOptionUsage::Hash) { + return classification; + } + } + { + CompileOptionClassification classification = + SaveIfStartsWith(flag, "include"_s); + if (classification.Usage != CompileOptionUsage::Hash) { + return classification; + } + } + { + CompileOptionClassification classification = + SaveIfStartsWith(flag, "imacros"_s); + if (classification.Usage != CompileOptionUsage::Hash) { + return classification; + } + } + break; + case '-': + flag.remove_prefix(1); + return SaveIfStartsWith(flag, "embed-dir"_s); + default: + break; + } + + return {}; +} + +CompileOptionClassification ClassifyMSVCCompileOption(cm::string_view flag) +{ + if (IsMSVCWarning(flag)) { + return { CompileOptionUsage::Ignore, false }; + } + + if (flag.size() < 2 || (flag.front() != '/' && flag.front() != '-')) { + return {}; + } + + flag.remove_prefix(1); + switch (flag.front()) { + case 'D': + case 'I': + case 'U': + return { CompileOptionUsage::SavePreprocessor, flag.size() == 1 }; + default: + break; + } + + return {}; +} + +CompileOptionClassification ClassifyUnknownCompileOption(cm::string_view flag) +{ + static_cast(flag); + return {}; +} + +using CompileOptionClassifier = + CompileOptionClassification (*)(cm::string_view flag); + +CompileOptionClassifier GetCompileOptionClassifier(cmGeneratorTarget const* gt) +{ + static CompileOptionClassifier classifier = nullptr; + if (classifier) { + return classifier; + } + + cmValue frontendVariant = + gt->Makefile->GetDefinition("CMAKE_CXX_COMPILER_FRONTEND_VARIANT"); + + if (frontendVariant == "GNU") { + classifier = ClassifyGNUCompileOption; + } else if (frontendVariant == "MSVC") { + classifier = ClassifyMSVCCompileOption; + } else { + classifier = ClassifyUnknownCompileOption; + } + + return classifier; +} + +struct SplitCompileOptionsResult +{ + std::vector> HashEntries; + std::vector> PreprocessorEntries; +}; + +template +SplitCompileOptionsResult SplitCompileOptions(Range const& entries, + CompileOptionClassifier classify) +{ + SplitCompileOptionsResult result; + + for (auto it = entries.begin(); it != entries.end(); ++it) { + BT const& option = *it; + auto const classification = classify(option.Value); + + switch (classification.Usage) { + case CompileOptionUsage::Ignore: + continue; + case CompileOptionUsage::SavePreprocessor: + result.PreprocessorEntries.push_back(option); + if (classification.SaveFollowingArgument) { + auto next = it; + ++next; + if (next != entries.end()) { + result.PreprocessorEntries.push_back(*next); + it = next; + } + } + continue; + case CompileOptionUsage::Hash: + break; + } + + result.HashEntries.push_back(option); + } + + return result; +} } cmCxxModuleUsageEffects::cmCxxModuleUsageEffects(cmGeneratorTarget const* gt, std::string const& config) { auto const* tgt = gt->Target; - auto const filter = GetFlagFilter(gt); + auto const classify = GetCompileOptionClassifier(gt); std::string usageHashInput; if (tgt->IsImported()) { AppendUsageEntries(usageHashInput, tgt->GetImportedCxxModulesCompileFeaturesEntries()); - AppendUsageEntries( - usageHashInput, - tgt->GetImportedCxxModulesCompileOptionsEntries().filter( - [&](const BT& flag) { return !filter(flag.Value); })); + auto compileOptions = SplitCompileOptions( + tgt->GetImportedCxxModulesCompileOptionsEntries(), classify); + this->PreprocessorCompileOptions = + std::move(compileOptions.PreprocessorEntries); + AppendUsageEntries(usageHashInput, compileOptions.HashEntries); } else { - AppendUsageEntries(usageHashInput, - cmMakeRange(gt->GetCompileOptions(config, "CXX")) - .filter([&](const BT& flag) { - return !filter(flag.Value); - })); + auto compileOptions = + SplitCompileOptions(gt->GetCompileOptions(config, "CXX"), classify); + this->PreprocessorCompileOptions = + std::move(compileOptions.PreprocessorEntries); + AppendUsageEntries(usageHashInput, compileOptions.HashEntries); cmValue langStd = gt->GetLanguageStandard("CXX", config); if (!langStd) { @@ -167,3 +328,9 @@ std::string const& cmCxxModuleUsageEffects::GetHash() const { return this->Hash; } + +std::vector> const& +cmCxxModuleUsageEffects::GetPreprocessorCompileOptions() const +{ + return this->PreprocessorCompileOptions; +} diff --git a/Source/cmCxxModuleUsageEffects.h b/Source/cmCxxModuleUsageEffects.h index 1fd190f22f..8b8c50f610 100644 --- a/Source/cmCxxModuleUsageEffects.h +++ b/Source/cmCxxModuleUsageEffects.h @@ -5,6 +5,9 @@ #include "cmConfigure.h" // IWYU pragma: keep #include +#include + +#include "cmListFileCache.h" class cmGeneratorTarget; @@ -14,7 +17,9 @@ public: cmCxxModuleUsageEffects(cmGeneratorTarget const* gt, std::string const& config); std::string const& GetHash() const; + std::vector> const& GetPreprocessorCompileOptions() const; private: std::string Hash; + std::vector> PreprocessorCompileOptions; }; diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 62af48f8a3..0af9983971 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -5565,6 +5565,13 @@ cmGeneratorTarget const* cmGeneratorTarget::GetCxxSyntheticTarget( // compile features and options. tgt->CopyUsageEffects(&bmiConsumer, config); + auto const& preprocessorCompileOptions = + this->GetCxxModuleUsageEffects(config).GetPreprocessorCompileOptions(); + for (auto it = preprocessorCompileOptions.rbegin(); + it != preprocessorCompileOptions.rend(); ++it) { + tgt->InsertCompileOption(*it, true); + } + // Copy properties which don't effect consumer compatibility tgt->CopyCxxModulesEntries(model); diff --git a/Tests/RunCMake/CXXModulesCompile/expect/exp-builddb-imped-all-multi.json b/Tests/RunCMake/CXXModulesCompile/expect/exp-builddb-imped-all-multi.json index 113680635e..e835f6afe4 100644 --- a/Tests/RunCMake/CXXModulesCompile/expect/exp-builddb-imped-all-multi.json +++ b/Tests/RunCMake/CXXModulesCompile/expect/exp-builddb-imped-all-multi.json @@ -185,7 +185,7 @@ } ], "visible-sets": [ - "CXXModules__export_build_database@synth_1@" + "CXXModules__export_build_database@synth_0@" ] }, { @@ -251,7 +251,7 @@ } ], "visible-sets": [ - "CXXModules__export_build_database@synth_1@" + "CXXModules__export_build_database@synth_0@" ] }, { @@ -275,8 +275,10 @@ "-Dfrom_cmake_cxx_flags", "-Dfrom_cmake_cxx__flags", "", - "-Dtarget_interface_option", + "-Dfrom_compile_options", + "-Dtarget_private_option", "-Dtarget_public_option", + "-Dtarget_interface_option", "-Ddep_interface_option", "PATH:-Ddepflag=\"CMakeFiles/CXXModules__export_build_database@synth_0.dir/.d\"", "REGEX:", @@ -299,8 +301,10 @@ "-Dfrom_cmake_cxx_flags", "-Dfrom_cmake_cxx__flags", "", - "-Dtarget_interface_option", + "-Dfrom_compile_options", + "-Dtarget_private_option", "-Dtarget_public_option", + "-Dtarget_interface_option", "-Ddep_interface_option" ], "local-arguments": [ @@ -318,8 +322,10 @@ "-Dfrom_cmake_cxx_flags", "-Dfrom_cmake_cxx__flags", "", - "-Dtarget_interface_option", + "-Dfrom_compile_options", + "-Dtarget_private_option", "-Dtarget_public_option", + "-Dtarget_interface_option", "-Ddep_interface_option" ], "private": false, @@ -354,8 +360,10 @@ "-Dfrom_cmake_cxx_flags", "-Dfrom_cmake_cxx__flags", "", - "-Dtarget_interface_option", + "-Dfrom_compile_options", + "-Dtarget_private_option", "-Dtarget_public_option", + "-Dtarget_interface_option", "-Ddep_interface_option", "PATH:-Ddepflag=\"CMakeFiles/CXXModules__export_build_database@synth_0.dir/.d\"", "REGEX:", @@ -363,172 +371,6 @@ "REGEX:-[cv]", "PATH:/exp-builddb/importable.cxx" ], - "baseline-arguments": [ - "-D_MBCS", - "-Ddep_interface_define", - "-Dfrom_compile_definitions", - "-Dtarget_interface_define", - "-Dtarget_private_define", - "-Dtarget_public_define", - "PATH:-I/exp-builddb/from_include_directories", - "PATH:-I/exp-builddb/target_private_include", - "PATH:-I/exp-builddb/target_public_include", - "PATH:-I/exp-builddb/dep_interface_include", - "PATH:-I/exp-builddb/target_interface_include", - "-Dfrom_cmake_cxx_flags", - "-Dfrom_cmake_cxx__flags", - "", - "-Dtarget_interface_option", - "-Dtarget_public_option", - "-Ddep_interface_option" - ], - "local-arguments": [ - "-D_MBCS", - "-Ddep_interface_define", - "-Dfrom_compile_definitions", - "-Dtarget_interface_define", - "-Dtarget_private_define", - "-Dtarget_public_define", - "PATH:-I/exp-builddb/from_include_directories", - "PATH:-I/exp-builddb/target_private_include", - "PATH:-I/exp-builddb/target_public_include", - "PATH:-I/exp-builddb/dep_interface_include", - "PATH:-I/exp-builddb/target_interface_include", - "-Dfrom_cmake_cxx_flags", - "-Dfrom_cmake_cxx__flags", - "", - "-Dtarget_interface_option", - "-Dtarget_public_option", - "-Ddep_interface_option" - ], - "private": false, - "provides": { - "importable": "" - }, - "requires": [], - "source": "PATH:/exp-builddb/importable.cxx", - "work-directory": "" - } - ], - "visible-sets": [] - }, - { - "family-name": "REGEX:CXXModules::export_build_database@", - "name": "CXXModules__export_build_database@synth_1@", - "translation-units": [ - { - "arguments": [ - "", - "-D_MBCS", - "-Ddep_interface_define", - "-Dfrom_compile_definitions", - "-Dtarget_interface_define", - "-Dtarget_private_define", - "-Dtarget_public_define", - "PATH:-I/exp-builddb/from_include_directories", - "PATH:-I/exp-builddb/target_private_include", - "PATH:-I/exp-builddb/target_public_include", - "PATH:-I/exp-builddb/dep_interface_include", - "PATH:-I/exp-builddb/target_interface_include", - "-Dfrom_cmake_cxx_flags", - "-Dfrom_cmake_cxx__flags", - "", - "-Dfrom_compile_options", - "-Dtarget_private_option", - "-Dtarget_public_option", - "-Dtarget_interface_option", - "-Ddep_interface_option", - "PATH:-Ddepflag=\"CMakeFiles/CXXModules__export_build_database@synth_1.dir/.d\"", - "REGEX:", - "PATH:CMakeFiles/CXXModules__export_build_database@synth_1.dir/", - "REGEX:-[cv]", - "PATH:/exp-builddb/importable.cxx" - ], - "baseline-arguments": [ - "-D_MBCS", - "-Ddep_interface_define", - "-Dfrom_compile_definitions", - "-Dtarget_interface_define", - "-Dtarget_private_define", - "-Dtarget_public_define", - "PATH:-I/exp-builddb/from_include_directories", - "PATH:-I/exp-builddb/target_private_include", - "PATH:-I/exp-builddb/target_public_include", - "PATH:-I/exp-builddb/dep_interface_include", - "PATH:-I/exp-builddb/target_interface_include", - "-Dfrom_cmake_cxx_flags", - "-Dfrom_cmake_cxx__flags", - "", - "-Dfrom_compile_options", - "-Dtarget_private_option", - "-Dtarget_public_option", - "-Dtarget_interface_option", - "-Ddep_interface_option" - ], - "local-arguments": [ - "-D_MBCS", - "-Ddep_interface_define", - "-Dfrom_compile_definitions", - "-Dtarget_interface_define", - "-Dtarget_private_define", - "-Dtarget_public_define", - "PATH:-I/exp-builddb/from_include_directories", - "PATH:-I/exp-builddb/target_private_include", - "PATH:-I/exp-builddb/target_public_include", - "PATH:-I/exp-builddb/dep_interface_include", - "PATH:-I/exp-builddb/target_interface_include", - "-Dfrom_cmake_cxx_flags", - "-Dfrom_cmake_cxx__flags", - "", - "-Dfrom_compile_options", - "-Dtarget_private_option", - "-Dtarget_public_option", - "-Dtarget_interface_option", - "-Ddep_interface_option" - ], - "private": false, - "provides": { - "importable": "" - }, - "requires": [], - "source": "PATH:/exp-builddb/importable.cxx", - "work-directory": "" - } - ], - "visible-sets": [] - }, - { - "family-name": "REGEX:CXXModules::export_build_database@", - "name": "CXXModules__export_build_database@synth_1@", - "translation-units": [ - { - "arguments": [ - "", - "-D_MBCS", - "-Ddep_interface_define", - "-Dfrom_compile_definitions", - "-Dtarget_interface_define", - "-Dtarget_private_define", - "-Dtarget_public_define", - "PATH:-I/exp-builddb/from_include_directories", - "PATH:-I/exp-builddb/target_private_include", - "PATH:-I/exp-builddb/target_public_include", - "PATH:-I/exp-builddb/dep_interface_include", - "PATH:-I/exp-builddb/target_interface_include", - "-Dfrom_cmake_cxx_flags", - "-Dfrom_cmake_cxx__flags", - "", - "-Dfrom_compile_options", - "-Dtarget_private_option", - "-Dtarget_public_option", - "-Dtarget_interface_option", - "-Ddep_interface_option", - "PATH:-Ddepflag=\"CMakeFiles/CXXModules__export_build_database@synth_1.dir/.d\"", - "REGEX:", - "PATH:CMakeFiles/CXXModules__export_build_database@synth_1.dir/", - "REGEX:-[cv]", - "PATH:/exp-builddb/importable.cxx" - ], "baseline-arguments": [ "-D_MBCS", "-Ddep_interface_define", diff --git a/Tests/RunCMake/CXXModulesCompile/expect/exp-builddb-imped-all.json b/Tests/RunCMake/CXXModulesCompile/expect/exp-builddb-imped-all.json index 83cef7942a..1f50bfaf59 100644 --- a/Tests/RunCMake/CXXModulesCompile/expect/exp-builddb-imped-all.json +++ b/Tests/RunCMake/CXXModulesCompile/expect/exp-builddb-imped-all.json @@ -125,91 +125,12 @@ } ], "visible-sets": [ - "CXXModules__export_build_database@synth_1@" + "CXXModules__export_build_database@synth_0@" ] }, { "family-name": "REGEX:CXXModules::export_build_database@", "name": "CXXModules__export_build_database@synth_0@", - "translation-units": [ - { - "arguments": [ - "", - "-D_MBCS", - "-Ddep_interface_define", - "-Dfrom_compile_definitions", - "-Dtarget_interface_define", - "-Dtarget_private_define", - "-Dtarget_public_define", - "PATH:-I/exp-builddb/from_include_directories", - "PATH:-I/exp-builddb/target_private_include", - "PATH:-I/exp-builddb/target_public_include", - "PATH:-I/exp-builddb/dep_interface_include", - "PATH:-I/exp-builddb/target_interface_include", - "-Dfrom_cmake_cxx_flags", - "-Dfrom_cmake_cxx__flags", - "", - "-Dtarget_interface_option", - "-Dtarget_public_option", - "-Ddep_interface_option", - "PATH:-Ddepflag=\"CMakeFiles/CXXModules__export_build_database@synth_0.dir/.d\"", - "REGEX:", - "PATH:CMakeFiles/CXXModules__export_build_database@synth_0.dir/", - "REGEX:-[cv]", - "PATH:/exp-builddb/importable.cxx" - ], - "baseline-arguments": [ - "-D_MBCS", - "-Ddep_interface_define", - "-Dfrom_compile_definitions", - "-Dtarget_interface_define", - "-Dtarget_private_define", - "-Dtarget_public_define", - "PATH:-I/exp-builddb/from_include_directories", - "PATH:-I/exp-builddb/target_private_include", - "PATH:-I/exp-builddb/target_public_include", - "PATH:-I/exp-builddb/dep_interface_include", - "PATH:-I/exp-builddb/target_interface_include", - "-Dfrom_cmake_cxx_flags", - "-Dfrom_cmake_cxx__flags", - "", - "-Dtarget_interface_option", - "-Dtarget_public_option", - "-Ddep_interface_option" - ], - "local-arguments": [ - "-D_MBCS", - "-Ddep_interface_define", - "-Dfrom_compile_definitions", - "-Dtarget_interface_define", - "-Dtarget_private_define", - "-Dtarget_public_define", - "PATH:-I/exp-builddb/from_include_directories", - "PATH:-I/exp-builddb/target_private_include", - "PATH:-I/exp-builddb/target_public_include", - "PATH:-I/exp-builddb/dep_interface_include", - "PATH:-I/exp-builddb/target_interface_include", - "-Dfrom_cmake_cxx_flags", - "-Dfrom_cmake_cxx__flags", - "", - "-Dtarget_interface_option", - "-Dtarget_public_option", - "-Ddep_interface_option" - ], - "private": false, - "provides": { - "importable": "" - }, - "requires": [], - "source": "PATH:/exp-builddb/importable.cxx", - "work-directory": "" - } - ], - "visible-sets": [] - }, - { - "family-name": "REGEX:CXXModules::export_build_database@", - "name": "CXXModules__export_build_database@synth_1@", "translation-units": [ { "arguments": [ @@ -233,9 +154,9 @@ "-Dtarget_public_option", "-Dtarget_interface_option", "-Ddep_interface_option", - "PATH:-Ddepflag=\"CMakeFiles/CXXModules__export_build_database@synth_1.dir/.d\"", + "PATH:-Ddepflag=\"CMakeFiles/CXXModules__export_build_database@synth_0.dir/.d\"", "REGEX:", - "PATH:CMakeFiles/CXXModules__export_build_database@synth_1.dir/", + "PATH:CMakeFiles/CXXModules__export_build_database@synth_0.dir/", "REGEX:-[cv]", "PATH:/exp-builddb/importable.cxx" ], diff --git a/Tests/RunCMake/CXXModulesCompile/expect/exp-builddb-imped-config.json b/Tests/RunCMake/CXXModulesCompile/expect/exp-builddb-imped-config.json index 83cef7942a..1f50bfaf59 100644 --- a/Tests/RunCMake/CXXModulesCompile/expect/exp-builddb-imped-config.json +++ b/Tests/RunCMake/CXXModulesCompile/expect/exp-builddb-imped-config.json @@ -125,91 +125,12 @@ } ], "visible-sets": [ - "CXXModules__export_build_database@synth_1@" + "CXXModules__export_build_database@synth_0@" ] }, { "family-name": "REGEX:CXXModules::export_build_database@", "name": "CXXModules__export_build_database@synth_0@", - "translation-units": [ - { - "arguments": [ - "", - "-D_MBCS", - "-Ddep_interface_define", - "-Dfrom_compile_definitions", - "-Dtarget_interface_define", - "-Dtarget_private_define", - "-Dtarget_public_define", - "PATH:-I/exp-builddb/from_include_directories", - "PATH:-I/exp-builddb/target_private_include", - "PATH:-I/exp-builddb/target_public_include", - "PATH:-I/exp-builddb/dep_interface_include", - "PATH:-I/exp-builddb/target_interface_include", - "-Dfrom_cmake_cxx_flags", - "-Dfrom_cmake_cxx__flags", - "", - "-Dtarget_interface_option", - "-Dtarget_public_option", - "-Ddep_interface_option", - "PATH:-Ddepflag=\"CMakeFiles/CXXModules__export_build_database@synth_0.dir/.d\"", - "REGEX:", - "PATH:CMakeFiles/CXXModules__export_build_database@synth_0.dir/", - "REGEX:-[cv]", - "PATH:/exp-builddb/importable.cxx" - ], - "baseline-arguments": [ - "-D_MBCS", - "-Ddep_interface_define", - "-Dfrom_compile_definitions", - "-Dtarget_interface_define", - "-Dtarget_private_define", - "-Dtarget_public_define", - "PATH:-I/exp-builddb/from_include_directories", - "PATH:-I/exp-builddb/target_private_include", - "PATH:-I/exp-builddb/target_public_include", - "PATH:-I/exp-builddb/dep_interface_include", - "PATH:-I/exp-builddb/target_interface_include", - "-Dfrom_cmake_cxx_flags", - "-Dfrom_cmake_cxx__flags", - "", - "-Dtarget_interface_option", - "-Dtarget_public_option", - "-Ddep_interface_option" - ], - "local-arguments": [ - "-D_MBCS", - "-Ddep_interface_define", - "-Dfrom_compile_definitions", - "-Dtarget_interface_define", - "-Dtarget_private_define", - "-Dtarget_public_define", - "PATH:-I/exp-builddb/from_include_directories", - "PATH:-I/exp-builddb/target_private_include", - "PATH:-I/exp-builddb/target_public_include", - "PATH:-I/exp-builddb/dep_interface_include", - "PATH:-I/exp-builddb/target_interface_include", - "-Dfrom_cmake_cxx_flags", - "-Dfrom_cmake_cxx__flags", - "", - "-Dtarget_interface_option", - "-Dtarget_public_option", - "-Ddep_interface_option" - ], - "private": false, - "provides": { - "importable": "" - }, - "requires": [], - "source": "PATH:/exp-builddb/importable.cxx", - "work-directory": "" - } - ], - "visible-sets": [] - }, - { - "family-name": "REGEX:CXXModules::export_build_database@", - "name": "CXXModules__export_build_database@synth_1@", "translation-units": [ { "arguments": [ @@ -233,9 +154,9 @@ "-Dtarget_public_option", "-Dtarget_interface_option", "-Ddep_interface_option", - "PATH:-Ddepflag=\"CMakeFiles/CXXModules__export_build_database@synth_1.dir/.d\"", + "PATH:-Ddepflag=\"CMakeFiles/CXXModules__export_build_database@synth_0.dir/.d\"", "REGEX:", - "PATH:CMakeFiles/CXXModules__export_build_database@synth_1.dir/", + "PATH:CMakeFiles/CXXModules__export_build_database@synth_0.dir/", "REGEX:-[cv]", "PATH:/exp-builddb/importable.cxx" ], diff --git a/Tests/RunCMake/CXXModulesCompile/expect/exp-builddb-imped-cxx-config.json b/Tests/RunCMake/CXXModulesCompile/expect/exp-builddb-imped-cxx-config.json index 83cef7942a..1f50bfaf59 100644 --- a/Tests/RunCMake/CXXModulesCompile/expect/exp-builddb-imped-cxx-config.json +++ b/Tests/RunCMake/CXXModulesCompile/expect/exp-builddb-imped-cxx-config.json @@ -125,91 +125,12 @@ } ], "visible-sets": [ - "CXXModules__export_build_database@synth_1@" + "CXXModules__export_build_database@synth_0@" ] }, { "family-name": "REGEX:CXXModules::export_build_database@", "name": "CXXModules__export_build_database@synth_0@", - "translation-units": [ - { - "arguments": [ - "", - "-D_MBCS", - "-Ddep_interface_define", - "-Dfrom_compile_definitions", - "-Dtarget_interface_define", - "-Dtarget_private_define", - "-Dtarget_public_define", - "PATH:-I/exp-builddb/from_include_directories", - "PATH:-I/exp-builddb/target_private_include", - "PATH:-I/exp-builddb/target_public_include", - "PATH:-I/exp-builddb/dep_interface_include", - "PATH:-I/exp-builddb/target_interface_include", - "-Dfrom_cmake_cxx_flags", - "-Dfrom_cmake_cxx__flags", - "", - "-Dtarget_interface_option", - "-Dtarget_public_option", - "-Ddep_interface_option", - "PATH:-Ddepflag=\"CMakeFiles/CXXModules__export_build_database@synth_0.dir/.d\"", - "REGEX:", - "PATH:CMakeFiles/CXXModules__export_build_database@synth_0.dir/", - "REGEX:-[cv]", - "PATH:/exp-builddb/importable.cxx" - ], - "baseline-arguments": [ - "-D_MBCS", - "-Ddep_interface_define", - "-Dfrom_compile_definitions", - "-Dtarget_interface_define", - "-Dtarget_private_define", - "-Dtarget_public_define", - "PATH:-I/exp-builddb/from_include_directories", - "PATH:-I/exp-builddb/target_private_include", - "PATH:-I/exp-builddb/target_public_include", - "PATH:-I/exp-builddb/dep_interface_include", - "PATH:-I/exp-builddb/target_interface_include", - "-Dfrom_cmake_cxx_flags", - "-Dfrom_cmake_cxx__flags", - "", - "-Dtarget_interface_option", - "-Dtarget_public_option", - "-Ddep_interface_option" - ], - "local-arguments": [ - "-D_MBCS", - "-Ddep_interface_define", - "-Dfrom_compile_definitions", - "-Dtarget_interface_define", - "-Dtarget_private_define", - "-Dtarget_public_define", - "PATH:-I/exp-builddb/from_include_directories", - "PATH:-I/exp-builddb/target_private_include", - "PATH:-I/exp-builddb/target_public_include", - "PATH:-I/exp-builddb/dep_interface_include", - "PATH:-I/exp-builddb/target_interface_include", - "-Dfrom_cmake_cxx_flags", - "-Dfrom_cmake_cxx__flags", - "", - "-Dtarget_interface_option", - "-Dtarget_public_option", - "-Ddep_interface_option" - ], - "private": false, - "provides": { - "importable": "" - }, - "requires": [], - "source": "PATH:/exp-builddb/importable.cxx", - "work-directory": "" - } - ], - "visible-sets": [] - }, - { - "family-name": "REGEX:CXXModules::export_build_database@", - "name": "CXXModules__export_build_database@synth_1@", "translation-units": [ { "arguments": [ @@ -233,9 +154,9 @@ "-Dtarget_public_option", "-Dtarget_interface_option", "-Ddep_interface_option", - "PATH:-Ddepflag=\"CMakeFiles/CXXModules__export_build_database@synth_1.dir/.d\"", + "PATH:-Ddepflag=\"CMakeFiles/CXXModules__export_build_database@synth_0.dir/.d\"", "REGEX:", - "PATH:CMakeFiles/CXXModules__export_build_database@synth_1.dir/", + "PATH:CMakeFiles/CXXModules__export_build_database@synth_0.dir/", "REGEX:-[cv]", "PATH:/exp-builddb/importable.cxx" ], diff --git a/Tests/RunCMake/CXXModulesCompile/expect/exp-builddb-imped-cxx-multi.json b/Tests/RunCMake/CXXModulesCompile/expect/exp-builddb-imped-cxx-multi.json index 113680635e..e835f6afe4 100644 --- a/Tests/RunCMake/CXXModulesCompile/expect/exp-builddb-imped-cxx-multi.json +++ b/Tests/RunCMake/CXXModulesCompile/expect/exp-builddb-imped-cxx-multi.json @@ -185,7 +185,7 @@ } ], "visible-sets": [ - "CXXModules__export_build_database@synth_1@" + "CXXModules__export_build_database@synth_0@" ] }, { @@ -251,7 +251,7 @@ } ], "visible-sets": [ - "CXXModules__export_build_database@synth_1@" + "CXXModules__export_build_database@synth_0@" ] }, { @@ -275,8 +275,10 @@ "-Dfrom_cmake_cxx_flags", "-Dfrom_cmake_cxx__flags", "", - "-Dtarget_interface_option", + "-Dfrom_compile_options", + "-Dtarget_private_option", "-Dtarget_public_option", + "-Dtarget_interface_option", "-Ddep_interface_option", "PATH:-Ddepflag=\"CMakeFiles/CXXModules__export_build_database@synth_0.dir/.d\"", "REGEX:", @@ -299,8 +301,10 @@ "-Dfrom_cmake_cxx_flags", "-Dfrom_cmake_cxx__flags", "", - "-Dtarget_interface_option", + "-Dfrom_compile_options", + "-Dtarget_private_option", "-Dtarget_public_option", + "-Dtarget_interface_option", "-Ddep_interface_option" ], "local-arguments": [ @@ -318,8 +322,10 @@ "-Dfrom_cmake_cxx_flags", "-Dfrom_cmake_cxx__flags", "", - "-Dtarget_interface_option", + "-Dfrom_compile_options", + "-Dtarget_private_option", "-Dtarget_public_option", + "-Dtarget_interface_option", "-Ddep_interface_option" ], "private": false, @@ -354,8 +360,10 @@ "-Dfrom_cmake_cxx_flags", "-Dfrom_cmake_cxx__flags", "", - "-Dtarget_interface_option", + "-Dfrom_compile_options", + "-Dtarget_private_option", "-Dtarget_public_option", + "-Dtarget_interface_option", "-Ddep_interface_option", "PATH:-Ddepflag=\"CMakeFiles/CXXModules__export_build_database@synth_0.dir/.d\"", "REGEX:", @@ -363,172 +371,6 @@ "REGEX:-[cv]", "PATH:/exp-builddb/importable.cxx" ], - "baseline-arguments": [ - "-D_MBCS", - "-Ddep_interface_define", - "-Dfrom_compile_definitions", - "-Dtarget_interface_define", - "-Dtarget_private_define", - "-Dtarget_public_define", - "PATH:-I/exp-builddb/from_include_directories", - "PATH:-I/exp-builddb/target_private_include", - "PATH:-I/exp-builddb/target_public_include", - "PATH:-I/exp-builddb/dep_interface_include", - "PATH:-I/exp-builddb/target_interface_include", - "-Dfrom_cmake_cxx_flags", - "-Dfrom_cmake_cxx__flags", - "", - "-Dtarget_interface_option", - "-Dtarget_public_option", - "-Ddep_interface_option" - ], - "local-arguments": [ - "-D_MBCS", - "-Ddep_interface_define", - "-Dfrom_compile_definitions", - "-Dtarget_interface_define", - "-Dtarget_private_define", - "-Dtarget_public_define", - "PATH:-I/exp-builddb/from_include_directories", - "PATH:-I/exp-builddb/target_private_include", - "PATH:-I/exp-builddb/target_public_include", - "PATH:-I/exp-builddb/dep_interface_include", - "PATH:-I/exp-builddb/target_interface_include", - "-Dfrom_cmake_cxx_flags", - "-Dfrom_cmake_cxx__flags", - "", - "-Dtarget_interface_option", - "-Dtarget_public_option", - "-Ddep_interface_option" - ], - "private": false, - "provides": { - "importable": "" - }, - "requires": [], - "source": "PATH:/exp-builddb/importable.cxx", - "work-directory": "" - } - ], - "visible-sets": [] - }, - { - "family-name": "REGEX:CXXModules::export_build_database@", - "name": "CXXModules__export_build_database@synth_1@", - "translation-units": [ - { - "arguments": [ - "", - "-D_MBCS", - "-Ddep_interface_define", - "-Dfrom_compile_definitions", - "-Dtarget_interface_define", - "-Dtarget_private_define", - "-Dtarget_public_define", - "PATH:-I/exp-builddb/from_include_directories", - "PATH:-I/exp-builddb/target_private_include", - "PATH:-I/exp-builddb/target_public_include", - "PATH:-I/exp-builddb/dep_interface_include", - "PATH:-I/exp-builddb/target_interface_include", - "-Dfrom_cmake_cxx_flags", - "-Dfrom_cmake_cxx__flags", - "", - "-Dfrom_compile_options", - "-Dtarget_private_option", - "-Dtarget_public_option", - "-Dtarget_interface_option", - "-Ddep_interface_option", - "PATH:-Ddepflag=\"CMakeFiles/CXXModules__export_build_database@synth_1.dir/.d\"", - "REGEX:", - "PATH:CMakeFiles/CXXModules__export_build_database@synth_1.dir/", - "REGEX:-[cv]", - "PATH:/exp-builddb/importable.cxx" - ], - "baseline-arguments": [ - "-D_MBCS", - "-Ddep_interface_define", - "-Dfrom_compile_definitions", - "-Dtarget_interface_define", - "-Dtarget_private_define", - "-Dtarget_public_define", - "PATH:-I/exp-builddb/from_include_directories", - "PATH:-I/exp-builddb/target_private_include", - "PATH:-I/exp-builddb/target_public_include", - "PATH:-I/exp-builddb/dep_interface_include", - "PATH:-I/exp-builddb/target_interface_include", - "-Dfrom_cmake_cxx_flags", - "-Dfrom_cmake_cxx__flags", - "", - "-Dfrom_compile_options", - "-Dtarget_private_option", - "-Dtarget_public_option", - "-Dtarget_interface_option", - "-Ddep_interface_option" - ], - "local-arguments": [ - "-D_MBCS", - "-Ddep_interface_define", - "-Dfrom_compile_definitions", - "-Dtarget_interface_define", - "-Dtarget_private_define", - "-Dtarget_public_define", - "PATH:-I/exp-builddb/from_include_directories", - "PATH:-I/exp-builddb/target_private_include", - "PATH:-I/exp-builddb/target_public_include", - "PATH:-I/exp-builddb/dep_interface_include", - "PATH:-I/exp-builddb/target_interface_include", - "-Dfrom_cmake_cxx_flags", - "-Dfrom_cmake_cxx__flags", - "", - "-Dfrom_compile_options", - "-Dtarget_private_option", - "-Dtarget_public_option", - "-Dtarget_interface_option", - "-Ddep_interface_option" - ], - "private": false, - "provides": { - "importable": "" - }, - "requires": [], - "source": "PATH:/exp-builddb/importable.cxx", - "work-directory": "" - } - ], - "visible-sets": [] - }, - { - "family-name": "REGEX:CXXModules::export_build_database@", - "name": "CXXModules__export_build_database@synth_1@", - "translation-units": [ - { - "arguments": [ - "", - "-D_MBCS", - "-Ddep_interface_define", - "-Dfrom_compile_definitions", - "-Dtarget_interface_define", - "-Dtarget_private_define", - "-Dtarget_public_define", - "PATH:-I/exp-builddb/from_include_directories", - "PATH:-I/exp-builddb/target_private_include", - "PATH:-I/exp-builddb/target_public_include", - "PATH:-I/exp-builddb/dep_interface_include", - "PATH:-I/exp-builddb/target_interface_include", - "-Dfrom_cmake_cxx_flags", - "-Dfrom_cmake_cxx__flags", - "", - "-Dfrom_compile_options", - "-Dtarget_private_option", - "-Dtarget_public_option", - "-Dtarget_interface_option", - "-Ddep_interface_option", - "PATH:-Ddepflag=\"CMakeFiles/CXXModules__export_build_database@synth_1.dir/.d\"", - "REGEX:", - "PATH:CMakeFiles/CXXModules__export_build_database@synth_1.dir/", - "REGEX:-[cv]", - "PATH:/exp-builddb/importable.cxx" - ], "baseline-arguments": [ "-D_MBCS", "-Ddep_interface_define", diff --git a/Tests/RunCMake/CXXModulesCompile/expect/exp-builddb-imped-cxx.json b/Tests/RunCMake/CXXModulesCompile/expect/exp-builddb-imped-cxx.json index 83cef7942a..1f50bfaf59 100644 --- a/Tests/RunCMake/CXXModulesCompile/expect/exp-builddb-imped-cxx.json +++ b/Tests/RunCMake/CXXModulesCompile/expect/exp-builddb-imped-cxx.json @@ -125,91 +125,12 @@ } ], "visible-sets": [ - "CXXModules__export_build_database@synth_1@" + "CXXModules__export_build_database@synth_0@" ] }, { "family-name": "REGEX:CXXModules::export_build_database@", "name": "CXXModules__export_build_database@synth_0@", - "translation-units": [ - { - "arguments": [ - "", - "-D_MBCS", - "-Ddep_interface_define", - "-Dfrom_compile_definitions", - "-Dtarget_interface_define", - "-Dtarget_private_define", - "-Dtarget_public_define", - "PATH:-I/exp-builddb/from_include_directories", - "PATH:-I/exp-builddb/target_private_include", - "PATH:-I/exp-builddb/target_public_include", - "PATH:-I/exp-builddb/dep_interface_include", - "PATH:-I/exp-builddb/target_interface_include", - "-Dfrom_cmake_cxx_flags", - "-Dfrom_cmake_cxx__flags", - "", - "-Dtarget_interface_option", - "-Dtarget_public_option", - "-Ddep_interface_option", - "PATH:-Ddepflag=\"CMakeFiles/CXXModules__export_build_database@synth_0.dir/.d\"", - "REGEX:", - "PATH:CMakeFiles/CXXModules__export_build_database@synth_0.dir/", - "REGEX:-[cv]", - "PATH:/exp-builddb/importable.cxx" - ], - "baseline-arguments": [ - "-D_MBCS", - "-Ddep_interface_define", - "-Dfrom_compile_definitions", - "-Dtarget_interface_define", - "-Dtarget_private_define", - "-Dtarget_public_define", - "PATH:-I/exp-builddb/from_include_directories", - "PATH:-I/exp-builddb/target_private_include", - "PATH:-I/exp-builddb/target_public_include", - "PATH:-I/exp-builddb/dep_interface_include", - "PATH:-I/exp-builddb/target_interface_include", - "-Dfrom_cmake_cxx_flags", - "-Dfrom_cmake_cxx__flags", - "", - "-Dtarget_interface_option", - "-Dtarget_public_option", - "-Ddep_interface_option" - ], - "local-arguments": [ - "-D_MBCS", - "-Ddep_interface_define", - "-Dfrom_compile_definitions", - "-Dtarget_interface_define", - "-Dtarget_private_define", - "-Dtarget_public_define", - "PATH:-I/exp-builddb/from_include_directories", - "PATH:-I/exp-builddb/target_private_include", - "PATH:-I/exp-builddb/target_public_include", - "PATH:-I/exp-builddb/dep_interface_include", - "PATH:-I/exp-builddb/target_interface_include", - "-Dfrom_cmake_cxx_flags", - "-Dfrom_cmake_cxx__flags", - "", - "-Dtarget_interface_option", - "-Dtarget_public_option", - "-Ddep_interface_option" - ], - "private": false, - "provides": { - "importable": "" - }, - "requires": [], - "source": "PATH:/exp-builddb/importable.cxx", - "work-directory": "" - } - ], - "visible-sets": [] - }, - { - "family-name": "REGEX:CXXModules::export_build_database@", - "name": "CXXModules__export_build_database@synth_1@", "translation-units": [ { "arguments": [ @@ -233,9 +154,9 @@ "-Dtarget_public_option", "-Dtarget_interface_option", "-Ddep_interface_option", - "PATH:-Ddepflag=\"CMakeFiles/CXXModules__export_build_database@synth_1.dir/.d\"", + "PATH:-Ddepflag=\"CMakeFiles/CXXModules__export_build_database@synth_0.dir/.d\"", "REGEX:", - "PATH:CMakeFiles/CXXModules__export_build_database@synth_1.dir/", + "PATH:CMakeFiles/CXXModules__export_build_database@synth_0.dir/", "REGEX:-[cv]", "PATH:/exp-builddb/importable.cxx" ], diff --git a/Tests/RunCMake/CXXModulesCompile/expect/exp-builddb-imped-matching-target.json b/Tests/RunCMake/CXXModulesCompile/expect/exp-builddb-imped-matching-target.json index 6154715b57..e6d2629b58 100644 --- a/Tests/RunCMake/CXXModulesCompile/expect/exp-builddb-imped-matching-target.json +++ b/Tests/RunCMake/CXXModulesCompile/expect/exp-builddb-imped-matching-target.json @@ -65,7 +65,7 @@ } ], "visible-sets": [ - "CXXModules__export_build_database@synth_1@" + "CXXModules__export_build_database@synth_0@" ] } ] diff --git a/Tests/RunCMake/CXXModulesCompile/mixed-bmi-compatibility-build-check.cmake b/Tests/RunCMake/CXXModulesCompile/mixed-bmi-compatibility-build-check.cmake index 810364da78..8728c7a2cc 100644 --- a/Tests/RunCMake/CXXModulesCompile/mixed-bmi-compatibility-build-check.cmake +++ b/Tests/RunCMake/CXXModulesCompile/mixed-bmi-compatibility-build-check.cmake @@ -1,8 +1,8 @@ -# Verify the build system reused the owning target BMI when compatible and -# generated a synthetic target BMI only for the incompatible importer. -set(expected_consumers consumer20 consumer23) -set(linked_dir_keys "") -set(linked_dir_names "") +# Verify the build system reused the owning target BMI when compatible, +# generated a shared synthetic target BMI for the incompatible importers, +# and ignored preprocessor-only compile options in the BMI compatibility hash. +set(expected_consumers consumer20 consumer23 consumer23flag) +set(shared_synth_target_name "") if (DEFINED RunCMake_TEST_CONFIG) set(config_dir "${RunCMake_TEST_CONFIG}") @@ -36,9 +36,10 @@ foreach (consumer IN LISTS expected_consumers) set(expected_linked_tgt_regex "^importable\.dir$") set(expected_linked_tgt_desc "owning target dir for 'importable'") set(expected_linked_tgt_has_bmi 0) - elseif (consumer STREQUAL "consumer23") + elseif (consumer STREQUAL "consumer23" OR + consumer STREQUAL "consumer23flag") set(expected_linked_tgt_regex "^importable@synth_[A-Za-z0-9_]+\.dir$") - set(expected_linked_tgt_desc "synthetic target dir for 'importable'") + set(expected_linked_tgt_desc "shared synthetic target dir for 'importable'") set(expected_linked_tgt_has_bmi 1) else () list(APPEND RunCMake_TEST_FAILED @@ -97,33 +98,15 @@ foreach (consumer IN LISTS expected_consumers) endif () endif () - if (linked_tgt_name MATCHES "^importable@synth_[A-Za-z0-9_]+\.dir$") - # Record the consumers of each synthetic dir to verify uniqueness. - string(REGEX REPLACE "[^A-Za-z0-9_]" "_" linked_dir_key "${linked_tgt_name}") - set(linked_dir_consumers_var "linked_dir_consumers_${linked_dir_key}") - if (NOT DEFINED ${linked_dir_consumers_var}) - list(APPEND linked_dir_keys "${linked_dir_key}") - list(APPEND linked_dir_names "${linked_tgt_name}") + if (consumer STREQUAL "consumer23" OR consumer STREQUAL "consumer23flag") + if (shared_synth_target_name STREQUAL "") + set(shared_synth_target_name "${linked_tgt_name}") + elseif (NOT linked_tgt_name STREQUAL shared_synth_target_name) + list(APPEND RunCMake_TEST_FAILED + "Expected consumer23 and consumer23flag to share one synthetic target dir, but found '${shared_synth_target_name}' and '${linked_tgt_name}'") endif () - - list(APPEND ${linked_dir_consumers_var} ${consumer}) endif () endforeach () -# Verify each synthetic target is consumed exactly once. -foreach (linked_dir_key IN LISTS linked_dir_keys) - set(consumers "${linked_dir_consumers_${linked_dir_key}}") - list(LENGTH consumers linked_dir_consumer_count) - - if (linked_dir_consumer_count GREATER 1) - list(FIND linked_dir_keys ${linked_dir_key} linked_dir_index) - list(GET linked_dir_names ${linked_dir_index} linked_tgt_name) - - string(JOIN ", " linked_dir_consumers_joined ${consumers}) - list(APPEND RunCMake_TEST_FAILED - "Expected per-compatibility synthetic BMI generation, but '${linked_tgt_name}' is linked to by multiple targets: ${linked_dir_consumers_joined}") - endif () -endforeach () - string(REPLACE ";" "\n " RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}") diff --git a/Tests/RunCMake/CXXModulesCompile/mixed-bmi-compatibility/CMakeLists.txt b/Tests/RunCMake/CXXModulesCompile/mixed-bmi-compatibility/CMakeLists.txt index 4af50c8459..794c0de4b6 100644 --- a/Tests/RunCMake/CXXModulesCompile/mixed-bmi-compatibility/CMakeLists.txt +++ b/Tests/RunCMake/CXXModulesCompile/mixed-bmi-compatibility/CMakeLists.txt @@ -8,6 +8,7 @@ target_sources(importable PUBLIC FILE_SET CXX_MODULES FILES importable.cxx) target_compile_features(importable PUBLIC cxx_std_20) +target_compile_options(importable PRIVATE "-DIMPORTABLE_PRIVATE_DEFINE=1") add_executable(consumer20 consumer20.cxx) target_compile_features(consumer20 PRIVATE cxx_std_20) @@ -17,5 +18,11 @@ add_executable(consumer23 consumer23.cxx) target_compile_features(consumer23 PRIVATE cxx_std_23) target_link_libraries(consumer23 PRIVATE importable) +add_executable(consumer23flag consumer23.cxx) +target_compile_features(consumer23flag PRIVATE cxx_std_23) +target_compile_options(consumer23flag PRIVATE "-DCONSUMER23FLAG_ONLY=1") +target_link_libraries(consumer23flag PRIVATE importable) + add_test(NAME consumer20 COMMAND consumer20) add_test(NAME consumer23 COMMAND consumer23) +add_test(NAME consumer23flag COMMAND consumer23flag) diff --git a/Tests/RunCMake/CXXModulesCompile/mixed-bmi-compatibility/importable.cxx b/Tests/RunCMake/CXXModulesCompile/mixed-bmi-compatibility/importable.cxx index 607680a07c..f2a7908901 100644 --- a/Tests/RunCMake/CXXModulesCompile/mixed-bmi-compatibility/importable.cxx +++ b/Tests/RunCMake/CXXModulesCompile/mixed-bmi-compatibility/importable.cxx @@ -1,5 +1,9 @@ export module importable; +#ifndef IMPORTABLE_PRIVATE_DEFINE +# error "missing private compile option required for BMI generation" +#endif + export int from_import() { return 0;