| cmake_minimum_required(VERSION 3.19) # CMP0053 |
| |
| include(RunCMake) |
| |
| # Fix Visual Studio generator name |
| if(RunCMake_GENERATOR MATCHES "^(Visual Studio [0-9]+ [0-9]+) ") |
| set(RunCMake_GENERATOR "${CMAKE_MATCH_1}") |
| endif() |
| |
| set(RunCMake-check-file check.cmake) |
| |
| include("${RunCMake_SOURCE_DIR}/validate_schema.cmake") |
| |
| function(reset_cmake_presets_directory name) |
| set(RunCMake_TEST_SOURCE_DIR "${RunCMake_BINARY_DIR}/${name}") |
| file(REMOVE_RECURSE "${RunCMake_TEST_SOURCE_DIR}") |
| file(MAKE_DIRECTORY "${RunCMake_TEST_SOURCE_DIR}") |
| endfunction() |
| |
| function(run_cmake_presets name) |
| set(RunCMake_TEST_SOURCE_DIR "${RunCMake_BINARY_DIR}/${name}") |
| set(_source_arg "${RunCMake_TEST_SOURCE_DIR}") |
| if(CMakePresets_SOURCE_ARG) |
| set(_source_arg "${CMakePresets_SOURCE_ARG}") |
| endif() |
| |
| if(NOT RunCMake_TEST_SOURCE_DIR_NO_CLEAN) |
| file(REMOVE_RECURSE "${RunCMake_TEST_SOURCE_DIR}") |
| file(MAKE_DIRECTORY "${RunCMake_TEST_SOURCE_DIR}") |
| endif() |
| configure_file("${RunCMake_SOURCE_DIR}/CMakeLists.txt.in" "${RunCMake_TEST_SOURCE_DIR}/CMakeLists.txt" @ONLY) |
| |
| if(NOT CMakePresets_FILE) |
| set(CMakePresets_FILE "${RunCMake_SOURCE_DIR}/${name}.json.in") |
| endif() |
| if(EXISTS "${CMakePresets_FILE}") |
| configure_file("${CMakePresets_FILE}" "${RunCMake_TEST_SOURCE_DIR}/CMakePresets.json" @ONLY) |
| endif() |
| |
| if(NOT CMakeUserPresets_FILE) |
| set(CMakeUserPresets_FILE "${RunCMake_SOURCE_DIR}/${name}User.json.in") |
| endif() |
| if(EXISTS "${CMakeUserPresets_FILE}") |
| configure_file("${CMakeUserPresets_FILE}" "${RunCMake_TEST_SOURCE_DIR}/CMakeUserPresets.json" @ONLY) |
| endif() |
| |
| set(_CMakePresets_EXTRA_FILES_OUT) |
| set(_CMakePresets_EXTRA_FILES_SCHEMA_EXPECTED_RESULTS) |
| foreach(_extra_file IN LISTS CMakePresets_EXTRA_FILES) |
| cmake_path(RELATIVE_PATH _extra_file |
| BASE_DIRECTORY "${RunCMake_SOURCE_DIR}" |
| OUTPUT_VARIABLE _extra_file_relative |
| ) |
| string(REGEX REPLACE "\\.in$" "" _extra_file_out_relative "${_extra_file_relative}") |
| set(_extra_file_out "${RunCMake_TEST_SOURCE_DIR}/${_extra_file_out_relative}") |
| configure_file("${_extra_file}" "${_extra_file_out}" @ONLY) |
| list(APPEND _CMakePresets_EXTRA_FILES_OUT "${_extra_file_out}") |
| list(APPEND _CMakePresets_EXTRA_FILES_SCHEMA_EXPECTED_RESULTS 0) |
| endforeach() |
| |
| set(_s_arg -S) |
| if(CMakePresets_NO_S_ARG) |
| set(_s_arg) |
| endif() |
| set(_source_args ${_s_arg} ${_source_arg}) |
| if(CMakePresets_NO_SOURCE_ARGS) |
| set(_source_args) |
| endif() |
| set(_unused_cli --no-warn-unused-cli) |
| if(CMakePresets_WARN_UNUSED_CLI) |
| set(_unused_cli) |
| endif() |
| |
| set(RunCMake_TEST_COMMAND ${CMAKE_COMMAND} |
| ${_source_args} |
| -DRunCMake_TEST=${name} |
| -DRunCMake_GENERATOR=${RunCMake_GENERATOR} |
| -DCMAKE_MAKE_PROGRAM=${RunCMake_MAKE_PROGRAM} |
| ${_unused_cli} |
| --preset=${name} |
| ${ARGN} |
| ) |
| run_cmake(${name}) |
| endfunction() |
| |
| # Test CMakePresets.json errors |
| set(CMakePresets_SCHEMA_EXPECTED_RESULT 1) |
| run_cmake_presets(NoCMakePresets) |
| run_cmake_presets(Comment) |
| run_cmake_presets(JSONParseError) |
| run_cmake_presets(InvalidRoot) |
| run_cmake_presets(NoVersion) |
| run_cmake_presets(InvalidVersion) |
| run_cmake_presets(LowVersion) |
| run_cmake_presets(HighVersion) |
| run_cmake_presets(InvalidVendor) |
| set(CMakePresets_SCHEMA_EXPECTED_RESULT 0) |
| run_cmake_presets(NoPresets) |
| set(CMakePresets_SCHEMA_EXPECTED_RESULT 1) |
| run_cmake_presets(InvalidPresets) |
| run_cmake_presets(PresetNotObject) |
| run_cmake_presets(NoPresetName) |
| run_cmake_presets(InvalidPresetName) |
| run_cmake_presets(EmptyPresetName) |
| set(CMakePresets_SCHEMA_EXPECTED_RESULT 0) |
| run_cmake_presets(NoPresetGenerator) |
| set(CMakePresets_SCHEMA_EXPECTED_RESULT 1) |
| run_cmake_presets(InvalidPresetGenerator) |
| set(CMakePresets_SCHEMA_EXPECTED_RESULT 0) |
| run_cmake_presets(NoPresetBinaryDir) |
| set(CMakePresets_SCHEMA_EXPECTED_RESULT 1) |
| run_cmake_presets(InvalidPresetBinaryDir) |
| run_cmake_presets(InvalidVariables) |
| run_cmake_presets(VariableNotObject) |
| run_cmake_presets(NoVariableValue) |
| run_cmake_presets(InvalidVariableValue) |
| run_cmake_presets(ExtraRootField) |
| run_cmake_presets(ExtraPresetField) |
| run_cmake_presets(ExtraVariableField) |
| run_cmake_presets(FuturePresetInstallDirField) |
| run_cmake_presets(FuturePresetToolchainField) |
| run_cmake_presets(InvalidPresetVendor) |
| set(CMakePresets_SCHEMA_EXPECTED_RESULT 0) |
| run_cmake_presets(DuplicatePresets) |
| run_cmake_presets(CyclicInheritance0) |
| run_cmake_presets(CyclicInheritance1) |
| run_cmake_presets(CyclicInheritance2) |
| run_cmake_presets(InvalidInheritance) |
| run_cmake_presets(ErrorNoWarningDev) |
| run_cmake_presets(ErrorNoWarningDeprecated) |
| set(CMakePresets_SCHEMA_EXPECTED_RESULT 1) |
| run_cmake_presets(InvalidArchitectureStrategy) |
| run_cmake_presets(UnknownArchitectureStrategy) |
| run_cmake_presets(InvalidToolsetStrategy) |
| run_cmake_presets(UnknownToolsetStrategy) |
| run_cmake_presets(EmptyCacheKey) |
| run_cmake_presets(EmptyEnvKey) |
| set(CMakePresets_SCHEMA_EXPECTED_RESULT 0) |
| run_cmake_presets(UnclosedMacro) |
| run_cmake_presets(NoSuchMacro) |
| run_cmake_presets(EnvCycle) |
| run_cmake_presets(EmptyEnv) |
| run_cmake_presets(EmptyPenv) |
| run_cmake_presets(InvalidRegex) |
| set(CMakePresets_SCHEMA_EXPECTED_RESULT 1) |
| run_cmake_presets(ConditionFuture) |
| run_cmake_presets(SubConditionNull) |
| |
| # Test cmakeMinimumRequired field |
| run_cmake_presets(MinimumRequiredInvalid) |
| set(CMakePresets_SCHEMA_EXPECTED_RESULT 0) |
| run_cmake_presets(MinimumRequiredEmpty) |
| run_cmake_presets(MinimumRequiredMajor) |
| run_cmake_presets(MinimumRequiredMinor) |
| run_cmake_presets(MinimumRequiredPatch) |
| |
| # Test properly working CMakePresets.json |
| set(CMakePresets_FILE "${RunCMake_SOURCE_DIR}/CMakePresets.json.in") |
| unset(ENV{TEST_ENV}) |
| unset(ENV{TEST_ENV_REF}) |
| unset(ENV{TEST_D_ENV_REF}) |
| set(ENV{TEST_ENV_OVERRIDE} "This environment variable will be overridden") |
| set(ENV{TEST_PENV} "Process environment variable") |
| set(ENV{TEST_ENV_REF_PENV} "suffix") |
| run_cmake_presets(Good "-DTEST_OVERRIDE_1=Overridden value" "-DTEST_OVERRIDE_2:STRING=Overridden value" -C "${RunCMake_SOURCE_DIR}/CacheOverride.cmake" "-UTEST_UNDEF") |
| unset(ENV{TEST_ENV_OVERRIDE}) |
| unset(ENV{TEST_PENV}) |
| unset(ENV{TEST_ENV_REF_PENV}) |
| run_cmake_presets(GoodNoArgs) |
| file(REMOVE_RECURSE ${RunCMake_BINARY_DIR}/GoodBinaryUp-build) |
| run_cmake_presets(GoodBinaryUp) |
| set(CMakePresets_SOURCE_ARG "../GoodBinaryRelative") |
| run_cmake_presets(GoodBinaryRelative) |
| unset(CMakePresets_SOURCE_ARG) |
| run_cmake_presets(GoodSpaces "--preset" "Good Spaces") |
| run_cmake_presets(GoodSpacesEq "--preset=Good Spaces") |
| if(WIN32) |
| run_cmake_presets(GoodWindowsBackslash) |
| endif() |
| set(CMakePresets_FILE "${RunCMake_SOURCE_DIR}/GoodBOM.json.in") |
| run_cmake_presets(GoodBOM) |
| set(CMakePresets_FILE "${RunCMake_SOURCE_DIR}/CMakePresets.json.in") |
| file(REMOVE_RECURSE ${RunCMake_BINARY_DIR}/GoodBinaryCmdLine-build) |
| run_cmake_presets(GoodBinaryCmdLine -B ${RunCMake_BINARY_DIR}/GoodBinaryCmdLine-build) |
| run_cmake_presets(GoodGeneratorCmdLine -G ${RunCMake_GENERATOR}) |
| run_cmake_presets(InvalidGeneratorCmdLine -G "Invalid Generator") |
| set(CMakePresets_NO_S_ARG TRUE) |
| run_cmake_presets(GoodNoS) |
| set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/GoodNoSCachePrep-build") |
| run_cmake_presets(GoodNoSCachePrep) |
| set(CMakePresets_SOURCE_ARG ".") |
| set(RunCMake_TEST_NO_CLEAN 1) |
| run_cmake_presets(GoodNoSCache) |
| unset(RunCMake_TEST_NO_CLEAN) |
| unset(CMakePresets_SOURCE_ARG) |
| unset(RunCMake_TEST_BINARY_DIR) |
| unset(CMakePresets_NO_S_ARG) |
| set(CMakePresets_NO_SOURCE_ARGS 1) |
| set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/GoodNoSourceArg") |
| set(RunCMake_TEST_NO_CLEAN 1) |
| run_cmake_presets(GoodNoSourceArg) |
| unset(RunCMake_TEST_NO_CLEAN) |
| unset(RunCMake_TEST_BINARY_DIR) |
| unset(CMakePresets_NO_SOURCE_ARGS) |
| run_cmake_presets(GoodInheritanceParent) |
| run_cmake_presets(GoodInheritanceChild) |
| run_cmake_presets(GoodInheritanceOverride) |
| run_cmake_presets(GoodInheritanceMulti) |
| run_cmake_presets(GoodInheritanceMultiSecond) |
| run_cmake_presets(GoodInheritanceMacro) |
| |
| set(CMakePresets_FILE "${RunCMake_SOURCE_DIR}/GoodInstall.json.in") |
| run_cmake_presets(GoodInstallDefault) |
| run_cmake_presets(GoodInstallInherit) |
| run_cmake_presets(GoodInstallOverride) |
| run_cmake_presets(GoodInstallCommandLine "--install-prefix=${RunCMake_SOURCE_DIR}/path/passed/on/command_line") |
| |
| set(RunCMake_TEST_SOURCE_DIR_NO_CLEAN 1) |
| set(CMakePresets_FILE "${RunCMake_SOURCE_DIR}/GoodToolchain.json.in") |
| |
| reset_cmake_presets_directory(GoodToolchainInherit) |
| file(WRITE "${RunCMake_BINARY_DIR}/GoodToolchainDefault/toolchain.cmake" "") |
| run_cmake_presets(GoodToolchainDefault) |
| |
| reset_cmake_presets_directory(GoodToolchainInherit) |
| file(WRITE "${RunCMake_BINARY_DIR}/GoodToolchainInherit/toolchain.cmake" "") |
| run_cmake_presets(GoodToolchainInherit) |
| |
| reset_cmake_presets_directory(GoodToolchainOverride) |
| file(WRITE "${RunCMake_BINARY_DIR}/GoodToolchainOverride/override_toolchain.cmake" "") |
| run_cmake_presets(GoodToolchainOverride) |
| |
| reset_cmake_presets_directory(GoodToolchainCommandLine) |
| file(WRITE "${RunCMake_BINARY_DIR}/GoodToolchainCommandLine/cmd_line_toolchain.cmake" "") |
| run_cmake_presets(GoodToolchainCommandLine "--toolchain=${RunCMake_BINARY_DIR}/GoodToolchainCommandLine/cmd_line_toolchain.cmake") |
| |
| unset(RunCMake_TEST_SOURCE_DIR_NO_CLEAN) |
| |
| |
| set(CMakePresets_FILE "${RunCMake_SOURCE_DIR}/CMakePresets.json.in") |
| # Test bad preset arguments |
| run_cmake_presets(VendorMacro) |
| run_cmake_presets(InvalidGenerator) |
| |
| # Test Visual Studio-specific stuff |
| if(RunCMake_GENERATOR MATCHES "^Visual Studio ") |
| run_cmake_presets(VisualStudioGeneratorArch) |
| run_cmake_presets(VisualStudioWin32) |
| run_cmake_presets(VisualStudioWin64) |
| run_cmake_presets(VisualStudioWin32Override -A x64) |
| if(NOT RunCMake_GENERATOR STREQUAL "Visual Studio 9 2008") |
| run_cmake_presets(VisualStudioToolset) |
| run_cmake_presets(VisualStudioToolsetOverride -T "Test Toolset") |
| run_cmake_presets(VisualStudioInheritanceParent) |
| run_cmake_presets(VisualStudioInheritanceChild) |
| run_cmake_presets(VisualStudioInheritanceOverride) |
| run_cmake_presets(VisualStudioInheritanceMulti) |
| run_cmake_presets(VisualStudioInheritanceMultiSecond) |
| endif() |
| else() |
| run_cmake_presets(ArchToolsetStrategyNone) |
| run_cmake_presets(ArchToolsetStrategyDefault) |
| run_cmake_presets(ArchToolsetStrategyIgnore) |
| endif() |
| |
| # Test bad command line arguments |
| run_cmake_presets(NoSuchPreset) |
| run_cmake_presets(NoPresetArgument --preset) |
| run_cmake_presets(NoPresetArgumentEq --preset= -DA=B) |
| run_cmake_presets(UseHiddenPreset) |
| |
| # Test CMakeUserPresets.json |
| unset(CMakePresets_FILE) |
| run_cmake_presets(GoodUserOnly) |
| run_cmake_presets(GoodUserFromMain) |
| run_cmake_presets(GoodUserFromUser) |
| run_cmake_presets(V2InheritV3Optional) |
| |
| # Test CMakeUserPresets.json errors |
| run_cmake_presets(UserDuplicateInUser) |
| run_cmake_presets(UserDuplicateCross) |
| run_cmake_presets(UserInheritance) |
| |
| # Test listing presets |
| set(CMakePresets_FILE "${RunCMake_SOURCE_DIR}/ListPresets.json.in") |
| run_cmake_presets(ListPresets --list-presets) |
| |
| set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/ListPresetsWorkingDir") |
| set(RunCMake_TEST_NO_CLEAN 1) |
| set(CMakePresets_NO_SOURCE_ARGS 1) |
| run_cmake_presets(ListPresetsWorkingDir --list-presets) |
| unset(CMakePresets_NO_SOURCE_ARGS) |
| unset(RunCMake_TEST_NO_CLEAN) |
| unset(RunCMake_TEST_BINARY_DIR) |
| |
| run_cmake_presets(ListPresetsNoSuchPreset) |
| run_cmake_presets(ListPresetsHidden) |
| |
| # Test warning and error flags |
| set(CMakePresets_FILE "${RunCMake_SOURCE_DIR}/Warnings.json.in") |
| set(CMakePresets_WARN_UNUSED_CLI 1) |
| run_cmake_presets(NoWarningFlags) |
| run_cmake_presets(WarningFlags) |
| run_cmake_presets(DisableWarningFlags) |
| run_cmake_presets(ErrorDev) |
| run_cmake_presets(ErrorDeprecated) |
| unset(CMakePresets_WARN_UNUSED_CLI) |
| |
| # Test debug |
| set(CMakePresets_FILE "${RunCMake_SOURCE_DIR}/Debug.json.in") |
| run_cmake_presets(NoDebug) |
| run_cmake_presets(Debug) |
| |
| # Test ${hostSystemName} macro |
| set(CMakePresets_FILE "${RunCMake_SOURCE_DIR}/HostSystemName.json.in") |
| run_cmake_presets(HostSystemName) |
| set(CMakePresets_FILE "${RunCMake_SOURCE_DIR}/HostSystemNameFuture.json.in") |
| run_cmake_presets(HostSystemNameFuture) |
| |
| # Test ${fileDir} macro |
| set(CMakePresets_FILE "${RunCMake_SOURCE_DIR}/FileDir.json.in") |
| set(CMakePresets_EXTRA_FILES |
| "${RunCMake_SOURCE_DIR}/subdir/FileDir.json.in" |
| ) |
| run_cmake_presets(FileDir) |
| unset(CMakePresets_EXTRA_FILES) |
| set(CMakePresets_FILE "${RunCMake_SOURCE_DIR}/FileDirFuture.json.in") |
| run_cmake_presets(FileDirFuture) |
| |
| # Test conditions |
| set(CMakePresets_FILE "${RunCMake_SOURCE_DIR}/Conditions.json.in") |
| run_cmake_presets(ListConditions --list-presets) |
| run_cmake_presets(SimpleTrue) |
| run_cmake_presets(SimpleFalse) |
| unset(CMakePresets_FILE) |
| |
| # Test optional generator and buildDir fields |
| run_cmake_presets(OptionalBinaryDirField -B "${RunCMake_BINARY_DIR}/OptionalBinaryDirField/build") |
| run_cmake_presets(OptionalGeneratorField -G "${RunCMake_GENERATOR}") |
| set(CMakePresets_NO_S_ARG TRUE) |
| set(CMakePresets_SOURCE_ARG "../OptionalBinaryDirFieldNoS") |
| run_cmake_presets(OptionalBinaryDirFieldNoS) |
| unset(CMakePresets_SOURCE_ARG) |
| unset(CMakePresets_NO_S_ARG) |
| |
| # Test include field |
| set(CMakePresets_SCHEMA_EXPECTED_RESULT 1) |
| run_cmake_presets(IncludeV3) |
| set(CMakePresets_SCHEMA_EXPECTED_RESULT 0) |
| set(CMakePresets_EXTRA_FILES |
| "${RunCMake_SOURCE_DIR}/IncludeV4V3Extra.json.in" |
| ) |
| set(CMakePresets_EXTRA_FILES_SCHEMA_EXPECTED_RESULTS 1) |
| run_cmake_presets(IncludeV4V3) |
| unset(CMakePresets_EXTRA_FILES_SCHEMA_EXPECTED_RESULTS) |
| set(CMakePresets_EXTRA_FILES |
| "${RunCMake_SOURCE_DIR}/IncludeCommon.json.in" |
| "${RunCMake_SOURCE_DIR}/IncludeUserCommon.json.in" |
| "${RunCMake_SOURCE_DIR}/subdir/CMakePresets.json.in" |
| ) |
| run_cmake_presets(Include --list-presets) |
| unset(CMakePresets_EXTRA_FILES) |
| run_cmake_presets(IncludeNotFound) |
| run_cmake_presets(IncludeCycle) |
| set(CMakePresets_EXTRA_FILES |
| "${RunCMake_SOURCE_DIR}/IncludeCycle3Files2.json.in" |
| "${RunCMake_SOURCE_DIR}/IncludeCycle3Files3.json.in" |
| ) |
| run_cmake_presets(IncludeCycle3Files) |
| set(CMakePresets_EXTRA_FILES |
| "${RunCMake_SOURCE_DIR}/IncludeOutsideProjectIntermediate.json.in" |
| ) |
| run_cmake_presets(IncludeOutsideProject) |
| unset(CMakePresets_EXTRA_FILES) |
| run_cmake_presets(IncludeUserOutsideProject) |
| |
| # Test the example from the documentation |
| file(READ "${RunCMake_SOURCE_DIR}/../../../Help/manual/presets/example.json" _example) |
| string(REPLACE "\"generator\": \"Ninja\"" "\"generator\": \"@RunCMake_GENERATOR@\"" _example "${_example}") |
| if(CMAKE_HOST_WIN32) |
| string(REPLACE [["PATH": "$env{HOME}/ninja/bin:$penv{PATH}"]] [["PATH": "$env{HOME}/ninja/bin;$penv{PATH}"]] _example "${_example}") |
| endif() |
| file(WRITE "${RunCMake_BINARY_DIR}/example.json.in" "${_example}") |
| set(CMakePresets_FILE "${RunCMake_BINARY_DIR}/example.json.in") |
| set(CMakePresets_EXTRA_FILES |
| "${RunCMake_SOURCE_DIR}/otherThings.json.in" |
| "${RunCMake_SOURCE_DIR}/moreThings.json.in" |
| ) |
| run_cmake_presets(DocumentationExample --preset=default) |
| unset(CMakePresets_EXTRA_FILES) |