diff options
Diffstat (limited to 'Source/cmTarget.cxx')
-rw-r--r-- | Source/cmTarget.cxx | 761 |
1 files changed, 437 insertions, 324 deletions
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index debf593..e8d66cc 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -4,7 +4,6 @@ #include <algorithm> #include <cassert> -#include <initializer_list> #include <iterator> #include <map> #include <set> @@ -273,6 +272,346 @@ struct UsageRequirementProperty std::vector<BT<std::string>> Entries; }; + +struct TargetProperty +{ + enum class InitCondition + { + // Always initialize the property. + Always, + // Never initialize the property. + Never, + // Only initialize if the target can compile sources. + CanCompileSources, + // Only apply to Xcode generators. + NeedsXcode, + // Only apply to Xcode generators on targets that can compile sources. + NeedsXcodeAndCanCompileSources, + // Needs to be a "normal" target (any non-global, non-utility target). + NormalTarget, + // Any non-imported target. + NonImportedTarget, + // Needs to be a "normal" target (any non-global, non-utility target) that + // is not `IMPORTED`. + NormalNonImportedTarget, + // Needs to be a "normal" target with an artifact (no `INTERFACE` + // libraries). + TargetWithArtifact, + // Needs to be a "normal" target with an artifact that is not an + // executable. + NonExecutableWithArtifact, + // Needs to be a linkable library target (no `OBJECT` or `MODULE` + // libraries). + LinkableLibraryTarget, + // Needs to be an executable. + ExecutableTarget, + // Needs to be a target with meaningful symbol exports (`SHARED` or + // `EXECUTABLE`). + TargetWithSymbolExports, + // Targets with "commands" associated with them. Basically everything + // except global and `INTERFACE` targets. + TargetWithCommands, + }; + + enum class Repetition + { + Once, + PerConfig, + PerConfigPrefix, + }; + + TargetProperty(cm::static_string_view name) + : Name(name) + { + } + + TargetProperty(cm::static_string_view name, cm::static_string_view dflt, + InitCondition init) + : Name(name) + , Default(dflt) + , InitConditional(init) + { + } + + TargetProperty(cm::static_string_view name, InitCondition init) + : Name(name) + , InitConditional(init) + { + } + + TargetProperty(cm::static_string_view name, InitCondition init, + Repetition repeat) + : Name(name) + , InitConditional(init) + , Repeat(repeat) + { + } + + cm::static_string_view const Name; + cm::optional<cm::static_string_view> const Default = {}; + InitCondition const InitConditional = InitCondition::Always; + Repetition const Repeat = Repetition::Once; +}; + +#define IC TargetProperty::InitCondition +#define R TargetProperty::Repetition + +/* clang-format off */ +#define COMMON_LANGUAGE_PROPERTIES(lang) \ + { #lang "_COMPILER_LAUNCHER"_s, IC::CanCompileSources }, \ + { #lang "_STANDARD"_s, IC::CanCompileSources }, \ + { #lang "_STANDARD_REQUIRED"_s, IC::CanCompileSources }, \ + { #lang "_EXTENSIONS"_s, IC::CanCompileSources }, \ + { #lang "_VISIBILITY_PRESET"_s, IC::CanCompileSources } +/* clang-format on */ + +TargetProperty const StaticTargetProperties[] = { + /* clang-format off */ + // Compilation properties + { "COMPILE_WARNING_AS_ERROR"_s, IC::CanCompileSources }, + { "INTERPROCEDURAL_OPTIMIZATION"_s, IC::CanCompileSources }, + { "INTERPROCEDURAL_OPTIMIZATION_"_s, IC::TargetWithArtifact, R::PerConfig }, + { "NO_SYSTEM_FROM_IMPORTED"_s, IC::CanCompileSources }, + // Set to `True` for `SHARED` and `MODULE` targets. + { "POSITION_INDEPENDENT_CODE"_s, IC::CanCompileSources }, + { "VISIBILITY_INLINES_HIDDEN"_s, IC::CanCompileSources }, + // -- Features + // ---- PCH + { "DISABLE_PRECOMPILE_HEADERS"_s, IC::CanCompileSources }, + { "PCH_WARN_INVALID"_s, "ON"_s, IC::CanCompileSources }, + { "PCH_INSTANTIATE_TEMPLATES"_s, "ON"_s, IC::CanCompileSources }, + // -- Platforms + // ---- Android + { "ANDROID_API"_s, IC::CanCompileSources }, + { "ANDROID_API_MIN"_s, IC::CanCompileSources }, + { "ANDROID_ARCH"_s, IC::CanCompileSources }, + { "ANDROID_ASSETS_DIRECTORIES"_s, IC::CanCompileSources }, + { "ANDROID_JAVA_SOURCE_DIR"_s, IC::CanCompileSources }, + { "ANDROID_STL_TYPE"_s, IC::CanCompileSources }, + // ---- macOS + { "OSX_ARCHITECTURES"_s, IC::CanCompileSources }, + // ---- Windows + { "MSVC_DEBUG_INFORMATION_FORMAT"_s, IC::CanCompileSources }, + { "MSVC_RUNTIME_LIBRARY"_s, IC::CanCompileSources }, + { "VS_JUST_MY_CODE_DEBUGGING"_s, IC::CanCompileSources }, + // ---- OpenWatcom + { "WATCOM_RUNTIME_LIBRARY"_s, IC::CanCompileSources }, + // -- Language + // ---- C + COMMON_LANGUAGE_PROPERTIES(C), + // ---- C++ + COMMON_LANGUAGE_PROPERTIES(CXX), + // ---- CSharp + { "DOTNET_SDK"_s, IC::NonImportedTarget }, + { "DOTNET_TARGET_FRAMEWORK"_s, IC::TargetWithCommands }, + { "DOTNET_TARGET_FRAMEWORK_VERSION"_s, IC::TargetWithCommands }, + // ---- CUDA + COMMON_LANGUAGE_PROPERTIES(CUDA), + { "CUDA_SEPARABLE_COMPILATION"_s, IC::CanCompileSources }, + { "CUDA_ARCHITECTURES"_s, IC::CanCompileSources }, + // ---- Fortran + { "Fortran_FORMAT"_s, IC::CanCompileSources }, + { "Fortran_MODULE_DIRECTORY"_s, IC::CanCompileSources }, + { "Fortran_COMPILER_LAUNCHER"_s, IC::CanCompileSources }, + { "Fortran_PREPRPOCESS"_s, IC::CanCompileSources }, + { "Fortran_VISIBILITY_PRESET"_s, IC::CanCompileSources }, + // ---- HIP + COMMON_LANGUAGE_PROPERTIES(HIP), + { "HIP_ARCHITECTURES"_s, IC::CanCompileSources }, + // ---- ISPC + { "ISPC_COMPILER_LAUNCHER"_s, IC::CanCompileSources }, + { "ISPC_HEADER_DIRECTORY"_s, IC::CanCompileSources }, + { "ISPC_HEADER_SUFFIX"_s, "_ispc.h"_s, IC::CanCompileSources }, + { "ISPC_INSTRUCTION_SETS"_s, IC::CanCompileSources }, + // ---- Objective C + COMMON_LANGUAGE_PROPERTIES(OBJC), + // ---- Objective C++ + COMMON_LANGUAGE_PROPERTIES(OBJCXX), + // ---- Swift + { "Swift_LANGUAGE_VERSION"_s, IC::CanCompileSources }, + { "Swift_MODULE_DIRECTORY"_s, IC::CanCompileSources }, + // ---- moc + { "AUTOMOC"_s, IC::CanCompileSources }, + { "AUTOMOC_COMPILER_PREDEFINES"_s, IC::CanCompileSources }, + { "AUTOMOC_MACRO_NAMES"_s, IC::CanCompileSources }, + { "AUTOMOC_MOC_OPTIONS"_s, IC::CanCompileSources }, + { "AUTOMOC_PATH_PREFIX"_s, IC::CanCompileSources }, + // ---- uic + { "AUTOUIC"_s, IC::CanCompileSources }, + { "AUTOUIC_OPTIONS"_s, IC::CanCompileSources }, + { "AUTOUIC_SEARCH_PATHS"_s, IC::CanCompileSources }, + // ---- rcc + { "AUTORCC"_s, IC::CanCompileSources }, + { "AUTORCC_OPTIONS"_s, IC::CanCompileSources }, + + // Linking properties + { "ENABLE_EXPORTS"_s, IC::ExecutableTarget }, + { "LINK_LIBRARIES_ONLY_TARGETS"_s, IC::NormalNonImportedTarget }, + { "LINK_SEARCH_START_STATIC"_s, IC::CanCompileSources }, + { "LINK_SEARCH_END_STATIC"_s, IC::CanCompileSources }, + // Initialize per-configuration name postfix property from the variable only + // for non-executable targets. This preserves compatibility with previous + // CMake versions in which executables did not support this variable. + // Projects may still specify the property directly. + { "_POSTFIX"_s, IC::NonExecutableWithArtifact, R::PerConfigPrefix }, + // -- Dependent library lookup + { "MACOSX_RPATH"_s, IC::CanCompileSources }, + // ---- Build + { "BUILD_RPATH"_s, IC::CanCompileSources }, + { "BUILD_RPATH_USE_ORIGIN"_s, IC::CanCompileSources }, + { "SKIP_BUILD_RPATH"_s, "OFF"_s, IC::CanCompileSources }, + { "BUILD_WITH_INSTALL_RPATH"_s, "OFF"_s, IC::CanCompileSources }, + { "BUILD_WITH_INSTALL_NAME_DIR"_s, IC::CanCompileSources }, + // ---- Install + { "INSTALL_NAME_DIR"_s, IC::CanCompileSources }, + { "INSTALL_REMOVE_ENVIRONMENT_RPATH"_s, IC::CanCompileSources }, + { "INSTALL_RPATH"_s, ""_s, IC::CanCompileSources }, + { "INSTALL_RPATH_USE_LINK_PATH"_s, "OFF"_s, IC::CanCompileSources }, + // -- Platforms + // ---- AIX + { "AIX_EXPORT_ALL_SYMBOLS"_s, IC::TargetWithSymbolExports }, + // ---- Android + { "ANDROID_GUI"_s, IC::ExecutableTarget }, + { "ANDROID_JAR_DIRECTORIES"_s, IC::CanCompileSources }, + { "ANDROID_JAR_DEPENDENCIES"_s, IC::CanCompileSources }, + { "ANDROID_NATIVE_LIB_DIRECTORIES"_s, IC::CanCompileSources }, + { "ANDROID_NATIVE_LIB_DEPENDENCIES"_s, IC::CanCompileSources }, + { "ANDROID_PROGUARD"_s, IC::CanCompileSources }, + { "ANDROID_PROGUARD_CONFIG_PATH"_s, IC::CanCompileSources }, + { "ANDROID_SECURE_PROPS_PATH"_s, IC::CanCompileSources }, + // ---- iOS + { "IOS_INSTALL_COMBINED"_s, IC::CanCompileSources }, + // ---- macOS + { "FRAMEWORK_MULTI_CONFIG_POSTFIX_"_s, IC::LinkableLibraryTarget, R::PerConfig }, + // ---- Windows + { "GNUtoMS"_s, IC::CanCompileSources }, + { "WIN32_EXECUTABLE"_s, IC::CanCompileSources }, + { "WINDOWS_EXPORT_ALL_SYMBOLS"_s, IC::TargetWithSymbolExports }, + // -- Languages + // ---- C + { "C_LINKER_LAUNCHER"_s, IC::CanCompileSources }, + // ---- C++ + { "CXX_LINKER_LAUNCHER"_s, IC::CanCompileSources }, + // ---- CUDA + { "CUDA_RESOLVE_DEVICE_SYMBOLS"_s, IC::CanCompileSources }, + { "CUDA_RUNTIME_LIBRARY"_s, IC::CanCompileSources }, + // ---- HIP + { "HIP_RUNTIME_LIBRARY"_s, IC::CanCompileSources }, + // ---- Objective C + { "OBJC_LINKER_LAUNCHER"_s, IC::CanCompileSources }, + // ---- Objective C++ + { "OBJCXX_LINKER_LAUNCHER"_s, IC::CanCompileSources }, + + // Static analysis + // -- C + { "C_CLANG_TIDY"_s, IC::CanCompileSources }, + { "C_CLANG_TIDY_EXPORT_FIXES_DIR"_s, IC::CanCompileSources }, + { "C_CPPLINT"_s, IC::CanCompileSources }, + { "C_CPPCHECK"_s, IC::CanCompileSources }, + { "C_INCLUDE_WHAT_YOU_USE"_s, IC::CanCompileSources }, + // -- C++ + { "CXX_CLANG_TIDY"_s, IC::CanCompileSources }, + { "CXX_CLANG_TIDY_EXPORT_FIXES_DIR"_s, IC::CanCompileSources }, + { "CXX_CPPLINT"_s, IC::CanCompileSources }, + { "CXX_CPPCHECK"_s, IC::CanCompileSources }, + { "CXX_INCLUDE_WHAT_YOU_USE"_s, IC::CanCompileSources }, + // -- Objective C + { "OBJC_CLANG_TIDY"_s, IC::CanCompileSources }, + { "OBJC_CLANG_TIDY_EXPORT_FIXES_DIR"_s, IC::CanCompileSources }, + // -- Objective C++ + { "OBJCXX_CLANG_TIDY"_s, IC::CanCompileSources }, + { "OBJCXX_CLANG_TIDY_EXPORT_FIXES_DIR"_s, IC::CanCompileSources }, + // -- Linking + { "LINK_WHAT_YOU_USE"_s, IC::CanCompileSources }, + + // Build graph properties + { "LINK_DEPENDS_NO_SHARED"_s, IC::CanCompileSources }, + { "UNITY_BUILD"_s, IC::CanCompileSources }, + { "UNITY_BUILD_UNIQUE_ID"_s, IC::CanCompileSources }, + { "UNITY_BUILD_BATCH_SIZE"_s, "8"_s, IC::CanCompileSources }, + { "UNITY_BUILD_MODE"_s, "BATCH"_s, IC::CanCompileSources }, + { "OPTIMIZE_DEPENDENCIES"_s, IC::CanCompileSources }, + { "VERIFY_INTERFACE_HEADER_SETS"_s }, + // -- Android + { "ANDROID_ANT_ADDITIONAL_OPTIONS"_s, IC::CanCompileSources }, + { "ANDROID_PROCESS_MAX"_s, IC::CanCompileSources }, + { "ANDROID_SKIP_ANT_STEP"_s, IC::CanCompileSources }, + // -- Autogen + { "AUTOGEN_ORIGIN_DEPENDS"_s, IC::CanCompileSources }, + { "AUTOGEN_PARALLEL"_s, IC::CanCompileSources }, + // -- moc + { "AUTOMOC_DEPEND_FILTERS"_s, IC::CanCompileSources }, + // -- C++ + { "CXX_SCAN_FOR_MODULES"_s, IC::CanCompileSources }, + // -- Ninja + { "JOB_POOL_COMPILE"_s, IC::CanCompileSources }, + { "JOB_POOL_LINK"_s, IC::CanCompileSources }, + { "JOB_POOL_PRECOMPILE_HEADER"_s, IC::CanCompileSources }, + // -- Visual Studio + { "VS_NO_COMPILE_BATCHING"_s, IC::CanCompileSources }, + + // Output location properties + { "ARCHIVE_OUTPUT_DIRECTORY"_s, IC::CanCompileSources }, + { "ARCHIVE_OUTPUT_DIRECTORY_"_s, IC::TargetWithArtifact, R::PerConfig }, + { "COMPILE_PDB_OUTPUT_DIRECTORY"_s, IC::CanCompileSources }, + { "COMPILE_PDB_OUTPUT_DIRECTORY_"_s, IC::TargetWithArtifact, R::PerConfig }, + { "LIBRARY_OUTPUT_DIRECTORY"_s, IC::CanCompileSources }, + { "LIBRARY_OUTPUT_DIRECTORY_"_s, IC::TargetWithArtifact, R::PerConfig }, + { "PDB_OUTPUT_DIRECTORY"_s, IC::CanCompileSources }, + { "PDB_OUTPUT_DIRECTORY_"_s, IC::TargetWithArtifact, R::PerConfig }, + { "RUNTIME_OUTPUT_DIRECTORY"_s, IC::CanCompileSources }, + { "RUNTIME_OUTPUT_DIRECTORY_"_s, IC::TargetWithArtifact, R::PerConfig }, + + // macOS bundle properties + { "FRAMEWORK"_s, IC::CanCompileSources }, + { "FRAMEWORK_MULTI_CONFIG_POSTFIX"_s, IC::CanCompileSources }, + { "MACOSX_BUNDLE"_s, IC::CanCompileSources }, + + // Usage requirement properties + { "LINK_INTERFACE_LIBRARIES"_s, IC::CanCompileSources }, + { "MAP_IMPORTED_CONFIG_"_s, IC::NormalTarget, R::PerConfig }, + + // Metadata + { "CROSSCOMPILING_EMULATOR"_s, IC::ExecutableTarget }, + { "EXPORT_COMPILE_COMMANDS"_s, IC::CanCompileSources }, + { "FOLDER"_s }, + + // Xcode properties + { "XCODE_GENERATE_SCHEME"_s, IC::NeedsXcode }, + +#ifdef __APPLE__ + { "XCODE_SCHEME_ADDRESS_SANITIZER"_s, IC::NeedsXcodeAndCanCompileSources }, + { "XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN"_s, IC::NeedsXcodeAndCanCompileSources }, + { "XCODE_SCHEME_DEBUG_DOCUMENT_VERSIONING"_s, IC::NeedsXcodeAndCanCompileSources }, + { "XCODE_SCHEME_ENABLE_GPU_FRAME_CAPTURE_MODE"_s, IC::NeedsXcodeAndCanCompileSources }, + { "XCODE_SCHEME_THREAD_SANITIZER"_s, IC::NeedsXcodeAndCanCompileSources }, + { "XCODE_SCHEME_THREAD_SANITIZER_STOP"_s, IC::NeedsXcodeAndCanCompileSources }, + { "XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER"_s, IC::NeedsXcodeAndCanCompileSources }, + { "XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER_STOP"_s, IC::NeedsXcodeAndCanCompileSources }, + { "XCODE_SCHEME_LAUNCH_CONFIGURATION"_s, IC::NeedsXcodeAndCanCompileSources }, + { "XCODE_SCHEME_ENABLE_GPU_API_VALIDATION"_s, IC::NeedsXcodeAndCanCompileSources }, + { "XCODE_SCHEME_ENABLE_GPU_SHADER_VALIDATION"_s, IC::NeedsXcodeAndCanCompileSources }, + { "XCODE_SCHEME_WORKING_DIRECTORY"_s, IC::NeedsXcodeAndCanCompileSources }, + { "XCODE_SCHEME_DISABLE_MAIN_THREAD_CHECKER"_s, IC::NeedsXcodeAndCanCompileSources }, + { "XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP"_s, IC::NeedsXcodeAndCanCompileSources }, + { "XCODE_SCHEME_MALLOC_SCRIBBLE"_s, IC::NeedsXcodeAndCanCompileSources }, + { "XCODE_SCHEME_MALLOC_GUARD_EDGES"_s, IC::NeedsXcodeAndCanCompileSources }, + { "XCODE_SCHEME_GUARD_MALLOC"_s, IC::NeedsXcodeAndCanCompileSources }, + { "XCODE_SCHEME_LAUNCH_MODE"_s, IC::NeedsXcodeAndCanCompileSources }, + { "XCODE_SCHEME_ZOMBIE_OBJECTS"_s, IC::NeedsXcodeAndCanCompileSources }, + { "XCODE_SCHEME_MALLOC_STACK"_s, IC::NeedsXcodeAndCanCompileSources }, + { "XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE"_s, IC::NeedsXcodeAndCanCompileSources }, + { "XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS"_s, IC::NeedsXcodeAndCanCompileSources }, + { "XCODE_SCHEME_ENVIRONMENT"_s, IC::NeedsXcodeAndCanCompileSources }, + { "XCODE_LINK_BUILD_PHASE_MODE"_s, "NONE"_s, IC::NeedsXcodeAndCanCompileSources }, +#endif + /* clang-format on */ +}; + +#undef COMMON_LANGUAGE_PROPERTIES +#undef IC +#undef R + } class cmTargetInternals @@ -562,15 +901,6 @@ std::pair<bool, cmValue> UsageRequirementProperty::Read( return { did_read, value }; } -namespace { -#define SETUP_COMMON_LANGUAGE_PROPERTIES(lang) \ - initProp(#lang "_COMPILER_LAUNCHER"); \ - initProp(#lang "_STANDARD"); \ - initProp(#lang "_STANDARD_REQUIRED"); \ - initProp(#lang "_EXTENSIONS"); \ - initProp(#lang "_VISIBILITY_PRESET") -} - cmTarget::cmTarget(std::string const& name, cmStateEnums::TargetType type, Visibility vis, cmMakefile* mf, PerConfig perConfig) : impl(cm::make_unique<cmTargetInternals>()) @@ -606,298 +936,6 @@ cmTarget::cmTarget(std::string const& name, cmStateEnums::TargetType type, this->impl->IsAndroid = (this->impl->Makefile->GetSafeDefinition( "CMAKE_SYSTEM_NAME") == "Android"); - std::string defKey; - defKey.reserve(128); - defKey += "CMAKE_"; - auto initProp = [this, mf, &defKey](const std::string& property) { - // Replace everything after "CMAKE_" - defKey.replace(defKey.begin() + 6, defKey.end(), property); - if (cmValue value = mf->GetDefinition(defKey)) { - this->SetProperty(property, value); - } - }; - auto initPropValue = [this, mf, &defKey](const std::string& property, - const char* default_value) { - // Replace everything after "CMAKE_" - defKey.replace(defKey.begin() + 6, defKey.end(), property); - if (cmValue value = mf->GetDefinition(defKey)) { - this->SetProperty(property, value); - } else if (default_value) { - this->SetProperty(property, default_value); - } - }; - - // Setup default property values. - if (this->CanCompileSources()) { - - // Compilation properties - initProp("INTERPROCEDURAL_OPTIMIZATION"); - // initProp("INTERPROCEDURAL_OPTIMIZATION_<CONFIG>"); (per-config block) - initProp("NO_SYSTEM_FROM_IMPORTED"); - initProp("VISIBILITY_INLINES_HIDDEN"); - initProp("COMPILE_WARNING_AS_ERROR"); - // -- Features - // ---- PCH - initProp("DISABLE_PRECOMPILE_HEADERS"); - initPropValue("PCH_WARN_INVALID", "ON"); - initPropValue("PCH_INSTANTIATE_TEMPLATES", "ON"); - // -- Platforms - // ---- Android - initProp("ANDROID_API"); - initProp("ANDROID_API_MIN"); - initProp("ANDROID_ARCH"); - initProp("ANDROID_ASSETS_DIRECTORIES"); - initProp("ANDROID_JAVA_SOURCE_DIR"); - initProp("ANDROID_STL_TYPE"); - // ---- macOS - initProp("OSX_ARCHITECTURES"); - // ---- Windows - initProp("MSVC_DEBUG_INFORMATION_FORMAT"); - initProp("MSVC_RUNTIME_LIBRARY"); - initProp("VS_JUST_MY_CODE_DEBUGGING"); - // ---- OpenWatcom - initProp("WATCOM_RUNTIME_LIBRARY"); - // -- Language - // ---- C - SETUP_COMMON_LANGUAGE_PROPERTIES(C); - // ---- C++ - SETUP_COMMON_LANGUAGE_PROPERTIES(CXX); - // ---- CUDA - SETUP_COMMON_LANGUAGE_PROPERTIES(CUDA); - initProp("CUDA_SEPARABLE_COMPILATION"); - initProp("CUDA_ARCHITECTURES"); - // ---- Fortran - initProp("Fortran_FORMAT"); - initProp("Fortran_MODULE_DIRECTORY"); - initProp("Fortran_COMPILER_LAUNCHER"); - initProp("Fortran_PREPROCESS"); - initProp("Fortran_VISIBILITY_PRESET"); - // ---- HIP - SETUP_COMMON_LANGUAGE_PROPERTIES(HIP); - initProp("HIP_ARCHITECTURES"); - // ---- ISPC - initProp("ISPC_COMPILER_LAUNCHER"); - initProp("ISPC_HEADER_DIRECTORY"); - initPropValue("ISPC_HEADER_SUFFIX", "_ispc.h"); - initProp("ISPC_INSTRUCTION_SETS"); - // ---- Objective C - SETUP_COMMON_LANGUAGE_PROPERTIES(OBJC); - // ---- Objective C++ - SETUP_COMMON_LANGUAGE_PROPERTIES(OBJCXX); - // ---- Swift - initProp("Swift_LANGUAGE_VERSION"); - initProp("Swift_MODULE_DIRECTORY"); - // ---- moc - initProp("AUTOMOC"); - initProp("AUTOMOC_COMPILER_PREDEFINES"); - initProp("AUTOMOC_MACRO_NAMES"); - initProp("AUTOMOC_MOC_OPTIONS"); - initProp("AUTOMOC_PATH_PREFIX"); - // ---- uic - initProp("AUTOUIC"); - initProp("AUTOUIC_OPTIONS"); - initProp("AUTOUIC_SEARCH_PATHS"); - // ---- rcc - initProp("AUTORCC"); - initProp("AUTORCC_OPTIONS"); - - // Linking properties - initProp("LINK_SEARCH_START_STATIC"); - initProp("LINK_SEARCH_END_STATIC"); - // -- Dependent library lookup - initProp("MACOSX_RPATH"); - // ---- Build - initProp("BUILD_RPATH"); - initProp("BUILD_RPATH_USE_ORIGIN"); - initPropValue("SKIP_BUILD_RPATH", "OFF"); - initPropValue("BUILD_WITH_INSTALL_RPATH", "OFF"); - initProp("BUILD_WITH_INSTALL_NAME_DIR"); - // ---- Install - initProp("INSTALL_NAME_DIR"); - initProp("INSTALL_REMOVE_ENVIRONMENT_RPATH"); - initPropValue("INSTALL_RPATH", ""); - initPropValue("INSTALL_RPATH_USE_LINK_PATH", "OFF"); - // -- Platforms - // ---- Android - initProp("ANDROID_JAR_DIRECTORIES"); - initProp("ANDROID_JAR_DEPENDENCIES"); - initProp("ANDROID_NATIVE_LIB_DIRECTORIES"); - initProp("ANDROID_NATIVE_LIB_DEPENDENCIES"); - initProp("ANDROID_PROGUARD"); - initProp("ANDROID_PROGUARD_CONFIG_PATH"); - initProp("ANDROID_SECURE_PROPS_PATH"); - // ---- iOS - initProp("IOS_INSTALL_COMBINED"); - // ---- Windows - initProp("GNUtoMS"); - initProp("WIN32_EXECUTABLE"); - // -- Languages - // ---- C - initProp("C_LINKER_LAUNCHER"); - // ---- C++ - initProp("CXX_LINKER_LAUNCHER"); - // ---- CUDA - initProp("CUDA_RESOLVE_DEVICE_SYMBOLS"); - initProp("CUDA_RUNTIME_LIBRARY"); - // ---- HIP - initProp("HIP_RUNTIME_LIBRARY"); - // ---- Objective C - initProp("OBJC_LINKER_LAUNCHER"); - // ---- Objective C++ - initProp("OBJCXX_LINKER_LAUNCHER"); - - // Static analysis - // -- C - initProp("C_CLANG_TIDY"); - initProp("C_CLANG_TIDY_EXPORT_FIXES_DIR"); - initProp("C_CPPLINT"); - initProp("C_CPPCHECK"); - initProp("C_INCLUDE_WHAT_YOU_USE"); - // -- C++ - initProp("CXX_CLANG_TIDY"); - initProp("CXX_CLANG_TIDY_EXPORT_FIXES_DIR"); - initProp("CXX_CPPLINT"); - initProp("CXX_CPPCHECK"); - initProp("CXX_INCLUDE_WHAT_YOU_USE"); - // -- Objective C - initProp("OBJC_CLANG_TIDY"); - initProp("OBJC_CLANG_TIDY_EXPORT_FIXES_DIR"); - // -- Objective C++ - initProp("OBJCXX_CLANG_TIDY"); - initProp("OBJCXX_CLANG_TIDY_EXPORT_FIXES_DIR"); - // -- Linking - initProp("LINK_WHAT_YOU_USE"); - - // Build graph properties - initProp("LINK_DEPENDS_NO_SHARED"); - initProp("UNITY_BUILD"); - initProp("UNITY_BUILD_UNIQUE_ID"); - initPropValue("UNITY_BUILD_BATCH_SIZE", "8"); - initPropValue("UNITY_BUILD_MODE", "BATCH"); - initProp("OPTIMIZE_DEPENDENCIES"); - // -- Android - initProp("ANDROID_ANT_ADDITIONAL_OPTIONS"); - initProp("ANDROID_PROCESS_MAX"); - initProp("ANDROID_SKIP_ANT_STEP"); - // -- Autogen - initProp("AUTOGEN_ORIGIN_DEPENDS"); - initProp("AUTOGEN_PARALLEL"); - // -- moc - initProp("AUTOMOC_DEPEND_FILTERS"); - // -- C++ - initProp("CXX_SCAN_FOR_MODULES"); - // -- Ninja - initProp("JOB_POOL_COMPILE"); - initProp("JOB_POOL_LINK"); - initProp("JOB_POOL_PRECOMPILE_HEADER"); - // -- Visual Studio - initProp("VS_NO_COMPILE_BATCHING"); - - // Output location properties - initProp("ARCHIVE_OUTPUT_DIRECTORY"); - initProp("LIBRARY_OUTPUT_DIRECTORY"); - initProp("RUNTIME_OUTPUT_DIRECTORY"); - initProp("PDB_OUTPUT_DIRECTORY"); - initProp("COMPILE_PDB_OUTPUT_DIRECTORY"); - - // -- macOS bundle properties - initProp("FRAMEWORK"); - initProp("FRAMEWORK_MULTI_CONFIG_POSTFIX"); - initProp("MACOSX_BUNDLE"); - - // Usage requirement properties - initProp("LINK_INTERFACE_LIBRARIES"); - - // Metadata - initProp("EXPORT_COMPILE_COMMANDS"); - -#ifdef __APPLE__ - if (this->GetGlobalGenerator()->IsXcode()) { - initProp("XCODE_SCHEME_ADDRESS_SANITIZER"); - initProp("XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN"); - initProp("XCODE_SCHEME_DEBUG_DOCUMENT_VERSIONING"); - initProp("XCODE_SCHEME_ENABLE_GPU_FRAME_CAPTURE_MODE"); - initProp("XCODE_SCHEME_THREAD_SANITIZER"); - initProp("XCODE_SCHEME_THREAD_SANITIZER_STOP"); - initProp("XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER"); - initProp("XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER_STOP"); - initProp("XCODE_SCHEME_LAUNCH_CONFIGURATION"); - initProp("XCODE_SCHEME_ENABLE_GPU_API_VALIDATION"); - initProp("XCODE_SCHEME_ENABLE_GPU_SHADER_VALIDATION"); - initProp("XCODE_SCHEME_WORKING_DIRECTORY"); - initProp("XCODE_SCHEME_DISABLE_MAIN_THREAD_CHECKER"); - initProp("XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP"); - initProp("XCODE_SCHEME_MALLOC_SCRIBBLE"); - initProp("XCODE_SCHEME_MALLOC_GUARD_EDGES"); - initProp("XCODE_SCHEME_GUARD_MALLOC"); - initProp("XCODE_SCHEME_LAUNCH_MODE"); - initProp("XCODE_SCHEME_ZOMBIE_OBJECTS"); - initProp("XCODE_SCHEME_MALLOC_STACK"); - initProp("XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE"); - initProp("XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS"); - initProp("XCODE_SCHEME_ENVIRONMENT"); - initPropValue("XCODE_LINK_BUILD_PHASE_MODE", "NONE"); - } -#endif - } - - initProp("FOLDER"); - initProp("VERIFY_INTERFACE_HEADER_SETS"); - - if (this->GetGlobalGenerator()->IsXcode()) { - initProp("XCODE_GENERATE_SCHEME"); - } - - // Setup per-configuration property default values. - if (this->GetType() != cmStateEnums::UTILITY && - this->GetType() != cmStateEnums::GLOBAL_TARGET) { - static const auto configProps = { - /* clang-format needs this comment to break after the opening brace */ - "ARCHIVE_OUTPUT_DIRECTORY_"_s, "LIBRARY_OUTPUT_DIRECTORY_"_s, - "RUNTIME_OUTPUT_DIRECTORY_"_s, "PDB_OUTPUT_DIRECTORY_"_s, - "COMPILE_PDB_OUTPUT_DIRECTORY_"_s, "MAP_IMPORTED_CONFIG_"_s, - "INTERPROCEDURAL_OPTIMIZATION_"_s - }; - // Collect the set of configuration types. - std::vector<std::string> configNames = - mf->GetGeneratorConfigs(cmMakefile::ExcludeEmptyConfig); - for (std::string const& configName : configNames) { - std::string configUpper = cmSystemTools::UpperCase(configName); - for (auto const& prop : configProps) { - // Interface libraries have no output locations, so honor only - // the configuration map. - if (this->impl->TargetType == cmStateEnums::INTERFACE_LIBRARY && - prop != "MAP_IMPORTED_CONFIG_") { - continue; - } - std::string property = cmStrCat(prop, configUpper); - initProp(property); - } - - // Initialize per-configuration name postfix property from the - // variable only for non-executable targets. This preserves - // compatibility with previous CMake versions in which executables - // did not support this variable. Projects may still specify the - // property directly. - if (this->impl->TargetType != cmStateEnums::EXECUTABLE && - this->impl->TargetType != cmStateEnums::INTERFACE_LIBRARY) { - std::string property = - cmStrCat(cmSystemTools::UpperCase(configName), "_POSTFIX"); - initProp(property); - } - - if (this->impl->TargetType == cmStateEnums::SHARED_LIBRARY || - this->impl->TargetType == cmStateEnums::STATIC_LIBRARY) { - std::string property = cmStrCat("FRAMEWORK_MULTI_CONFIG_POSTFIX_", - cmSystemTools::UpperCase(configName)); - initProp(property); - } - } - if (!this->IsImported()) { - initProp("LINK_LIBRARIES_ONLY_TARGETS"); - } - } - // Save the backtrace of target construction. this->impl->Backtrace = this->impl->Makefile->GetBacktrace(); @@ -921,23 +959,6 @@ cmTarget::cmTarget(std::string const& name, cmStateEnums::TargetType type, this->impl->Makefile->GetLinkDirectoriesEntries()); } - if (this->impl->TargetType == cmStateEnums::EXECUTABLE) { - initProp("ANDROID_GUI"); - initProp("CROSSCOMPILING_EMULATOR"); - initProp("ENABLE_EXPORTS"); - } - if (this->impl->TargetType == cmStateEnums::SHARED_LIBRARY || - this->impl->TargetType == cmStateEnums::MODULE_LIBRARY) { - this->SetProperty("POSITION_INDEPENDENT_CODE", "True"); - } else if (this->CanCompileSources()) { - initProp("POSITION_INDEPENDENT_CODE"); - } - if (this->impl->TargetType == cmStateEnums::SHARED_LIBRARY || - this->impl->TargetType == cmStateEnums::EXECUTABLE) { - initProp("AIX_EXPORT_ALL_SYMBOLS"); - initProp("WINDOWS_EXPORT_ALL_SYMBOLS"); - } - // Record current policies for later use. this->impl->Makefile->RecordPolicies(this->impl->PolicyMap); @@ -949,13 +970,105 @@ cmTarget::cmTarget(std::string const& name, cmStateEnums::TargetType type, this->impl->PolicyMap.Set(cmPolicies::CMP0022, cmPolicies::NEW); } + std::set<TargetProperty::InitCondition> metConditions; + metConditions.insert(TargetProperty::InitCondition::Always); + if (this->CanCompileSources()) { + metConditions.insert(TargetProperty::InitCondition::CanCompileSources); + } + if (this->GetGlobalGenerator()->IsXcode()) { + metConditions.insert(TargetProperty::InitCondition::NeedsXcode); + if (this->CanCompileSources()) { + metConditions.insert( + TargetProperty::InitCondition::NeedsXcodeAndCanCompileSources); + } + } if (!this->IsImported()) { - initProp("DOTNET_SDK"); + metConditions.insert(TargetProperty::InitCondition::NonImportedTarget); + } + if (this->impl->TargetType != cmStateEnums::UTILITY && + this->impl->TargetType != cmStateEnums::GLOBAL_TARGET) { + metConditions.insert(TargetProperty::InitCondition::NormalTarget); + if (!this->IsImported()) { + metConditions.insert( + TargetProperty::InitCondition::NormalNonImportedTarget); + } + if (this->impl->TargetType != cmStateEnums::INTERFACE_LIBRARY) { + metConditions.insert(TargetProperty::InitCondition::TargetWithArtifact); + if (this->impl->TargetType != cmStateEnums::EXECUTABLE) { + metConditions.insert( + TargetProperty::InitCondition::NonExecutableWithArtifact); + } + } + if (this->impl->TargetType == cmStateEnums::SHARED_LIBRARY || + this->impl->TargetType == cmStateEnums::STATIC_LIBRARY) { + metConditions.insert( + TargetProperty::InitCondition::LinkableLibraryTarget); + } + } + if (this->impl->TargetType == cmStateEnums::EXECUTABLE) { + metConditions.insert(TargetProperty::InitCondition::ExecutableTarget); + } + if (this->impl->TargetType == cmStateEnums::SHARED_LIBRARY || + this->impl->TargetType == cmStateEnums::EXECUTABLE) { + metConditions.insert( + TargetProperty::InitCondition::TargetWithSymbolExports); } - if (this->impl->TargetType <= cmStateEnums::GLOBAL_TARGET) { - initProp("DOTNET_TARGET_FRAMEWORK"); - initProp("DOTNET_TARGET_FRAMEWORK_VERSION"); + metConditions.insert(TargetProperty::InitCondition::TargetWithCommands); + } + + std::vector<std::string> configNames = + mf->GetGeneratorConfigs(cmMakefile::ExcludeEmptyConfig); + for (auto& config : configNames) { + config = cmSystemTools::UpperCase(config); + } + + std::string defKey; + defKey.reserve(128); + defKey += "CMAKE_"; + auto initProperty = [this, mf, &defKey](const std::string& property, + const char* default_value) { + // Replace everything after "CMAKE_" + defKey.replace(defKey.begin() + 6, defKey.end(), property); + if (cmValue value = mf->GetDefinition(defKey)) { + this->SetProperty(property, value); + } else if (default_value) { + this->SetProperty(property, default_value); + } + }; + + std::string dflt_storage; + for (auto const& tp : StaticTargetProperties) { + // Ignore properties that we have not met the condition for. + if (!metConditions.count(tp.InitConditional)) { + continue; + } + + const char* dflt = nullptr; + if (tp.Default) { + dflt_storage = std::string(*tp.Default); + dflt = dflt_storage.c_str(); + } + + if (tp.Repeat == TargetProperty::Repetition::Once) { + initProperty(std::string(tp.Name), dflt); + } else { + std::string propertyName; + for (auto const& configName : configNames) { + if (tp.Repeat == TargetProperty::Repetition::PerConfig) { + propertyName = cmStrCat(tp.Name, configName); + } else if (tp.Repeat == TargetProperty::Repetition::PerConfigPrefix) { + propertyName = cmStrCat(configName, tp.Name); + } + initProperty(propertyName, dflt); + } + } + } + + // Clean up some property defaults. + if (this->impl->TargetType == cmStateEnums::SHARED_LIBRARY || + this->impl->TargetType == cmStateEnums::MODULE_LIBRARY) { + this->SetProperty("POSITION_INDEPENDENT_CODE", "True"); } // check for "CMAKE_VS_GLOBALS" variable and set up target properties @@ -972,7 +1085,7 @@ cmTarget::cmTarget(std::string const& name, cmStateEnums::TargetType type, if (assignment != std::string::npos) { const std::string propName = vsGlobal + i.substr(0, assignment); const std::string propValue = i.substr(assignment + 1); - initPropValue(propName, propValue.c_str()); + initProperty(propName, propValue.c_str()); } } } |