diff options
78 files changed, 786 insertions, 472 deletions
diff --git a/Help/command/try_compile.rst b/Help/command/try_compile.rst index e03ab80..73dd9d3 100644 --- a/Help/command/try_compile.rst +++ b/Help/command/try_compile.rst @@ -41,7 +41,7 @@ Try Compiling Source Files .. code-block:: cmake - try_compile(<resultVar> <bindir> <srcfile|SOURCES srcfile...> + try_compile(<resultVar> SOURCES <srcfile...> [CMAKE_FLAGS <flags>...] [COMPILE_DEFINITIONS <defs>...] [LINK_OPTIONS <options>...] @@ -53,6 +53,8 @@ Try Compiling Source Files [<LANG>_EXTENSIONS <bool>] ) +.. versionadded:: 3.25 + Try building an executable or static library from one or more source files (which one is determined by the :variable:`CMAKE_TRY_COMPILE_TARGET_TYPE` variable). The success or failure of the ``try_compile``, i.e. ``TRUE`` or @@ -76,6 +78,39 @@ contain something like the following: target_link_options(cmTryCompileExec PRIVATE <LINK_OPTIONS from caller>) target_link_libraries(cmTryCompileExec ${LINK_LIBRARIES}) +CMake will automatically generate a unique directory for each ``try_compile`` +operation in an unspecified location within the project's binary directory. +These directories will be cleaned automatically unless +:option:`--debug-trycompile <cmake --debug-trycompile>` is passed to ``cmake``. +Such directories from previous runs are also unconditionally cleaned at the +beginning of any ``cmake`` execution. + +This command also supports an alternate signature +which was present in older versions of CMake: + +.. code-block:: cmake + + try_compile(<resultVar> <bindir> <srcfile|SOURCES srcfile...> + [CMAKE_FLAGS <flags>...] + [COMPILE_DEFINITIONS <defs>...] + [LINK_OPTIONS <options>...] + [LINK_LIBRARIES <libs>...] + [OUTPUT_VARIABLE <var>] + [COPY_FILE <fileName> [COPY_FILE_ERROR <var>]] + [<LANG>_STANDARD <std>] + [<LANG>_STANDARD_REQUIRED <bool>] + [<LANG>_EXTENSIONS <bool>] + ) + +In this version, ``try_compile`` will use ``<bindir>/CMakeFiles/CMakeTmp`` for +its operation, and all such files will be cleaned automatically. +For debugging, :option:`--debug-trycompile <cmake --debug-trycompile>` can be +passed to ``cmake`` to avoid this clean. However, multiple sequential +``try_compile`` operations, if given the same ``<bindir>``, will reuse this +single output directory, such that you can only debug one such ``try_compile`` +call at a time. Use of the newer signature is recommended to simplify +debugging of multiple ``try_compile`` operations. + The options are: ``CMAKE_FLAGS <flags>...`` @@ -136,18 +171,6 @@ The options are: :prop_tgt:`OBJC_EXTENSIONS`, :prop_tgt:`OBJCXX_EXTENSIONS`, or :prop_tgt:`CUDA_EXTENSIONS` target property of the generated project. -In this version all files in ``<bindir>/CMakeFiles/CMakeTmp`` will be -cleaned automatically. For debugging, -:option:`--debug-trycompile <cmake --debug-trycompile>` can be -passed to ``cmake`` to avoid this clean. However, multiple sequential -``try_compile`` operations reuse this single output directory. If you use -:option:`--debug-trycompile <cmake --debug-trycompile>`, you can only debug -one ``try_compile`` call at a time. The recommended procedure is to protect -all ``try_compile`` calls in your project by ``if(NOT DEFINED <resultVar>)`` -logic, configure with cmake all the way through once, then delete the cache -entry associated with the try_compile call of interest, and then re-run cmake -again with :option:`--debug-trycompile <cmake --debug-trycompile>`. - Other Behavior Settings ^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/Help/command/try_run.rst b/Help/command/try_run.rst index 938869b..1dc2355 100644 --- a/Help/command/try_run.rst +++ b/Help/command/try_run.rst @@ -12,62 +12,68 @@ Try Compiling and Running Source Files .. code-block:: cmake - try_run(<runResultVar> <compileResultVar> - <bindir> <srcfile> [CMAKE_FLAGS <flags>...] + try_run(<runResultVar> <compileResultVar> SOURCES <srcfile...> + [CMAKE_FLAGS <flags>...] [COMPILE_DEFINITIONS <defs>...] [LINK_OPTIONS <options>...] [LINK_LIBRARIES <libs>...] [COMPILE_OUTPUT_VARIABLE <var>] + [COPY_FILE <fileName> [COPY_FILE_ERROR <var>]] + [<LANG>_STANDARD <std>] + [<LANG>_STANDARD_REQUIRED <bool>] + [<LANG>_EXTENSIONS <bool>] [RUN_OUTPUT_VARIABLE <var>] [RUN_OUTPUT_STDOUT_VARIABLE <var>] [RUN_OUTPUT_STDERR_VARIABLE <var>] [OUTPUT_VARIABLE <var>] [WORKING_DIRECTORY <var>] - [ARGS <args>...]) + [ARGS <args>...] + ) + +.. versionadded:: 3.25 Try compiling a ``<srcfile>``. Returns ``TRUE`` or ``FALSE`` for success or failure in ``<compileResultVar>``. If the compile succeeded, runs the executable and returns its exit code in ``<runResultVar>``. If the executable was built, but failed to run, then ``<runResultVar>`` will be set to ``FAILED_TO_RUN``. See the :command:`try_compile` command for -information on how the test project is constructed to build the source file. +documentation of options common to both commands, and for information on how +the test project is constructed to build the source file. -The options are: +This command also supports an alternate signature +which was present in older versions of CMake: -``CMAKE_FLAGS <flags>...`` - Specify flags of the form :option:`-DVAR:TYPE=VALUE <cmake -D>` to be passed - to the :manual:`cmake(1)` command-line used to drive the test build. - The example in :command:`try_compile` shows how values for variables - ``INCLUDE_DIRECTORIES``, ``LINK_DIRECTORIES``, and ``LINK_LIBRARIES`` - are used. +.. code-block:: cmake + + try_run(<runResultVar> <compileResultVar> + <bindir> <srcfile|SOURCES srcfile...> + [CMAKE_FLAGS <flags>...] + [COMPILE_DEFINITIONS <defs>...] + [LINK_OPTIONS <options>...] + [LINK_LIBRARIES <libs>...] + [COMPILE_OUTPUT_VARIABLE <var>] + [COPY_FILE <fileName> [COPY_FILE_ERROR <var>]] + [<LANG>_STANDARD <std>] + [<LANG>_STANDARD_REQUIRED <bool>] + [<LANG>_EXTENSIONS <bool>] + [RUN_OUTPUT_VARIABLE <var>] + [RUN_OUTPUT_STDOUT_VARIABLE <var>] + [RUN_OUTPUT_STDERR_VARIABLE <var>] + [OUTPUT_VARIABLE <var>] + [WORKING_DIRECTORY <var>] + [ARGS <args>...] + ) -``COMPILE_DEFINITIONS <defs>...`` - Specify ``-Ddefinition`` arguments to pass to :command:`add_definitions` - in the generated test project. +The options specific to ``try_run`` are: ``COMPILE_OUTPUT_VARIABLE <var>`` Report the compile step build output in a given variable. -``LINK_LIBRARIES <libs>...`` - .. versionadded:: 3.2 - - Specify libraries to be linked in the generated project. - The list of libraries may refer to system libraries and to - :ref:`Imported Targets <Imported Targets>` from the calling project. - - If this option is specified, any ``-DLINK_LIBRARIES=...`` value - given to the ``CMAKE_FLAGS`` option will be ignored. - -``LINK_OPTIONS <options>...`` - .. versionadded:: 3.14 - - Specify link step options to pass to :command:`target_link_options` in the - generated project. - ``OUTPUT_VARIABLE <var>`` Report the compile build output and the output from running the executable - in the given variable. This option exists for legacy reasons. Prefer - ``COMPILE_OUTPUT_VARIABLE`` and ``RUN_OUTPUT_VARIABLE`` instead. + in the given variable. This option exists for legacy reasons and is only + supported by the old ``try_run`` signature. + Prefer ``COMPILE_OUTPUT_VARIABLE`` and ``RUN_OUTPUT_VARIABLE`` instead. ``RUN_OUTPUT_VARIABLE <var>`` Report the output from running the executable in a given variable. @@ -86,7 +92,11 @@ The options are: .. versionadded:: 3.20 Run the executable in the given directory. If no ``WORKING_DIRECTORY`` is - specified, the executable will run in ``<bindir>``. + specified, the executable will run in ``<bindir>`` or the current build + directory. + +``ARGS <args>...`` + Additional arguments to pass to the executable when running it. Other Behavior Settings ^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/Help/release/dev/try_compile-signatures.rst b/Help/release/dev/try_compile-signatures.rst new file mode 100644 index 0000000..d477d989 --- /dev/null +++ b/Help/release/dev/try_compile-signatures.rst @@ -0,0 +1,8 @@ +try_compile-signatures +---------------------- + +* The :command:`try_compile` and :command:`try_run` commands gained new + signatures that more consistently use keyword dispatch and do not require a + binary directory to be specified. Additionally, these signatures use a + unique directory for each invocation, which allows multiple outputs to be + preserved when using ``--debug-trycompile``. diff --git a/Source/cmCoreTryCompile.cxx b/Source/cmCoreTryCompile.cxx index 7b9dc2e..0a6c359 100644 --- a/Source/cmCoreTryCompile.cxx +++ b/Source/cmCoreTryCompile.cxx @@ -31,6 +31,7 @@ #include "cmake.h" namespace { +constexpr const char* unique_binary_directory = "CMAKE_BINARY_DIR_USE_MKDTEMP"; constexpr size_t lang_property_start = 0; constexpr size_t lang_property_size = 4; constexpr size_t pie_property_start = 4; @@ -122,13 +123,9 @@ ArgumentParser::Continue TryCompileCompileDefs(Arguments& args, .Bind(#lang "_STANDARD_REQUIRED"_s, TryCompileLangProp) \ .Bind(#lang "_EXTENSIONS"_s, TryCompileLangProp) -auto const TryCompileArgParser = +auto const TryCompileBaseArgParser = cmArgumentParser<Arguments>{} .Bind(0, &Arguments::CompileResultVariable) - .Bind(1, &Arguments::BinaryDirectory) - .Bind(2, &Arguments::SourceDirectoryOrFile) - .Bind(3, &Arguments::ProjectName) - .Bind(4, &Arguments::TargetName) .Bind("SOURCES"_s, &Arguments::Sources) .Bind("CMAKE_FLAGS"_s, &Arguments::CMakeFlags) .Bind("COMPILE_DEFINITIONS"_s, TryCompileCompileDefs, @@ -136,7 +133,6 @@ auto const TryCompileArgParser = .Bind("LINK_LIBRARIES"_s, &Arguments::LinkLibraries) .Bind("LINK_OPTIONS"_s, &Arguments::LinkOptions) .Bind("__CMAKE_INTERNAL"_s, &Arguments::CMakeInternal) - .Bind("OUTPUT_VARIABLE"_s, &Arguments::OutputVariable) .Bind("COPY_FILE"_s, &Arguments::CopyFileTo) .Bind("COPY_FILE_ERROR"_s, &Arguments::CopyFileError) .BIND_LANG_PROPS(C) @@ -147,8 +143,31 @@ auto const TryCompileArgParser = .BIND_LANG_PROPS(OBJCXX) /* keep semicolon on own line */; -auto const TryRunArgParser = +auto const TryCompileArgParser = + cmArgumentParser<Arguments>{ TryCompileBaseArgParser }.Bind( + "OUTPUT_VARIABLE"_s, &Arguments::OutputVariable) + /* keep semicolon on own line */; + +auto const TryCompileOldArgParser = cmArgumentParser<Arguments>{ TryCompileArgParser } + .Bind(1, &Arguments::BinaryDirectory) + .Bind(2, &Arguments::SourceDirectoryOrFile) + .Bind(3, &Arguments::ProjectName) + .Bind(4, &Arguments::TargetName) + /* keep semicolon on own line */; + +auto const TryRunArgParser = + cmArgumentParser<Arguments>{ TryCompileBaseArgParser } + .Bind("COMPILE_OUTPUT_VARIABLE"_s, &Arguments::CompileOutputVariable) + .Bind("RUN_OUTPUT_VARIABLE"_s, &Arguments::RunOutputVariable) + .Bind("RUN_OUTPUT_STDOUT_VARIABLE"_s, &Arguments::RunOutputStdOutVariable) + .Bind("RUN_OUTPUT_STDERR_VARIABLE"_s, &Arguments::RunOutputStdErrVariable) + .Bind("WORKING_DIRECTORY"_s, &Arguments::RunWorkingDirectory) + .Bind("ARGS"_s, &Arguments::RunArgs) + /* keep semicolon on own line */; + +auto const TryRunOldArgParser = + cmArgumentParser<Arguments>{ TryCompileOldArgParser } .Bind("COMPILE_OUTPUT_VARIABLE"_s, &Arguments::CompileOutputVariable) .Bind("RUN_OUTPUT_VARIABLE"_s, &Arguments::RunOutputVariable) .Bind("RUN_OUTPUT_STDOUT_VARIABLE"_s, &Arguments::RunOutputStdOutVariable) @@ -161,10 +180,10 @@ auto const TryRunArgParser = } Arguments cmCoreTryCompile::ParseArgs( - cmRange<std::vector<std::string>::const_iterator> args, bool isTryRun) + const cmRange<std::vector<std::string>::const_iterator>& args, + const cmArgumentParser<Arguments>& parser, + std::vector<std::string>& unparsedArguments) { - std::vector<std::string> unparsedArguments; - const auto& parser = (isTryRun ? TryRunArgParser : TryCompileArgParser); auto arguments = parser.Parse(args, &unparsedArguments, 0); if (!arguments.MaybeReportError(*(this->Makefile)) && !unparsedArguments.empty()) { @@ -174,6 +193,26 @@ Arguments cmCoreTryCompile::ParseArgs( } this->Makefile->IssueMessage(MessageType::AUTHOR_WARNING, m); } + return arguments; +} + +Arguments cmCoreTryCompile::ParseArgs( + cmRange<std::vector<std::string>::const_iterator> args, bool isTryRun) +{ + std::vector<std::string> unparsedArguments; + if (cmHasLiteralPrefix(*(++args.begin()), "SOURCE")) { + // New signature. + auto arguments = + this->ParseArgs(args, isTryRun ? TryRunArgParser : TryCompileArgParser, + unparsedArguments); + arguments.BinaryDirectory = unique_binary_directory; + return arguments; + } + + // Old signature. + auto arguments = this->ParseArgs( + args, isTryRun ? TryRunOldArgParser : TryCompileOldArgParser, + unparsedArguments); // For historical reasons, treat some empty-valued keyword // arguments as if they were not specified at all. if (arguments.OutputVariable && arguments.OutputVariable->empty()) { @@ -210,6 +249,7 @@ bool cmCoreTryCompile::TryCompileCode(Arguments& arguments, // which signature were we called with ? this->SrcFileSignature = true; + bool useUniqueBinaryDirectory = false; std::string sourceDirectory; std::string projectName; std::string targetName; @@ -230,7 +270,17 @@ bool cmCoreTryCompile::TryCompileCode(Arguments& arguments, targetName = targetNameBuf; } - if (arguments.BinaryDirectory && !arguments.BinaryDirectory->empty()) { + if (!arguments.BinaryDirectory || arguments.BinaryDirectory->empty()) { + this->Makefile->IssueMessage(MessageType::FATAL_ERROR, + "No <bindir> specified."); + return false; + } + if (*arguments.BinaryDirectory == unique_binary_directory) { + // leave empty until we're ready to create it, so we don't try to remove + // a non-existing directory if we abort due to e.g. bad arguments + this->BinaryDirectory.clear(); + useUniqueBinaryDirectory = true; + } else { if (!cmSystemTools::FileIsFullPath(*arguments.BinaryDirectory)) { this->Makefile->IssueMessage( MessageType::FATAL_ERROR, @@ -244,10 +294,6 @@ bool cmCoreTryCompile::TryCompileCode(Arguments& arguments, if (this->SrcFileSignature) { this->BinaryDirectory += "/CMakeFiles/CMakeTmp"; } - } else { - this->Makefile->IssueMessage(MessageType::FATAL_ERROR, - "No <bindir> specified."); - return false; } std::vector<std::string> targets; @@ -331,7 +377,14 @@ bool cmCoreTryCompile::TryCompileCode(Arguments& arguments, } } // make sure the binary directory exists - cmSystemTools::MakeDirectory(this->BinaryDirectory); + if (useUniqueBinaryDirectory) { + this->BinaryDirectory = + cmStrCat(this->Makefile->GetHomeOutputDirectory(), + "/CMakeFiles/CMakeScratch/TryCompile-XXXXXX"); + cmSystemTools::MakeTempDirectory(this->BinaryDirectory); + } else { + cmSystemTools::MakeDirectory(this->BinaryDirectory); + } // do not allow recursive try Compiles if (this->BinaryDirectory == this->Makefile->GetHomeOutputDirectory()) { @@ -635,7 +688,7 @@ bool cmCoreTryCompile::TryCompileCode(Arguments& arguments, fprintf(fout, " \"%s\"", si.c_str()); // Add dependencies on any non-temporary sources. - if (si.find("CMakeTmp") == std::string::npos) { + if (!IsTemporary(si)) { this->Makefile->AddCMakeDependFile(si); } } @@ -914,17 +967,23 @@ bool cmCoreTryCompile::TryCompileCode(Arguments& arguments, return res == 0; } +bool cmCoreTryCompile::IsTemporary(std::string const& path) +{ + return ((path.find("CMakeTmp") != std::string::npos) || + (path.find("CMakeScratch") != std::string::npos)); +} + void cmCoreTryCompile::CleanupFiles(std::string const& binDir) { if (binDir.empty()) { return; } - if (binDir.find("CMakeTmp") == std::string::npos) { + if (!IsTemporary(binDir)) { cmSystemTools::Error( "TRY_COMPILE attempt to remove -rf directory that does not contain " - "CMakeTmp:" + - binDir); + "CMakeTmp or CMakeScratch: \"" + + binDir + "\""); return; } @@ -970,6 +1029,10 @@ void cmCoreTryCompile::CleanupFiles(std::string const& binDir) } } } + + if (binDir.find("CMakeScratch") != std::string::npos) { + cmSystemTools::RemoveADirectory(binDir); + } } void cmCoreTryCompile::FindOutputFile(const std::string& targetName, diff --git a/Source/cmCoreTryCompile.h b/Source/cmCoreTryCompile.h index deefe57..b483f0f 100644 --- a/Source/cmCoreTryCompile.h +++ b/Source/cmCoreTryCompile.h @@ -67,14 +67,22 @@ public: bool isTryRun); /** - * This is the core code for try compile. It is here so that other - * commands, such as TryRun can access the same logic without - * duplication. + * This is the core code for try compile. It is here so that other commands, + * such as TryRun can access the same logic without duplication. + * + * This function requires at least two \p arguments and will crash if given + * fewer. */ bool TryCompileCode(Arguments& arguments, cmStateEnums::TargetType targetType); /** + * Returns \c true if \p path resides within a CMake temporary directory, + * otherwise returns \c false. + */ + static bool IsTemporary(std::string const& path); + + /** * This deletes all the files created by TryCompileCode. * This way we do not have to rely on the timing and * dependencies of makefiles. @@ -94,4 +102,10 @@ public: std::string FindErrorMessage; bool SrcFileSignature = false; cmMakefile* Makefile; + +private: + Arguments ParseArgs( + const cmRange<std::vector<std::string>::const_iterator>& args, + const cmArgumentParser<Arguments>& parser, + std::vector<std::string>& unparsedArguments); }; diff --git a/Source/cmake.cxx b/Source/cmake.cxx index 9b2b119..c792d4a 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -2130,6 +2130,9 @@ int cmake::ActualConfigure() this->UpdateConversionPathTable(); this->CleanupCommandsAndMacros(); + cmSystemTools::RemoveADirectory(this->GetHomeOutputDirectory() + + "/CMakeFiles/CMakeScratch"); + int res = this->DoPreConfigureChecks(); if (res < 0) { return -2; diff --git a/Tests/RunCMake/try_compile/BadLinkLibraries-stderr.txt b/Tests/RunCMake/try_compile/BadLinkLibraries-stderr.txt index 652bcfc..4e41a19 100644 --- a/Tests/RunCMake/try_compile/BadLinkLibraries-stderr.txt +++ b/Tests/RunCMake/try_compile/BadLinkLibraries-stderr.txt @@ -1,4 +1,4 @@ -CMake Error at BadLinkLibraries.cmake:2 \(try_compile\): +CMake Error at BadLinkLibraries.cmake:[0-9]+ \(try_compile\): Only libraries may be used as try_compile or try_run IMPORTED LINK_LIBRARIES. Got not_a_library of type UTILITY. Call Stack \(most recent call first\): diff --git a/Tests/RunCMake/try_compile/BadLinkLibraries.cmake b/Tests/RunCMake/try_compile/BadLinkLibraries.cmake index e8b5add..b758e23 100644 --- a/Tests/RunCMake/try_compile/BadLinkLibraries.cmake +++ b/Tests/RunCMake/try_compile/BadLinkLibraries.cmake @@ -1,3 +1,7 @@ +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) + add_custom_target(not_a_library) -try_compile(RESULT ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src.c + +try_compile(RESULT ${try_compile_bindir_or_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/src.c LINK_LIBRARIES not_a_library) diff --git a/Tests/RunCMake/try_compile/BadSources1-stderr.txt b/Tests/RunCMake/try_compile/BadSources1-stderr.txt index 864a294..ddcba4f 100644 --- a/Tests/RunCMake/try_compile/BadSources1-stderr.txt +++ b/Tests/RunCMake/try_compile/BadSources1-stderr.txt @@ -1,4 +1,4 @@ -CMake Error at BadSources1.cmake:1 \(try_compile\): +CMake Error at BadSources1.cmake:[0-9]+ \(try_compile\): Unknown extension ".c" for file .*/Tests/RunCMake/try_compile/src.c diff --git a/Tests/RunCMake/try_compile/BadSources1.cmake b/Tests/RunCMake/try_compile/BadSources1.cmake index aa4dc5e..c95935d 100644 --- a/Tests/RunCMake/try_compile/BadSources1.cmake +++ b/Tests/RunCMake/try_compile/BadSources1.cmake @@ -1 +1,3 @@ -try_compile(RESULT ${CMAKE_CURRENT_BINARY_DIR} SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src.c) +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) +try_compile(RESULT ${try_compile_bindir_or_SOURCES} + ${try_compile_redundant_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/src.c) diff --git a/Tests/RunCMake/try_compile/BadSources2-stderr.txt b/Tests/RunCMake/try_compile/BadSources2-stderr.txt index 3313f99..953dd9c 100644 --- a/Tests/RunCMake/try_compile/BadSources2-stderr.txt +++ b/Tests/RunCMake/try_compile/BadSources2-stderr.txt @@ -1,4 +1,4 @@ -CMake Error at BadSources2.cmake:2 \(try_compile\): +CMake Error at BadSources2.cmake:[0-9]+ \(try_compile\): Unknown extension ".cxx" for file .*/Tests/RunCMake/try_compile/src.cxx diff --git a/Tests/RunCMake/try_compile/BadSources2.cmake b/Tests/RunCMake/try_compile/BadSources2.cmake index ed2b036..3f22bb6 100644 --- a/Tests/RunCMake/try_compile/BadSources2.cmake +++ b/Tests/RunCMake/try_compile/BadSources2.cmake @@ -1,5 +1,6 @@ +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) enable_language(C) -try_compile(RESULT ${CMAKE_CURRENT_BINARY_DIR} - SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src.c - ${CMAKE_CURRENT_SOURCE_DIR}/src.cxx +try_compile(RESULT ${try_compile_bindir_or_SOURCES} + ${try_compile_redundant_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/src.c + ${CMAKE_CURRENT_SOURCE_DIR}/src.cxx ) diff --git a/Tests/RunCMake/try_compile/CStandard-stderr.txt b/Tests/RunCMake/try_compile/CStandard-stderr.txt index 209afcc..c3c48a1 100644 --- a/Tests/RunCMake/try_compile/CStandard-stderr.txt +++ b/Tests/RunCMake/try_compile/CStandard-stderr.txt @@ -1,4 +1,4 @@ -^CMake Error at .*/Tests/RunCMake/try_compile/CStandard-build/CMakeFiles/CMakeTmp/CMakeLists.txt:[0-9]+ \(add_executable\): +^CMake Error at .*/Tests/RunCMake/try_compile/CStandard-build/CMakeFiles/CMake(Tmp|Scratch/TryCompile-[^/]+)/CMakeLists.txt:[0-9]+ \(add_executable\): C_STANDARD is set to invalid value '3' + CMake Error at CStandard.cmake:[0-9]+ \(try_compile\): diff --git a/Tests/RunCMake/try_compile/CStandard.cmake b/Tests/RunCMake/try_compile/CStandard.cmake index 2849ed4..6ac04db 100644 --- a/Tests/RunCMake/try_compile/CStandard.cmake +++ b/Tests/RunCMake/try_compile/CStandard.cmake @@ -1,7 +1,11 @@ +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) + enable_language(C) -try_compile(result ${CMAKE_CURRENT_BINARY_DIR} - SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src.c + +try_compile(result ${try_compile_bindir_or_SOURCES} + ${try_compile_redundant_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/src.c C_STANDARD 3 OUTPUT_VARIABLE out ) + message("try_compile output:\n${out}") diff --git a/Tests/RunCMake/try_compile/CStandardGNU.cmake b/Tests/RunCMake/try_compile/CStandardGNU.cmake index 79ae874..10a4384 100644 --- a/Tests/RunCMake/try_compile/CStandardGNU.cmake +++ b/Tests/RunCMake/try_compile/CStandardGNU.cmake @@ -1,23 +1,30 @@ +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) + enable_language(C) -try_compile(result ${CMAKE_CURRENT_BINARY_DIR} - SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/CStandardGNU.c + +try_compile(result ${try_compile_bindir_or_SOURCES} + ${try_compile_redundant_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/CStandardGNU.c C_STANDARD 99 C_STANDARD_REQUIRED 1 C_EXTENSIONS 0 OUTPUT_VARIABLE out ) + if(NOT result) message(FATAL_ERROR "try_compile failed:\n${out}") endif() cmake_policy(SET CMP0067 NEW) + set(CMAKE_C_STANDARD 99) set(CMAKE_C_STANDARD_REQUIRED 1) set(CMAKE_C_EXTENSIONS 0) -try_compile(result ${CMAKE_CURRENT_BINARY_DIR} - SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/CStandardGNU.c + +try_compile(result ${try_compile_bindir_or_SOURCES} + ${try_compile_redundant_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/CStandardGNU.c OUTPUT_VARIABLE out ) + if(NOT result) message(FATAL_ERROR "try_compile failed:\n${out}") endif() diff --git a/Tests/RunCMake/try_compile/CStandardNoDefault.cmake b/Tests/RunCMake/try_compile/CStandardNoDefault.cmake index 97e72ea..f4dd5ae 100644 --- a/Tests/RunCMake/try_compile/CStandardNoDefault.cmake +++ b/Tests/RunCMake/try_compile/CStandardNoDefault.cmake @@ -1,9 +1,13 @@ +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) + enable_language(C) -try_compile(result ${CMAKE_CURRENT_BINARY_DIR} - SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src.c + +try_compile(result ${try_compile_bindir_or_SOURCES} + ${try_compile_redundant_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/src.c C_STANDARD 3 # bogus, but not used OUTPUT_VARIABLE out ) + if(NOT result) message(FATAL_ERROR "try_compile failed:\n${out}") endif() diff --git a/Tests/RunCMake/try_compile/CopyFileErrorNoCopyFile-stderr.txt b/Tests/RunCMake/try_compile/CopyFileErrorNoCopyFile-stderr.txt index 5d09c0c..8c49302 100644 --- a/Tests/RunCMake/try_compile/CopyFileErrorNoCopyFile-stderr.txt +++ b/Tests/RunCMake/try_compile/CopyFileErrorNoCopyFile-stderr.txt @@ -1,4 +1,4 @@ -CMake Error at CopyFileErrorNoCopyFile.cmake:1 \(try_compile\): +CMake Error at CopyFileErrorNoCopyFile.cmake:[0-9]+ \(try_compile\): COPY_FILE_ERROR may be used only with COPY_FILE Call Stack \(most recent call first\): CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/try_compile/CopyFileErrorNoCopyFile.cmake b/Tests/RunCMake/try_compile/CopyFileErrorNoCopyFile.cmake index 8d7cb0e..8d15b3d 100644 --- a/Tests/RunCMake/try_compile/CopyFileErrorNoCopyFile.cmake +++ b/Tests/RunCMake/try_compile/CopyFileErrorNoCopyFile.cmake @@ -1,2 +1,4 @@ -try_compile(RESULT ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src.c +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) +try_compile(RESULT ${try_compile_bindir_or_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/src.c COPY_FILE_ERROR _copied) diff --git a/Tests/RunCMake/try_compile/CudaStandard-stderr.txt b/Tests/RunCMake/try_compile/CudaStandard-stderr.txt index bcf95d5..52dff8f 100644 --- a/Tests/RunCMake/try_compile/CudaStandard-stderr.txt +++ b/Tests/RunCMake/try_compile/CudaStandard-stderr.txt @@ -1,4 +1,4 @@ -^CMake Error at .*/Tests/RunCMake/try_compile/CudaStandard-build/CMakeFiles/CMakeTmp/CMakeLists.txt:[0-9]+ \(add_executable\): +^CMake Error at .*/Tests/RunCMake/try_compile/CudaStandard-build/CMakeFiles/CMake(Tmp|Scratch/TryCompile-[^/]+)/CMakeLists.txt:[0-9]+ \(add_executable\): CUDA_STANDARD is set to invalid value '4' + CMake Error at CudaStandard.cmake:[0-9]+ \(try_compile\): diff --git a/Tests/RunCMake/try_compile/CudaStandard.cmake b/Tests/RunCMake/try_compile/CudaStandard.cmake index a230424..0be89be 100644 --- a/Tests/RunCMake/try_compile/CudaStandard.cmake +++ b/Tests/RunCMake/try_compile/CudaStandard.cmake @@ -1,7 +1,11 @@ +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) + enable_language(CUDA) -try_compile(result ${CMAKE_CURRENT_BINARY_DIR} - SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src.cu + +try_compile(result ${try_compile_bindir_or_SOURCES} + ${try_compile_redundant_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/src.cu CUDA_STANDARD 4 OUTPUT_VARIABLE out ) + message("try_compile output:\n${out}") diff --git a/Tests/RunCMake/try_compile/CxxStandard-stderr.txt b/Tests/RunCMake/try_compile/CxxStandard-stderr.txt index cee1b44..55a06e2 100644 --- a/Tests/RunCMake/try_compile/CxxStandard-stderr.txt +++ b/Tests/RunCMake/try_compile/CxxStandard-stderr.txt @@ -1,13 +1,13 @@ -^(CMake Error in .*/Tests/RunCMake/try_compile/CxxStandard-build/CMakeFiles/CMakeTmp/CMakeLists.txt: +^(CMake Error in .*/Tests/RunCMake/try_compile/CxxStandard-build/CMakeFiles/CMake(Tmp|Scratch/TryCompile-[^/]+)/CMakeLists.txt: The CXX_STANDARD property on target "cmTC_[0-9a-f]*" contained an invalid value: "3". -)?CMake Error at .*/Tests/RunCMake/try_compile/CxxStandard-build/CMakeFiles/CMakeTmp/CMakeLists.txt:[0-9]+ \(add_executable\): +)?CMake Error at .*/Tests/RunCMake/try_compile/CxxStandard-build/CMakeFiles/CMake(Tmp|Scratch/TryCompile-[^/]+)/CMakeLists.txt:[0-9]+ \(add_executable\): CXX_STANDARD is set to invalid value '3' ( -CMake Error in .*/Tests/RunCMake/try_compile/CxxStandard-build/CMakeFiles/CMakeTmp/CMakeLists.txt: +CMake Error in .*/Tests/RunCMake/try_compile/CxxStandard-build/CMakeFiles/CMake(Tmp|Scratch/TryCompile-[^/]+)/CMakeLists.txt: The CXX_STANDARD property on target "cmTC_[0-9a-f]*" contained an invalid value: "3". diff --git a/Tests/RunCMake/try_compile/CxxStandard.cmake b/Tests/RunCMake/try_compile/CxxStandard.cmake index bcb49b9..e5b4e78 100644 --- a/Tests/RunCMake/try_compile/CxxStandard.cmake +++ b/Tests/RunCMake/try_compile/CxxStandard.cmake @@ -1,7 +1,11 @@ +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) + enable_language(CXX) -try_compile(result ${CMAKE_CURRENT_BINARY_DIR} - SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src.cxx + +try_compile(result ${try_compile_bindir_or_SOURCES} + ${try_compile_redundant_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/src.cxx CXX_STANDARD 3 OUTPUT_VARIABLE out ) + message("try_compile output:\n${out}") diff --git a/Tests/RunCMake/try_compile/CxxStandardGNU.cmake b/Tests/RunCMake/try_compile/CxxStandardGNU.cmake index e714fe4..552d99d 100644 --- a/Tests/RunCMake/try_compile/CxxStandardGNU.cmake +++ b/Tests/RunCMake/try_compile/CxxStandardGNU.cmake @@ -1,23 +1,30 @@ +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) + enable_language(CXX) -try_compile(result ${CMAKE_CURRENT_BINARY_DIR} - SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/CxxStandardGNU.cxx + +try_compile(result ${try_compile_bindir_or_SOURCES} + ${try_compile_redundant_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/CxxStandardGNU.cxx CXX_STANDARD 11 CXX_STANDARD_REQUIRED 1 CXX_EXTENSIONS 0 OUTPUT_VARIABLE out ) + if(NOT result) message(FATAL_ERROR "try_compile failed:\n${out}") endif() cmake_policy(SET CMP0067 NEW) + set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED 1) set(CMAKE_CXX_EXTENSIONS 0) -try_compile(result ${CMAKE_CURRENT_BINARY_DIR} - SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/CxxStandardGNU.cxx + +try_compile(result ${try_compile_bindir_or_SOURCES} + ${try_compile_redundant_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/CxxStandardGNU.cxx OUTPUT_VARIABLE out ) + if(NOT result) message(FATAL_ERROR "try_compile failed:\n${out}") endif() diff --git a/Tests/RunCMake/try_compile/CxxStandardNoDefault.cmake b/Tests/RunCMake/try_compile/CxxStandardNoDefault.cmake index 35caa9d..e0ebfee 100644 --- a/Tests/RunCMake/try_compile/CxxStandardNoDefault.cmake +++ b/Tests/RunCMake/try_compile/CxxStandardNoDefault.cmake @@ -1,9 +1,13 @@ +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) + enable_language(CXX) -try_compile(result ${CMAKE_CURRENT_BINARY_DIR} - SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src.cxx + +try_compile(result ${try_compile_bindir_or_SOURCES} + ${try_compile_redundant_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/src.cxx CXX_STANDARD 3 # bogus, but not used OUTPUT_VARIABLE out ) + if(NOT result) message(FATAL_ERROR "try_compile failed:\n${out}") endif() diff --git a/Tests/RunCMake/try_compile/EmptyListArgs.cmake b/Tests/RunCMake/try_compile/EmptyListArgs.cmake index eed7ee4..5cd7465 100644 --- a/Tests/RunCMake/try_compile/EmptyListArgs.cmake +++ b/Tests/RunCMake/try_compile/EmptyListArgs.cmake @@ -1,6 +1,9 @@ +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) + enable_language(C) -try_compile(RESULT ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src.c +try_compile(RESULT ${try_compile_bindir_or_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/src.c CMAKE_FLAGS # no values COMPILE_DEFINITIONS # no values LINK_LIBRARIES # no values diff --git a/Tests/RunCMake/try_compile/EmptyValueArgs.cmake b/Tests/RunCMake/try_compile/EmptyValueArgs.cmake index f564abc..fda4f10 100644 --- a/Tests/RunCMake/try_compile/EmptyValueArgs.cmake +++ b/Tests/RunCMake/try_compile/EmptyValueArgs.cmake @@ -1,4 +1,7 @@ -try_compile(RESULT ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src.c +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) +try_compile(RESULT ${try_compile_bindir_or_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/src.c COPY_FILE "") -try_compile(RESULT ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src.c +try_compile(RESULT ${try_compile_bindir_or_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/src.c COPY_FILE "x" COPY_FILE_ERROR "") diff --git a/Tests/RunCMake/try_compile/EnvConfig.cmake b/Tests/RunCMake/try_compile/EnvConfig.cmake index 4040c59..6e66825 100644 --- a/Tests/RunCMake/try_compile/EnvConfig.cmake +++ b/Tests/RunCMake/try_compile/EnvConfig.cmake @@ -1,3 +1,5 @@ +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) + enable_language(C) set(ENV{CMAKE_BUILD_TYPE} "Bad") @@ -6,8 +8,8 @@ set(ENV{CMAKE_CONFIGURATION_TYPES} "Bad;Debug") add_library(tc_defs INTERFACE IMPORTED) target_compile_definitions(tc_defs INTERFACE "TC_CONFIG_$<UPPER_CASE:$<CONFIG>>") -try_compile(ENV_CONFIG_RESULT "${CMAKE_BINARY_DIR}" - SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/EnvConfig.c" +try_compile(ENV_CONFIG_RESULT "${try_compile_bindir_or_SOURCES}" + ${try_compile_redundant_SOURCES} "${CMAKE_CURRENT_SOURCE_DIR}/EnvConfig.c" COPY_FILE "${CMAKE_CURRENT_BINARY_DIR}/EnvConfig.bin" OUTPUT_VARIABLE tc_output LINK_LIBRARIES tc_defs diff --git a/Tests/RunCMake/try_compile/ISPCDuplicateTarget.cmake b/Tests/RunCMake/try_compile/ISPCDuplicateTarget.cmake index 6d29069..1ead4c2 100644 --- a/Tests/RunCMake/try_compile/ISPCDuplicateTarget.cmake +++ b/Tests/RunCMake/try_compile/ISPCDuplicateTarget.cmake @@ -1,8 +1,12 @@ +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) + enable_language(ISPC) -set(CMAKE_ISPC_INSTRUCTION_SETS avx512skx-i32x16 - avx512skx-i32x16) -try_compile(result ${CMAKE_CURRENT_BINARY_DIR} - SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src.ispc + +set(CMAKE_ISPC_INSTRUCTION_SETS avx512skx-i32x16 avx512skx-i32x16) + +try_compile(result ${try_compile_bindir_or_SOURCES} + ${try_compile_redundant_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/src.ispc OUTPUT_VARIABLE out ) + message("try_compile output:\n${out}") diff --git a/Tests/RunCMake/try_compile/ISPCDuplicateTargetNinja.cmake b/Tests/RunCMake/try_compile/ISPCDuplicateTargetNinja.cmake index 7f59c14..e08e25f 100644 --- a/Tests/RunCMake/try_compile/ISPCDuplicateTargetNinja.cmake +++ b/Tests/RunCMake/try_compile/ISPCDuplicateTargetNinja.cmake @@ -1,11 +1,16 @@ +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) + enable_language(ISPC) -set(CMAKE_ISPC_INSTRUCTION_SETS avx512skx-i32x16 - avx512skx-i32x16) -try_compile(result ${CMAKE_CURRENT_BINARY_DIR} - SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src.ispc + +set(CMAKE_ISPC_INSTRUCTION_SETS avx512skx-i32x16 avx512skx-i32x16) + +try_compile(result ${try_compile_bindir_or_SOURCES} + ${try_compile_redundant_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/src.ispc OUTPUT_VARIABLE out ) + message("try_compile output:\n${out}") + if(NOT result) message(FATAL_ERROR "making Ninja and Ninja Multi-Config behave the same") endif() diff --git a/Tests/RunCMake/try_compile/ISPCInvalidTarget.cmake b/Tests/RunCMake/try_compile/ISPCInvalidTarget.cmake index c1ab6f2..2276bd3 100644 --- a/Tests/RunCMake/try_compile/ISPCInvalidTarget.cmake +++ b/Tests/RunCMake/try_compile/ISPCInvalidTarget.cmake @@ -1,7 +1,12 @@ +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) + enable_language(ISPC) + set(CMAKE_ISPC_INSTRUCTION_SETS "avxknl-i32x16") -try_compile(result ${CMAKE_CURRENT_BINARY_DIR} - SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src.ispc + +try_compile(result ${try_compile_bindir_or_SOURCES} + ${try_compile_redundant_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/src.ispc OUTPUT_VARIABLE out ) + message("try_compile output:\n${out}") diff --git a/Tests/RunCMake/try_compile/ISPCTargets.cmake b/Tests/RunCMake/try_compile/ISPCTargets.cmake index 0d3bd43..bd45569 100644 --- a/Tests/RunCMake/try_compile/ISPCTargets.cmake +++ b/Tests/RunCMake/try_compile/ISPCTargets.cmake @@ -1,7 +1,12 @@ +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) + enable_language(ISPC) + set(CMAKE_ISPC_INSTRUCTION_SETS avx512knl-i32x16 avx512skx-i32x16) -try_compile(result ${CMAKE_CURRENT_BINARY_DIR} - SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src.ispc + +try_compile(result ${try_compile_bindir_or_SOURCES} + ${try_compile_redundant_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/src.ispc OUTPUT_VARIABLE out ) + message("try_compile output:\n${out}") diff --git a/Tests/RunCMake/try_compile/NoArgs-stderr.txt b/Tests/RunCMake/try_compile/NoArgs-stderr.txt index 8808fd1..72a697e 100644 --- a/Tests/RunCMake/try_compile/NoArgs-stderr.txt +++ b/Tests/RunCMake/try_compile/NoArgs-stderr.txt @@ -1,4 +1,4 @@ -CMake Error at NoArgs.cmake:1 \(try_compile\): +CMake Error at NoArgs.cmake:[0-9]+ \(try_compile\): try_compile unknown error. Call Stack \(most recent call first\): CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/try_compile/NoCStandard-stderr.txt b/Tests/RunCMake/try_compile/NoCStandard-stderr.txt index 8d2b3f1..e0bb9ed 100644 --- a/Tests/RunCMake/try_compile/NoCStandard-stderr.txt +++ b/Tests/RunCMake/try_compile/NoCStandard-stderr.txt @@ -1,4 +1,4 @@ -CMake Error at NoCStandard.cmake:1 \(try_compile\): +CMake Error at NoCStandard.cmake:[0-9]+ \(try_compile\): Error after keyword "C_STANDARD": missing required value diff --git a/Tests/RunCMake/try_compile/NoCStandard.cmake b/Tests/RunCMake/try_compile/NoCStandard.cmake index b2c9ce6..e0d0478 100644 --- a/Tests/RunCMake/try_compile/NoCStandard.cmake +++ b/Tests/RunCMake/try_compile/NoCStandard.cmake @@ -1,2 +1,4 @@ -try_compile(result ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src.c +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) +try_compile(result ${try_compile_bindir_or_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/src.c C_STANDARD) diff --git a/Tests/RunCMake/try_compile/NoCopyFile-stderr.txt b/Tests/RunCMake/try_compile/NoCopyFile-stderr.txt index 36d889f..55ba687 100644 --- a/Tests/RunCMake/try_compile/NoCopyFile-stderr.txt +++ b/Tests/RunCMake/try_compile/NoCopyFile-stderr.txt @@ -1,4 +1,4 @@ -CMake Error at NoCopyFile.cmake:1 \(try_compile\): +CMake Error at NoCopyFile.cmake:[0-9]+ \(try_compile\): Error after keyword "COPY_FILE": missing required value diff --git a/Tests/RunCMake/try_compile/NoCopyFile.cmake b/Tests/RunCMake/try_compile/NoCopyFile.cmake index 8c648ff..270dff9 100644 --- a/Tests/RunCMake/try_compile/NoCopyFile.cmake +++ b/Tests/RunCMake/try_compile/NoCopyFile.cmake @@ -1,2 +1,4 @@ -try_compile(RESULT ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src.c +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) +try_compile(RESULT ${try_compile_bindir_or_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/src.c COPY_FILE) diff --git a/Tests/RunCMake/try_compile/NoCopyFile2-stderr.txt b/Tests/RunCMake/try_compile/NoCopyFile2-stderr.txt index 7f60e77..008d4e9 100644 --- a/Tests/RunCMake/try_compile/NoCopyFile2-stderr.txt +++ b/Tests/RunCMake/try_compile/NoCopyFile2-stderr.txt @@ -1,4 +1,4 @@ -CMake Error at NoCopyFile2.cmake:1 \(try_compile\): +CMake Error at NoCopyFile2.cmake:[0-9]+ \(try_compile\): Error after keyword "COPY_FILE": missing required value diff --git a/Tests/RunCMake/try_compile/NoCopyFile2.cmake b/Tests/RunCMake/try_compile/NoCopyFile2.cmake index 04b7f68..2ea8182 100644 --- a/Tests/RunCMake/try_compile/NoCopyFile2.cmake +++ b/Tests/RunCMake/try_compile/NoCopyFile2.cmake @@ -1,2 +1,4 @@ -try_compile(RESULT ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src.c +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) +try_compile(RESULT ${try_compile_bindir_or_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/src.c COPY_FILE CMAKE_FLAGS -DA=B) diff --git a/Tests/RunCMake/try_compile/NoCopyFileError-stderr.txt b/Tests/RunCMake/try_compile/NoCopyFileError-stderr.txt index dc242c3..7ca185d 100644 --- a/Tests/RunCMake/try_compile/NoCopyFileError-stderr.txt +++ b/Tests/RunCMake/try_compile/NoCopyFileError-stderr.txt @@ -1,4 +1,4 @@ -CMake Error at NoCopyFileError.cmake:1 \(try_compile\): +CMake Error at NoCopyFileError.cmake:[0-9]+ \(try_compile\): Error after keyword "COPY_FILE_ERROR": missing required value diff --git a/Tests/RunCMake/try_compile/NoCopyFileError.cmake b/Tests/RunCMake/try_compile/NoCopyFileError.cmake index d4d69ee..1a56e86 100644 --- a/Tests/RunCMake/try_compile/NoCopyFileError.cmake +++ b/Tests/RunCMake/try_compile/NoCopyFileError.cmake @@ -1,2 +1,4 @@ -try_compile(RESULT ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src.c +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) +try_compile(RESULT ${try_compile_bindir_or_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/src.c COPY_FILE ${CMAKE_CURRENT_BINARY_DIR}/copied.bin COPY_FILE_ERROR) diff --git a/Tests/RunCMake/try_compile/NoOutputVariable-stderr.txt b/Tests/RunCMake/try_compile/NoOutputVariable-stderr.txt index b26be1d..ec29f0b 100644 --- a/Tests/RunCMake/try_compile/NoOutputVariable-stderr.txt +++ b/Tests/RunCMake/try_compile/NoOutputVariable-stderr.txt @@ -1,4 +1,4 @@ -CMake Error at NoOutputVariable.cmake:1 \(try_compile\): +CMake Error at NoOutputVariable.cmake:[0-9]+ \(try_compile\): Error after keyword "OUTPUT_VARIABLE": missing required value diff --git a/Tests/RunCMake/try_compile/NoOutputVariable.cmake b/Tests/RunCMake/try_compile/NoOutputVariable.cmake index 3b9cb34..13dc4b4 100644 --- a/Tests/RunCMake/try_compile/NoOutputVariable.cmake +++ b/Tests/RunCMake/try_compile/NoOutputVariable.cmake @@ -1,2 +1,4 @@ -try_compile(RESULT ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src.c +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) +try_compile(RESULT ${try_compile_bindir_or_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/src.c OUTPUT_VARIABLE) diff --git a/Tests/RunCMake/try_compile/NoOutputVariable2-stderr.txt b/Tests/RunCMake/try_compile/NoOutputVariable2-stderr.txt index 02d226b..dd34559 100644 --- a/Tests/RunCMake/try_compile/NoOutputVariable2-stderr.txt +++ b/Tests/RunCMake/try_compile/NoOutputVariable2-stderr.txt @@ -1,4 +1,4 @@ -CMake Error at NoOutputVariable2.cmake:1 \(try_compile\): +CMake Error at NoOutputVariable2.cmake:[0-9]+ \(try_compile\): Error after keyword "OUTPUT_VARIABLE": missing required value diff --git a/Tests/RunCMake/try_compile/NoOutputVariable2.cmake b/Tests/RunCMake/try_compile/NoOutputVariable2.cmake index ad9ac9a..4d5dda3 100644 --- a/Tests/RunCMake/try_compile/NoOutputVariable2.cmake +++ b/Tests/RunCMake/try_compile/NoOutputVariable2.cmake @@ -1,2 +1,4 @@ -try_compile(RESULT ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src.c +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) +try_compile(RESULT ${try_compile_bindir_or_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/src.c OUTPUT_VARIABLE CMAKE_FLAGS -DA=B) diff --git a/Tests/RunCMake/try_compile/NoSources-stderr.txt b/Tests/RunCMake/try_compile/NoSources-stderr.txt index a8410d2..55603dc 100644 --- a/Tests/RunCMake/try_compile/NoSources-stderr.txt +++ b/Tests/RunCMake/try_compile/NoSources-stderr.txt @@ -1,4 +1,4 @@ -CMake Error at NoSources.cmake:1 \(try_compile\): +CMake Error at NoSources.cmake:[0-9]+ \(try_compile\): Error after keyword "SOURCES": missing required value diff --git a/Tests/RunCMake/try_compile/NonSourceCompileDefinitions-stderr.txt b/Tests/RunCMake/try_compile/NonSourceCompileDefinitions-stderr.txt index 025e658..3e48411 100644 --- a/Tests/RunCMake/try_compile/NonSourceCompileDefinitions-stderr.txt +++ b/Tests/RunCMake/try_compile/NonSourceCompileDefinitions-stderr.txt @@ -1,4 +1,4 @@ -CMake Error at NonSourceCompileDefinitions.cmake:1 \(try_compile\): +CMake Error at NonSourceCompileDefinitions.cmake:[0-9]+ \(try_compile\): COMPILE_DEFINITIONS specified on a srcdir type TRY_COMPILE Call Stack \(most recent call first\): CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/try_compile/NonSourceCopyFile-stderr.txt b/Tests/RunCMake/try_compile/NonSourceCopyFile-stderr.txt index f5893e1..7de8c92 100644 --- a/Tests/RunCMake/try_compile/NonSourceCopyFile-stderr.txt +++ b/Tests/RunCMake/try_compile/NonSourceCopyFile-stderr.txt @@ -1,4 +1,4 @@ -CMake Error at NonSourceCopyFile.cmake:1 \(try_compile\): +CMake Error at NonSourceCopyFile.cmake:[0-9]+ \(try_compile\): COPY_FILE specified on a srcdir type TRY_COMPILE Call Stack \(most recent call first\): CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/try_compile/ObjCStandard-stderr.txt b/Tests/RunCMake/try_compile/ObjCStandard-stderr.txt index f1b4df9..59f1d73 100644 --- a/Tests/RunCMake/try_compile/ObjCStandard-stderr.txt +++ b/Tests/RunCMake/try_compile/ObjCStandard-stderr.txt @@ -1,4 +1,4 @@ -^CMake Error at .*/Tests/RunCMake/try_compile/ObjCStandard-build/CMakeFiles/CMakeTmp/CMakeLists.txt:[0-9]+ \(add_executable\): +^CMake Error at .*/Tests/RunCMake/try_compile/ObjCStandard-build/CMakeFiles/CMake(Tmp|Scratch/TryCompile-[^/]+)/CMakeLists.txt:[0-9]+ \(add_executable\): OBJC_STANDARD is set to invalid value '3' + CMake Error at ObjCStandard.cmake:[0-9]+ \(try_compile\): diff --git a/Tests/RunCMake/try_compile/ObjCStandard.cmake b/Tests/RunCMake/try_compile/ObjCStandard.cmake index b2066f9..a691ddd 100644 --- a/Tests/RunCMake/try_compile/ObjCStandard.cmake +++ b/Tests/RunCMake/try_compile/ObjCStandard.cmake @@ -1,7 +1,11 @@ +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) + enable_language(OBJC) -try_compile(result ${CMAKE_CURRENT_BINARY_DIR} - SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src.m + +try_compile(result ${try_compile_bindir_or_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/src.m OBJC_STANDARD 3 OUTPUT_VARIABLE out ) + message("try_compile output:\n${out}") diff --git a/Tests/RunCMake/try_compile/ObjCxxStandard-stderr.txt b/Tests/RunCMake/try_compile/ObjCxxStandard-stderr.txt index a2f91b4..21fa20f 100644 --- a/Tests/RunCMake/try_compile/ObjCxxStandard-stderr.txt +++ b/Tests/RunCMake/try_compile/ObjCxxStandard-stderr.txt @@ -1,4 +1,4 @@ -^CMake Error at .*/Tests/RunCMake/try_compile/ObjCxxStandard-build/CMakeFiles/CMakeTmp/CMakeLists.txt:[0-9]+ \(add_executable\): +^CMake Error at .*/Tests/RunCMake/try_compile/ObjCxxStandard-build/CMakeFiles/CMake(Tmp|Scratch/TryCompile-[^/]+)/CMakeLists.txt:[0-9]+ \(add_executable\): OBJCXX_STANDARD is set to invalid value '3' + CMake Error at ObjCxxStandard.cmake:[0-9]+ \(try_compile\): diff --git a/Tests/RunCMake/try_compile/ObjCxxStandard.cmake b/Tests/RunCMake/try_compile/ObjCxxStandard.cmake index 1221805..b03f560 100644 --- a/Tests/RunCMake/try_compile/ObjCxxStandard.cmake +++ b/Tests/RunCMake/try_compile/ObjCxxStandard.cmake @@ -1,7 +1,11 @@ +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) + enable_language(OBJCXX) -try_compile(result ${CMAKE_CURRENT_BINARY_DIR} - SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src.mm + +try_compile(result ${try_compile_bindir_or_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/src.mm OBJCXX_STANDARD 3 OUTPUT_VARIABLE out ) + message("try_compile output:\n${out}") diff --git a/Tests/RunCMake/try_compile/OneArg-stderr.txt b/Tests/RunCMake/try_compile/OneArg-stderr.txt index 12835be..bb0239e 100644 --- a/Tests/RunCMake/try_compile/OneArg-stderr.txt +++ b/Tests/RunCMake/try_compile/OneArg-stderr.txt @@ -1,4 +1,4 @@ -CMake Error at OneArg.cmake:1 \(try_compile\): +CMake Error at OneArg.cmake:[0-9]+ \(try_compile\): try_compile unknown error. Call Stack \(most recent call first\): CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/try_compile/RunCMakeTest.cmake b/Tests/RunCMake/try_compile/RunCMakeTest.cmake index 2fe3001..c0fdd9f 100644 --- a/Tests/RunCMake/try_compile/RunCMakeTest.cmake +++ b/Tests/RunCMake/try_compile/RunCMakeTest.cmake @@ -1,38 +1,28 @@ include(RunCMake) -run_cmake(CopyFileErrorNoCopyFile) run_cmake(NoArgs) run_cmake(OneArg) run_cmake(TwoArgs) -run_cmake(NoCopyFile) -run_cmake(NoCopyFile2) -run_cmake(NoCopyFileError) -run_cmake(NoCStandard) -run_cmake(NoOutputVariable) -run_cmake(NoOutputVariable2) run_cmake(NoSources) -run_cmake(BadLinkLibraries) -run_cmake(BadSources1) -run_cmake(BadSources2) -run_cmake(NonSourceCopyFile) -run_cmake(NonSourceCompileDefinitions) run_cmake(BinDirEmpty) run_cmake(BinDirRelative) -run_cmake(EmptyValueArgs) -run_cmake(EmptyListArgs) -run_cmake(TryRunArgs) -run_cmake(EnvConfig) +set(RunCMake_TEST_OPTIONS -Dtry_compile_DEFS=old_signature.cmake) +include(${RunCMake_SOURCE_DIR}/old_and_new_signature_tests.cmake) +unset(RunCMake_TEST_OPTIONS) + +set(RunCMake_TEST_OPTIONS -Dtry_compile_DEFS=new_signature.cmake) +include(${RunCMake_SOURCE_DIR}/old_and_new_signature_tests.cmake) +unset(RunCMake_TEST_OPTIONS) + +run_cmake(NonSourceCopyFile) +run_cmake(NonSourceCompileDefinitions) set(RunCMake_TEST_OPTIONS --debug-trycompile) run_cmake(PlatformVariables) run_cmake(WarnDeprecated) unset(RunCMake_TEST_OPTIONS) -run_cmake(TargetTypeExe) -run_cmake(TargetTypeInvalid) -run_cmake(TargetTypeStatic) - if (CMAKE_SYSTEM_NAME MATCHES "^(Linux|Darwin|Windows)$" AND CMAKE_C_COMPILER_ID MATCHES "^(MSVC|GNU|LCC|Clang|AppleClang)$") set (RunCMake_TEST_OPTIONS -DRunCMake_C_COMPILER_ID=${CMAKE_C_COMPILER_ID}) @@ -40,41 +30,6 @@ if (CMAKE_SYSTEM_NAME MATCHES "^(Linux|Darwin|Windows)$" AND unset (RunCMake_TEST_OPTIONS) endif() -if(CMAKE_C_STANDARD_DEFAULT) - run_cmake(CStandard) -elseif(DEFINED CMAKE_C_STANDARD_DEFAULT) - run_cmake(CStandardNoDefault) -endif() -if(CMAKE_OBJC_STANDARD_DEFAULT) - run_cmake(ObjCStandard) -endif() -if(CMAKE_CXX_STANDARD_DEFAULT) - run_cmake(CxxStandard) -elseif(DEFINED CMAKE_CXX_STANDARD_DEFAULT) - run_cmake(CxxStandardNoDefault) -endif() -if(CMAKE_OBJCXX_STANDARD_DEFAULT) - run_cmake(ObjCxxStandard) -endif() -if(CMake_TEST_CUDA) - run_cmake(CudaStandard) -endif() -if(CMake_TEST_ISPC) - run_cmake(ISPCTargets) - run_cmake(ISPCInvalidTarget) - set(ninja "") - if(RunCMake_GENERATOR MATCHES "Ninja") - set(ninja "Ninja") - endif() - run_cmake(ISPCDuplicateTarget${ninja}) -endif() -if((CMAKE_C_COMPILER_ID MATCHES "GNU" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.4) OR CMAKE_C_COMPILER_ID MATCHES "LCC") - run_cmake(CStandardGNU) -endif() -if((CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.4) OR CMAKE_C_COMPILER_ID MATCHES "LCC") - run_cmake(CxxStandardGNU) -endif() - run_cmake(CMP0056) run_cmake(CMP0066) run_cmake(CMP0067) diff --git a/Tests/RunCMake/try_compile/TargetTypeExe.cmake b/Tests/RunCMake/try_compile/TargetTypeExe.cmake index 9b6e727..330f5f5 100644 --- a/Tests/RunCMake/try_compile/TargetTypeExe.cmake +++ b/Tests/RunCMake/try_compile/TargetTypeExe.cmake @@ -1,14 +1,20 @@ +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) + enable_language(C) + set(CMAKE_TRY_COMPILE_TARGET_TYPE EXECUTABLE) -try_compile(result ${CMAKE_CURRENT_BINARY_DIR} - SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src.c + +try_compile(result ${try_compile_bindir_or_SOURCES} + ${try_compile_redundant_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/src.c OUTPUT_VARIABLE out COPY_FILE ${CMAKE_CURRENT_BINARY_DIR}/copy COPY_FILE_ERROR copy_err ) + if(NOT result) message(FATAL_ERROR "try_compile failed:\n${out}") endif() + if(copy_err) message(FATAL_ERROR "try_compile COPY_FILE failed:\n${copy_err}") endif() diff --git a/Tests/RunCMake/try_compile/TargetTypeInvalid-stderr.txt b/Tests/RunCMake/try_compile/TargetTypeInvalid-stderr.txt index 08b281a..e9123e3 100644 --- a/Tests/RunCMake/try_compile/TargetTypeInvalid-stderr.txt +++ b/Tests/RunCMake/try_compile/TargetTypeInvalid-stderr.txt @@ -1,4 +1,4 @@ -^CMake Error at TargetTypeInvalid.cmake:2 \(try_compile\): +^CMake Error at TargetTypeInvalid.cmake:[0-9]+ \(try_compile\): Invalid value 'INVALID' for CMAKE_TRY_COMPILE_TARGET_TYPE. Only 'EXECUTABLE' and 'STATIC_LIBRARY' are allowed. Call Stack \(most recent call first\): diff --git a/Tests/RunCMake/try_compile/TargetTypeInvalid.cmake b/Tests/RunCMake/try_compile/TargetTypeInvalid.cmake index 0bbc4ac..15a20bb 100644 --- a/Tests/RunCMake/try_compile/TargetTypeInvalid.cmake +++ b/Tests/RunCMake/try_compile/TargetTypeInvalid.cmake @@ -1,2 +1,6 @@ +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) + set(CMAKE_TRY_COMPILE_TARGET_TYPE INVALID) -try_compile(result ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src.c) + +try_compile(result ${try_compile_bindir_or_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/src.c) diff --git a/Tests/RunCMake/try_compile/TargetTypeStatic.cmake b/Tests/RunCMake/try_compile/TargetTypeStatic.cmake index 006b8b8..98dea41 100644 --- a/Tests/RunCMake/try_compile/TargetTypeStatic.cmake +++ b/Tests/RunCMake/try_compile/TargetTypeStatic.cmake @@ -1,14 +1,20 @@ +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) + enable_language(C) + set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) -try_compile(result ${CMAKE_CURRENT_BINARY_DIR} - SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/other.c + +try_compile(result ${try_compile_bindir_or_SOURCES} + ${try_compile_redundant_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/other.c OUTPUT_VARIABLE out COPY_FILE ${CMAKE_CURRENT_BINARY_DIR}/copy COPY_FILE_ERROR copy_err ) + if(NOT result) message(FATAL_ERROR "try_compile failed:\n${out}") endif() + if(copy_err) message(FATAL_ERROR "try_compile COPY_FILE failed:\n${copy_err}") endif() diff --git a/Tests/RunCMake/try_compile/TryRunArgs.cmake b/Tests/RunCMake/try_compile/TryRunArgs.cmake index 1a60270..e4cb1fe 100644 --- a/Tests/RunCMake/try_compile/TryRunArgs.cmake +++ b/Tests/RunCMake/try_compile/TryRunArgs.cmake @@ -1,6 +1,9 @@ +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) + enable_language(C) -try_compile(RESULT ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src.c +try_compile(RESULT ${try_compile_bindir_or_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/src.c COPY_FILE "${CMAKE_CURRENT_BINARY_DIR}/out.bin" COMPILE_OUTPUT_VARIABLE compOutputVar RUN_OUTPUT_VARIABLE runOutputVar diff --git a/Tests/RunCMake/try_compile/TwoArgs-stderr.txt b/Tests/RunCMake/try_compile/TwoArgs-stderr.txt index b9c08fc..38f1d75 100644 --- a/Tests/RunCMake/try_compile/TwoArgs-stderr.txt +++ b/Tests/RunCMake/try_compile/TwoArgs-stderr.txt @@ -1,4 +1,4 @@ -CMake Error at TwoArgs.cmake:1 \(try_compile\): +CMake Error at TwoArgs.cmake:[0-9]+ \(try_compile\): try_compile unknown error. Call Stack \(most recent call first\): CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/try_compile/new_signature.cmake b/Tests/RunCMake/try_compile/new_signature.cmake new file mode 100644 index 0000000..cbcb261 --- /dev/null +++ b/Tests/RunCMake/try_compile/new_signature.cmake @@ -0,0 +1,2 @@ +set(try_compile_bindir_or_SOURCES SOURCES) +set(try_compile_redundant_SOURCES "") diff --git a/Tests/RunCMake/try_compile/old_and_new_signature_tests.cmake b/Tests/RunCMake/try_compile/old_and_new_signature_tests.cmake new file mode 100644 index 0000000..e156e12 --- /dev/null +++ b/Tests/RunCMake/try_compile/old_and_new_signature_tests.cmake @@ -0,0 +1,54 @@ +run_cmake(CopyFileErrorNoCopyFile) +run_cmake(NoCopyFile) +run_cmake(NoCopyFile2) +run_cmake(NoCopyFileError) +run_cmake(NoCStandard) +run_cmake(NoOutputVariable) +run_cmake(NoOutputVariable2) +run_cmake(BadLinkLibraries) +run_cmake(BadSources1) +run_cmake(BadSources2) +run_cmake(EmptyValueArgs) +run_cmake(EmptyListArgs) +run_cmake(TryRunArgs) + +run_cmake(EnvConfig) + +run_cmake(TargetTypeExe) +run_cmake(TargetTypeInvalid) +run_cmake(TargetTypeStatic) + +if(CMAKE_C_STANDARD_DEFAULT) + run_cmake(CStandard) +elseif(DEFINED CMAKE_C_STANDARD_DEFAULT) + run_cmake(CStandardNoDefault) +endif() +if(CMAKE_OBJC_STANDARD_DEFAULT) + run_cmake(ObjCStandard) +endif() +if(CMAKE_CXX_STANDARD_DEFAULT) + run_cmake(CxxStandard) +elseif(DEFINED CMAKE_CXX_STANDARD_DEFAULT) + run_cmake(CxxStandardNoDefault) +endif() +if(CMAKE_OBJCXX_STANDARD_DEFAULT) + run_cmake(ObjCxxStandard) +endif() +if(CMake_TEST_CUDA) + run_cmake(CudaStandard) +endif() +if(CMake_TEST_ISPC) + run_cmake(ISPCTargets) + run_cmake(ISPCInvalidTarget) + set(ninja "") + if(RunCMake_GENERATOR MATCHES "Ninja") + set(ninja "Ninja") + endif() + run_cmake(ISPCDuplicateTarget${ninja}) +endif() +if((CMAKE_C_COMPILER_ID MATCHES "GNU" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.4) OR CMAKE_C_COMPILER_ID MATCHES "LCC") + run_cmake(CStandardGNU) +endif() +if((CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.4) OR CMAKE_C_COMPILER_ID MATCHES "LCC") + run_cmake(CxxStandardGNU) +endif() diff --git a/Tests/RunCMake/try_compile/old_signature.cmake b/Tests/RunCMake/try_compile/old_signature.cmake new file mode 100644 index 0000000..94b12de --- /dev/null +++ b/Tests/RunCMake/try_compile/old_signature.cmake @@ -0,0 +1,2 @@ +set(try_compile_bindir_or_SOURCES ${CMAKE_CURRENT_BINARY_DIR}) +set(try_compile_redundant_SOURCES SOURCES) diff --git a/Tests/RunCMake/try_run/BadLinkLibraries-stderr.txt b/Tests/RunCMake/try_run/BadLinkLibraries-stderr.txt index dcd1bfc..f9cc50e 100644 --- a/Tests/RunCMake/try_run/BadLinkLibraries-stderr.txt +++ b/Tests/RunCMake/try_run/BadLinkLibraries-stderr.txt @@ -1,4 +1,4 @@ -CMake Error at BadLinkLibraries.cmake:2 \(try_run\): +CMake Error at BadLinkLibraries.cmake:[0-9+] \(try_run\): Only libraries may be used as try_compile or try_run IMPORTED LINK_LIBRARIES. Got not_a_library of type UTILITY. Call Stack \(most recent call first\): diff --git a/Tests/RunCMake/try_run/BadLinkLibraries.cmake b/Tests/RunCMake/try_run/BadLinkLibraries.cmake index a124bf6..950a942 100644 --- a/Tests/RunCMake/try_run/BadLinkLibraries.cmake +++ b/Tests/RunCMake/try_run/BadLinkLibraries.cmake @@ -1,4 +1,7 @@ +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) + add_custom_target(not_a_library) -try_run(RUN_RESULT COMPILE_RESULT - ${CMAKE_CURRENT_BINARY_DIR}/CMakeTmp ${CMAKE_CURRENT_SOURCE_DIR}/src.c + +try_run(RUN_RESULT COMPILE_RESULT ${try_compile_bindir_or_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/src.c LINK_LIBRARIES not_a_library) diff --git a/Tests/RunCMake/try_run/NoCompileOutputVariable.cmake b/Tests/RunCMake/try_run/NoCompileOutputVariable.cmake index 85b91f4..9eb7c5e 100644 --- a/Tests/RunCMake/try_run/NoCompileOutputVariable.cmake +++ b/Tests/RunCMake/try_run/NoCompileOutputVariable.cmake @@ -1,4 +1,6 @@ -try_run(RUN_RESULT COMPILE_RESULT - ${CMAKE_CURRENT_BINARY_DIR}/CMakeTmp ${CMAKE_CURRENT_SOURCE_DIR}/src.c +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) + +try_run(RUN_RESULT COMPILE_RESULT ${try_compile_bindir_or_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/src.c COMPILE_OUTPUT_VARIABLE ) diff --git a/Tests/RunCMake/try_run/NoRunOutputVariable.cmake b/Tests/RunCMake/try_run/NoRunOutputVariable.cmake index 25310d8..f9e5e0b 100644 --- a/Tests/RunCMake/try_run/NoRunOutputVariable.cmake +++ b/Tests/RunCMake/try_run/NoRunOutputVariable.cmake @@ -1,4 +1,6 @@ -try_run(RUN_RESULT COMPILE_RESULT - ${CMAKE_CURRENT_BINARY_DIR}/CMakeTmp ${CMAKE_CURRENT_SOURCE_DIR}/src.c +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) + +try_run(RUN_RESULT COMPILE_RESULT ${try_compile_bindir_or_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/src.c RUN_OUTPUT_VARIABLE ) diff --git a/Tests/RunCMake/try_run/NoRunStdErrVariable-stderr.txt b/Tests/RunCMake/try_run/NoRunStdErrVariable-stderr.txt index 04ffc5d..1443ab2 100644 --- a/Tests/RunCMake/try_run/NoRunStdErrVariable-stderr.txt +++ b/Tests/RunCMake/try_run/NoRunStdErrVariable-stderr.txt @@ -1,4 +1,4 @@ -^CMake Error at NoRunStdErrVariable.cmake:1 \(try_run\): +^CMake Error at NoRunStdErrVariable.cmake:[0-9]+ \(try_run\): Error after keyword "RUN_OUTPUT_STDERR_VARIABLE": missing required value diff --git a/Tests/RunCMake/try_run/NoRunStdErrVariable.cmake b/Tests/RunCMake/try_run/NoRunStdErrVariable.cmake index 88c2a72..888bc25 100644 --- a/Tests/RunCMake/try_run/NoRunStdErrVariable.cmake +++ b/Tests/RunCMake/try_run/NoRunStdErrVariable.cmake @@ -1,5 +1,7 @@ -try_run(RUN_RESULT COMPILE_RESULT - ${CMAKE_CURRENT_BINARY_DIR}/CMakeTmp ${CMAKE_CURRENT_SOURCE_DIR}/src.c +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) + +try_run(RUN_RESULT COMPILE_RESULT ${try_compile_bindir_or_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/src.c WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/CMakeTmp/workdir RUN_OUTPUT_STDERR_VARIABLE ) diff --git a/Tests/RunCMake/try_run/NoRunStdOutVariable-stderr.txt b/Tests/RunCMake/try_run/NoRunStdOutVariable-stderr.txt index 40e0e27..8b90e94 100644 --- a/Tests/RunCMake/try_run/NoRunStdOutVariable-stderr.txt +++ b/Tests/RunCMake/try_run/NoRunStdOutVariable-stderr.txt @@ -1,4 +1,4 @@ -^CMake Error at NoRunStdOutVariable.cmake:1 \(try_run\): +^CMake Error at NoRunStdOutVariable.cmake:[0-9]+ \(try_run\): Error after keyword "RUN_OUTPUT_STDOUT_VARIABLE": missing required value diff --git a/Tests/RunCMake/try_run/NoRunStdOutVariable.cmake b/Tests/RunCMake/try_run/NoRunStdOutVariable.cmake index 691e881..ed6ab88 100644 --- a/Tests/RunCMake/try_run/NoRunStdOutVariable.cmake +++ b/Tests/RunCMake/try_run/NoRunStdOutVariable.cmake @@ -1,5 +1,7 @@ -try_run(RUN_RESULT COMPILE_RESULT - ${CMAKE_CURRENT_BINARY_DIR}/CMakeTmp ${CMAKE_CURRENT_SOURCE_DIR}/src.c +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) + +try_run(RUN_RESULT COMPILE_RESULT ${try_compile_bindir_or_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/src.c WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/CMakeTmp/workdir RUN_OUTPUT_STDOUT_VARIABLE ) diff --git a/Tests/RunCMake/try_run/NoWorkingDirectory.cmake b/Tests/RunCMake/try_run/NoWorkingDirectory.cmake index a115e36..0d68182 100644 --- a/Tests/RunCMake/try_run/NoWorkingDirectory.cmake +++ b/Tests/RunCMake/try_run/NoWorkingDirectory.cmake @@ -1,4 +1,6 @@ -try_run(RUN_RESULT COMPILE_RESULT - ${CMAKE_CURRENT_BINARY_DIR}/CMakeTmp ${CMAKE_CURRENT_SOURCE_DIR}/src.c +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) + +try_run(RUN_RESULT COMPILE_RESULT ${try_compile_bindir_or_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/src.c WORKING_DIRECTORY ) diff --git a/Tests/RunCMake/try_run/RunCMakeTest.cmake b/Tests/RunCMake/try_run/RunCMakeTest.cmake index 698357b..dbea089 100644 --- a/Tests/RunCMake/try_run/RunCMakeTest.cmake +++ b/Tests/RunCMake/try_run/RunCMakeTest.cmake @@ -1,8 +1,16 @@ include(RunCMake) -run_cmake(BadLinkLibraries) run_cmake(BinDirEmpty) run_cmake(BinDirRelative) +run_cmake(NoOutputVariable) + +set(RunCMake_TEST_OPTIONS -Dtry_compile_DEFS=old_signature.cmake) +include(${RunCMake_SOURCE_DIR}/old_and_new_signature_tests.cmake) +unset(RunCMake_TEST_OPTIONS) + +set(RunCMake_TEST_OPTIONS -Dtry_compile_DEFS=new_signature.cmake) +include(${RunCMake_SOURCE_DIR}/old_and_new_signature_tests.cmake) +unset(RunCMake_TEST_OPTIONS) if (CMAKE_SYSTEM_NAME MATCHES "^(Linux|Darwin|Windows)$" AND CMAKE_C_COMPILER_ID MATCHES "^(MSVC|GNU|LCC|Clang|AppleClang)$") @@ -10,12 +18,3 @@ if (CMAKE_SYSTEM_NAME MATCHES "^(Linux|Darwin|Windows)$" AND run_cmake(LinkOptions) unset (RunCMake_TEST_OPTIONS) endif() - -run_cmake(WorkingDirArg) - -run_cmake(NoOutputVariable) -run_cmake(NoCompileOutputVariable) -run_cmake(NoRunOutputVariable) -run_cmake(NoRunStdOutVariable) -run_cmake(NoRunStdErrVariable) -run_cmake(NoWorkingDirectory) diff --git a/Tests/RunCMake/try_run/WorkingDirArg.cmake b/Tests/RunCMake/try_run/WorkingDirArg.cmake index 62f78e8..375a703 100644 --- a/Tests/RunCMake/try_run/WorkingDirArg.cmake +++ b/Tests/RunCMake/try_run/WorkingDirArg.cmake @@ -1,5 +1,7 @@ -try_run(RUN_RESULT COMPILE_RESULT - ${CMAKE_CURRENT_BINARY_DIR}/CMakeTmp ${CMAKE_CURRENT_SOURCE_DIR}/src.c +include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS}) + +try_run(RUN_RESULT COMPILE_RESULT ${try_compile_bindir_or_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/src.c RUN_OUTPUT_VARIABLE RUN_OUTPUT WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/CMakeTmp/workdir ) diff --git a/Tests/RunCMake/try_run/new_signature.cmake b/Tests/RunCMake/try_run/new_signature.cmake new file mode 100644 index 0000000..cbcb261 --- /dev/null +++ b/Tests/RunCMake/try_run/new_signature.cmake @@ -0,0 +1,2 @@ +set(try_compile_bindir_or_SOURCES SOURCES) +set(try_compile_redundant_SOURCES "") diff --git a/Tests/RunCMake/try_run/old_and_new_signature_tests.cmake b/Tests/RunCMake/try_run/old_and_new_signature_tests.cmake new file mode 100644 index 0000000..2332127 --- /dev/null +++ b/Tests/RunCMake/try_run/old_and_new_signature_tests.cmake @@ -0,0 +1,11 @@ +run_cmake(BadLinkLibraries) +run_cmake(BinDirEmpty) +run_cmake(BinDirRelative) + +run_cmake(WorkingDirArg) + +run_cmake(NoCompileOutputVariable) +run_cmake(NoRunOutputVariable) +run_cmake(NoRunStdOutVariable) +run_cmake(NoRunStdErrVariable) +run_cmake(NoWorkingDirectory) diff --git a/Tests/RunCMake/try_run/old_signature.cmake b/Tests/RunCMake/try_run/old_signature.cmake new file mode 100644 index 0000000..94b12de --- /dev/null +++ b/Tests/RunCMake/try_run/old_signature.cmake @@ -0,0 +1,2 @@ +set(try_compile_bindir_or_SOURCES ${CMAKE_CURRENT_BINARY_DIR}) +set(try_compile_redundant_SOURCES SOURCES) diff --git a/Tests/TryCompile/CMakeLists.txt b/Tests/TryCompile/CMakeLists.txt index dccc227..a53dd93 100644 --- a/Tests/TryCompile/CMakeLists.txt +++ b/Tests/TryCompile/CMakeLists.txt @@ -4,6 +4,18 @@ if(POLICY CMP0129) endif() project(TryCompile) +macro(EXPECT_PASS var out) + if(NOT ${var}) + message(SEND_ERROR "Should pass failed ${out}") + endif() +endmacro() + +macro(EXPECT_FAIL var out) + if(${var}) + message(SEND_ERROR "Should fail passed ${out}") + endif() +endmacro() + macro(TEST_ASSERT value msg) if (NOT ${value}) message (SEND_ERROR "Assertion failure:" ${msg} ) @@ -28,112 +40,31 @@ macro(TEST_EXPECT_CONTAINS command expected) endif() endmacro() - -# try to compile a file that should compile -try_compile(SHOULD_PASS - ${TryCompile_BINARY_DIR} - ${TryCompile_SOURCE_DIR}/pass.c - OUTPUT_VARIABLE TRY_OUT) -if(NOT SHOULD_PASS) - message(SEND_ERROR "should pass failed ${TRY_OUT}") -endif() - -# try to compile a file that should compile -# also check that COPY_FILE works -try_compile(SHOULD_PASS - ${TryCompile_BINARY_DIR} - ${TryCompile_SOURCE_DIR}/pass.c - OUTPUT_VARIABLE TRY_OUT - COPY_FILE ${TryCompile_BINARY_DIR}/CopyOfPass - ) - -if(NOT SHOULD_PASS) - message(SEND_ERROR "should pass failed ${TRY_OUT}") -endif() -if(NOT EXISTS "${TryCompile_BINARY_DIR}/CopyOfPass") - message(SEND_ERROR "COPY_FILE to \"${TryCompile_BINARY_DIR}/CopyOfPass\" failed") -else() - file(REMOVE "${TryCompile_BINARY_DIR}/CopyOfPass") -endif() - -# try to compile a file that should compile -# also check that COPY_FILE_ERROR works -file(WRITE ${TryCompile_BINARY_DIR}/invalid "") -try_compile(SHOULD_PASS - ${TryCompile_BINARY_DIR} - ${TryCompile_SOURCE_DIR}/pass.c - OUTPUT_VARIABLE TRY_OUT - COPY_FILE ${TryCompile_BINARY_DIR}/invalid/path - COPY_FILE_ERROR _captured - ) -if(NOT SHOULD_PASS) - message(SEND_ERROR "should pass failed ${TRY_OUT}") -endif() -if(NOT _captured MATCHES "Cannot copy output executable.*/invalid/path") - message(SEND_ERROR "COPY_FILE_ERROR did not capture expected message") -endif() - -# try to compile a file that should not compile -try_compile(SHOULD_FAIL - ${TryCompile_BINARY_DIR} - ${TryCompile_SOURCE_DIR}/fail.c - OUTPUT_VARIABLE TRY_OUT) -if(SHOULD_FAIL) - message(SEND_ERROR "Should fail passed ${TRY_OUT}") -endif() - -# try to compile two files that should compile -try_compile(SHOULD_PASS - ${TryCompile_BINARY_DIR} - SOURCES ${TryCompile_SOURCE_DIR}/pass2a.c ${TryCompile_SOURCE_DIR}/pass2b.cxx - OUTPUT_VARIABLE TRY_OUT) -if(NOT SHOULD_PASS) - message(SEND_ERROR "should pass failed ${TRY_OUT}") -endif() - -# try to compile two files that should not compile -try_compile(SHOULD_FAIL - ${TryCompile_BINARY_DIR} - SOURCES ${TryCompile_SOURCE_DIR}/fail2a.c ${TryCompile_SOURCE_DIR}/fail2b.c - OUTPUT_VARIABLE TRY_OUT) -if(SHOULD_FAIL) - message(SEND_ERROR "Should fail passed ${TRY_OUT}") -endif() - -# try to compile a file that should compile -set(_c_flags "${CMAKE_C_FLAGS}") -if(WATCOM) - string(APPEND CMAKE_C_FLAGS " -dTESTDEF") -else() - string(APPEND CMAKE_C_FLAGS " \"-DTESTDEF\"") -endif() -try_compile(SHOULD_PASS - ${TryCompile_BINARY_DIR} - ${TryCompile_SOURCE_DIR}/testdef.c - OUTPUT_VARIABLE TRY_OUT) -if(NOT SHOULD_PASS) - message(SEND_ERROR "should pass failed ${TRY_OUT}") -endif() -set(CMAKE_C_FLAGS "${_c_flags}") - -try_compile(CMAKE_ANSI_FOR_SCOPE - ${TryCompile_BINARY_DIR} - ${CMAKE_ROOT}/Modules/TestForAnsiForScope.cxx OUTPUT_VARIABLE OUT) -if (CMAKE_ANSI_FOR_SCOPE) - message("Compiler supports ansi for") -else() - message("Compiler does not support ansi for scope") -endif() - -message("use the module now") -include(${CMAKE_ROOT}/Modules/TestForANSIForScope.cmake) -if (CMAKE_ANSI_FOR_SCOPE) - message("Compiler supports ansi for") -else() - message("Compiler does not support ansi for scope") -endif() - -# try to compile a project +if (APPLE) + enable_language(OBJC) + enable_language(OBJCXX) +endif() + + +# run old signature tests +set(try_compile_bindir_or_SOURCES ${TryCompile_BINARY_DIR}) +set(try_compile_redundant_SOURCES SOURCES) +set(try_compile_output_vars OUTPUT_VARIABLE TRY_OUT) +set(try_compile_compile_output_var TRY_OUT) +set(try_compile_run_output_var TRY_OUT) +include(old_and_new_signature_tests.cmake) + +# run new signature tests +set(try_compile_bindir_or_SOURCES SOURCES) +set(try_compile_redundant_SOURCES "") +set(try_compile_output_vars + COMPILE_OUTPUT_VARIABLE COMPILE_OUT + RUN_OUTPUT_VARIABLE RUN_OUTPUT) +set(try_compile_compile_output_var COMPILE_OUT) +set(try_compile_run_output_var RUN_OUTPUT) +include(old_and_new_signature_tests.cmake) + +# try to compile a project (old signature) message("Testing try_compile project mode") try_compile(TEST_INNER ${TryCompile_BINARY_DIR}/CMakeFiles/Inner @@ -142,123 +73,8 @@ try_compile(TEST_INNER OUTPUT_VARIABLE output) TEST_ASSERT(TEST_INNER "try_compile project mode failed:\n${output}") -try_compile(COMPILE_DEFINITIONS_LIST_EXPANDED - ${TryCompile_BINARY_DIR} - ${TryCompile_SOURCE_DIR}/check_a_b.c - OUTPUT_VARIABLE output - COMPILE_DEFINITIONS "-DDEF_A;-DDEF_B" - ) -if(COMPILE_DEFINITIONS_LIST_EXPANDED) - message(STATUS "COMPILE_DEFINITIONS list expanded correctly") -else() - string(REPLACE "\n" "\n " output " ${output}") - message(SEND_ERROR "COMPILE_DEFINITIONS list did not expand correctly\n${output}") -endif() - -try_compile(SHOULD_FAIL_DUE_TO_BAD_SOURCE - ${TryCompile_BINARY_DIR} - ${TryCompile_SOURCE_DIR}/pass.c - OUTPUT_VARIABLE output - COMPILE_DEFINITIONS "bad#source.c" - ) -if(SHOULD_FAIL_DUE_TO_BAD_SOURCE AND NOT CMAKE_GENERATOR MATCHES "Watcom WMake|NMake Makefiles") - string(REPLACE "\n" "\n " output " ${output}") - message(SEND_ERROR "try_compile with bad#source.c did not fail:\n${output}") -elseif(NOT output MATCHES [[(bad#source\.c|bad\.c|bad')]]) - string(REPLACE "\n" "\n " output " ${output}") - message(SEND_ERROR "try_compile with bad#source.c failed without mentioning bad source:\n${output}") -else() - message(STATUS "try_compile with bad#source.c correctly failed") -endif() - add_executable(TryCompile pass.c) -###################################### - -# now two tests for try_run() - -# try to run a file that should compile and run without error -# also check that OUTPUT_VARIABLE contains both the compile output -# and the run output -try_run(SHOULD_RUN SHOULD_COMPILE - ${TryCompile_BINARY_DIR} - ${TryCompile_SOURCE_DIR}/exit_success.c - OUTPUT_VARIABLE TRY_OUT) -if(NOT SHOULD_COMPILE) - message(SEND_ERROR "exit_success failed compiling: ${TRY_OUT}") -endif() -if(NOT "${SHOULD_RUN}" STREQUAL "0") - message(SEND_ERROR "exit_success failed running with exit code ${SHOULD_RUN}") -endif() -# check the compile output for the filename -if(NOT "${TRY_OUT}" MATCHES "exit_success") - message(SEND_ERROR " TRY_OUT didn't contain \"exit_success\": \"${TRY_OUT}\"") -endif() -# check the run output -if(NOT "${TRY_OUT}" MATCHES "hello world") - message(SEND_ERROR " TRY_OUT didn't contain \"hello world\": \"${TRY_OUT}\"") -endif() - -try_run(ARG_TEST_RUN ARG_TEST_COMPILE - ${TryCompile_BINARY_DIR} - ${TryCompile_SOURCE_DIR}/expect_arg.c - OUTPUT_VARIABLE TRY_OUT - ARGS arg1 arg2) -if(NOT ARG_TEST_COMPILE) - message(SEND_ERROR "expect_arg failed compiling: ${TRY_OUT}") -endif() -if(NOT "${ARG_TEST_RUN}" STREQUAL "0") - message(SEND_ERROR "expect_arg failed running with exit code ${ARG_TEST_RUN} ${TRY_OUT}") -endif() - -# try to run a file that should compile and run, but return an error -try_run(SHOULD_EXIT_WITH_ERROR SHOULD_COMPILE - ${TryCompile_BINARY_DIR} - ${TryCompile_SOURCE_DIR}/exit_with_error.c - COMPILE_OUTPUT_VARIABLE COMPILE_OUTPUT - RUN_OUTPUT_VARIABLE RUN_OUTPUT) - -if(NOT SHOULD_COMPILE) - message(STATUS " exit_with_error failed compiling: ${COMPILE_OUTPUT}") -endif() -if("${SHOULD_EXIT_WITH_ERROR}" STREQUAL "0") - message(SEND_ERROR " exit_with_error passed with exit code ${SHOULD_EXIT_WITH_ERROR}") -endif() - -# check the compile output, it should contain the filename -if(NOT "${COMPILE_OUTPUT}" MATCHES "exit_with_error") - message(SEND_ERROR " COMPILE_OUT didn't contain \"exit_with_error\": \"${COMPILE_OUTPUT}\"") -endif() -#... but not the run time output -if("${COMPILE_OUTPUT}" MATCHES "hello world") - message(SEND_ERROR " COMPILE_OUT contains the run output: \"${COMPILE_OUTPUT}\"") -endif() -# check the run output, it should contain stdout -if(NOT "${RUN_OUTPUT}" MATCHES "hello world") - message(SEND_ERROR " RUN_OUTPUT didn't contain \"hello world\": \"${RUN_OUTPUT}\"") -endif() - -# try to run a file and parse stdout and stderr separately -try_run(SHOULD_EXIT_WITH_ERROR SHOULD_COMPILE - ${TryCompile_BINARY_DIR} - ${TryCompile_SOURCE_DIR}/stdout_and_stderr.c - COMPILE_OUTPUT_VARIABLE COMPILE_OUTPUT - RUN_OUTPUT_STDOUT_VARIABLE RUN_OUTPUT_STDOUT - RUN_OUTPUT_STDERR_VARIABLE RUN_OUTPUT_STDERR) - -if(NOT SHOULD_COMPILE) - message(STATUS " exit_with_error failed compiling: ${COMPILE_OUTPUT}") -endif() - -# check the run stdout output -if(NOT "${RUN_OUTPUT_STDOUT}" MATCHES "hello world") - message(SEND_ERROR " RUN_OUTPUT_STDOUT didn't contain \"hello world\": \"${RUN_OUTPUT_STDOUT}\"") -endif() -# check the run stderr output -if(NOT "${RUN_OUTPUT_STDERR}" MATCHES "error") - message(SEND_ERROR " RUN_OUTPUT_STDERR didn't contain \"error\": \"${RUN_OUTPUT_STDERR}\"") -endif() - ####################################################################### # # also test that the CHECK_C_SOURCE_COMPILES, CHECK_CXX_SOURCE_COMPILES @@ -377,25 +193,6 @@ if (APPLE) TEST_ASSERT(SIMPLE_OBJCXX_RUN_SHOULD_WORK "CHECK_OBJCXX_SOURCE_RUNS() failed, but should have succeeded") TEST_FAIL(OBJCXX_RUN_SHOULD_FAIL "CHECK_OBJCXX_SOURCE_RUNS() succeeds, but should have failed") TEST_ASSERT(OBJCXX_RUN_SHOULD_WORK "CHECK_OBJCXX_SOURCE_RUNS() failed, but should have succeeded") - - # try to compile a file that should compile - try_compile(SHOULD_PASS - ${TryCompile_BINARY_DIR} - ${TryCompile_SOURCE_DIR}/pass.m - OUTPUT_VARIABLE TRY_OUT) - if(NOT SHOULD_PASS) - message(SEND_ERROR "should pass failed ${TRY_OUT}") - endif() - - # try to compile a file that should not compile - try_compile(SHOULD_FAIL - ${TryCompile_BINARY_DIR} - ${TryCompile_SOURCE_DIR}/fail.m - OUTPUT_VARIABLE TRY_OUT) - if(SHOULD_FAIL) - message(SEND_ERROR "Should fail passed ${TRY_OUT}") - endif() - endif() ####################################################################### diff --git a/Tests/TryCompile/old_and_new_signature_tests.cmake b/Tests/TryCompile/old_and_new_signature_tests.cmake new file mode 100644 index 0000000..c2dd233 --- /dev/null +++ b/Tests/TryCompile/old_and_new_signature_tests.cmake @@ -0,0 +1,245 @@ +# try to compile a file that should compile +try_compile(SHOULD_PASS + ${try_compile_bindir_or_SOURCES} + ${TryCompile_SOURCE_DIR}/pass.c + OUTPUT_VARIABLE TRY_OUT) +EXPECT_PASS(SHOULD_PASS "${TRY_OUT}") + +# try to compile a file that should compile +# also check that COPY_FILE works +try_compile(SHOULD_PASS + ${try_compile_bindir_or_SOURCES} + ${TryCompile_SOURCE_DIR}/pass.c + OUTPUT_VARIABLE TRY_OUT + COPY_FILE ${TryCompile_BINARY_DIR}/CopyOfPass + ) +EXPECT_PASS(SHOULD_PASS "${TRY_OUT}") + +if(NOT EXISTS "${TryCompile_BINARY_DIR}/CopyOfPass") + message(SEND_ERROR "COPY_FILE to \"${TryCompile_BINARY_DIR}/CopyOfPass\" failed") +else() + file(REMOVE "${TryCompile_BINARY_DIR}/CopyOfPass") +endif() + +# try to compile a file that should compile +# also check that COPY_FILE_ERROR works +file(WRITE ${TryCompile_BINARY_DIR}/invalid "") +try_compile(SHOULD_PASS + ${try_compile_bindir_or_SOURCES} + ${TryCompile_SOURCE_DIR}/pass.c + OUTPUT_VARIABLE TRY_OUT + COPY_FILE ${TryCompile_BINARY_DIR}/invalid/path + COPY_FILE_ERROR _captured + ) +EXPECT_PASS(SHOULD_PASS "${TRY_OUT}") + +if(NOT _captured MATCHES "Cannot copy output executable.*/invalid/path") + message(SEND_ERROR "COPY_FILE_ERROR did not capture expected message") +endif() + +# try to compile a file that should not compile +try_compile(SHOULD_FAIL + ${try_compile_bindir_or_SOURCES} + ${TryCompile_SOURCE_DIR}/fail.c + OUTPUT_VARIABLE TRY_OUT) +EXPECT_FAIL(SHOULD_FAIL "${TRY_OUT}") + +# try to compile two files that should compile +try_compile(SHOULD_PASS + ${try_compile_bindir_or_SOURCES} + ${try_compile_redundant_SOURCES} + ${TryCompile_SOURCE_DIR}/pass2a.c + ${TryCompile_SOURCE_DIR}/pass2b.cxx + OUTPUT_VARIABLE TRY_OUT) +EXPECT_PASS(SHOULD_PASS "${TRY_OUT}") + +# try to compile two files that should not compile +try_compile(SHOULD_FAIL + ${try_compile_bindir_or_SOURCES} + ${try_compile_redundant_SOURCES} + ${TryCompile_SOURCE_DIR}/fail2a.c + ${TryCompile_SOURCE_DIR}/fail2b.c + OUTPUT_VARIABLE TRY_OUT) +EXPECT_FAIL(SHOULD_FAIL "${TRY_OUT}") + +# try to compile a file that should compile +set(_c_flags "${CMAKE_C_FLAGS}") +if(WATCOM) + string(APPEND CMAKE_C_FLAGS " -dTESTDEF") +else() + string(APPEND CMAKE_C_FLAGS " \"-DTESTDEF\"") +endif() +try_compile(SHOULD_PASS + ${try_compile_bindir_or_SOURCES} + ${TryCompile_SOURCE_DIR}/testdef.c + OUTPUT_VARIABLE TRY_OUT) +EXPECT_PASS(SHOULD_PASS "${TRY_OUT}") +set(CMAKE_C_FLAGS "${_c_flags}") + +try_compile(CMAKE_ANSI_FOR_SCOPE + ${try_compile_bindir_or_SOURCES} + ${CMAKE_ROOT}/Modules/TestForAnsiForScope.cxx OUTPUT_VARIABLE OUT) +if(CMAKE_ANSI_FOR_SCOPE) + message("Compiler supports ansi for") +else() + message("Compiler does not support ansi for scope") +endif() + +message("use the module now") +include(${CMAKE_ROOT}/Modules/TestForANSIForScope.cmake) +if(CMAKE_ANSI_FOR_SCOPE) + message("Compiler supports ansi for") +else() + message("Compiler does not support ansi for scope") +endif() + +# test that COMPILE_DEFINITIONS are correctly expanded +try_compile(COMPILE_DEFINITIONS_LIST_EXPANDED + ${try_compile_bindir_or_SOURCES} + ${TryCompile_SOURCE_DIR}/check_a_b.c + OUTPUT_VARIABLE output + COMPILE_DEFINITIONS "-DDEF_A;-DDEF_B" + ) +if(COMPILE_DEFINITIONS_LIST_EXPANDED) + message(STATUS "COMPILE_DEFINITIONS list expanded correctly") +else() + string(REPLACE "\n" "\n " output " ${output}") + message(SEND_ERROR "COMPILE_DEFINITIONS list did not expand correctly\n${output}") +endif() + +# try to compile a file that doesn't exist +try_compile(SHOULD_FAIL_DUE_TO_BAD_SOURCE + ${try_compile_bindir_or_SOURCES} + ${TryCompile_SOURCE_DIR}/pass.c + OUTPUT_VARIABLE output + COMPILE_DEFINITIONS "bad#source.c" + ) +if(SHOULD_FAIL_DUE_TO_BAD_SOURCE AND NOT CMAKE_GENERATOR MATCHES "Watcom WMake|NMake Makefiles") + string(REPLACE "\n" "\n " output " ${output}") + message(SEND_ERROR "try_compile with bad#source.c did not fail:\n${output}") +elseif(NOT output MATCHES [[(bad#source\.c|bad\.c|bad')]]) + string(REPLACE "\n" "\n " output " ${output}") + message(SEND_ERROR "try_compile with bad#source.c failed without mentioning bad source:\n${output}") +else() + message(STATUS "try_compile with bad#source.c correctly failed") +endif() + +if(APPLE) + # try to compile a file that should compile + try_compile(SHOULD_PASS + ${try_compile_bindir_or_SOURCES} + ${TryCompile_SOURCE_DIR}/pass.m + OUTPUT_VARIABLE TRY_OUT) + if(NOT SHOULD_PASS) + message(SEND_ERROR "should pass failed ${TRY_OUT}") + endif() + + # try to compile a file that should not compile + try_compile(SHOULD_FAIL + ${try_compile_bindir_or_SOURCES} + ${TryCompile_SOURCE_DIR}/fail.m + OUTPUT_VARIABLE TRY_OUT) + if(SHOULD_FAIL) + message(SEND_ERROR "Should fail passed ${TRY_OUT}") + endif() +endif() + +###################################### + +# now test try_run() + +# try to run a file that should compile and run without error +# also check that OUTPUT_VARIABLE contains both the compile output +# and the run output +try_run(SHOULD_RUN SHOULD_COMPILE + ${try_compile_bindir_or_SOURCES} + ${TryCompile_SOURCE_DIR}/exit_success.c + ${try_compile_output_vars}) +if(NOT SHOULD_COMPILE) + message(SEND_ERROR + "exit_success failed compiling: ${${try_compile_compile_output_var}}") +endif() +if(NOT "${SHOULD_RUN}" STREQUAL "0") + message(SEND_ERROR + "exit_success failed running with exit code ${SHOULD_RUN}") +endif() +# check the compile output for the filename +if(NOT "${${try_compile_compile_output_var}}" MATCHES "exit_success") + message(SEND_ERROR + " ${try_compile_compile_output_var} didn't contain \"exit_success\":" + " \"${${try_compile_compile_output_var}}\"") +endif() +# check the run output +if(NOT "${${try_compile_run_output_var}}" MATCHES "hello world") + message(SEND_ERROR + " ${try_compile_run_output_var} didn't contain \"hello world\":" + " \"${${try_compile_run_output_var}}\"") +endif() + +try_run(ARG_TEST_RUN ARG_TEST_COMPILE + ${try_compile_bindir_or_SOURCES} + ${TryCompile_SOURCE_DIR}/expect_arg.c + COMPILE_OUTPUT_VARIABLE TRY_OUT + ARGS arg1 arg2) +if(NOT ARG_TEST_COMPILE) + message(SEND_ERROR "expect_arg failed compiling: ${TRY_OUT}") +endif() +if(NOT "${ARG_TEST_RUN}" STREQUAL "0") + message(SEND_ERROR "expect_arg failed running with exit code ${ARG_TEST_RUN} ${TRY_OUT}") +endif() + +# try to run a file that should compile and run, but return an error +try_run(SHOULD_EXIT_WITH_ERROR SHOULD_COMPILE + ${try_compile_bindir_or_SOURCES} + ${TryCompile_SOURCE_DIR}/exit_with_error.c + COMPILE_OUTPUT_VARIABLE COMPILE_OUTPUT + RUN_OUTPUT_VARIABLE RUN_OUTPUT) + +if(NOT SHOULD_COMPILE) + message(STATUS " exit_with_error failed compiling: ${COMPILE_OUTPUT}") +endif() +if("${SHOULD_EXIT_WITH_ERROR}" STREQUAL "0") + message(SEND_ERROR " exit_with_error passed with exit code ${SHOULD_EXIT_WITH_ERROR}") +endif() + +# check the compile output, it should contain the filename +if(NOT "${COMPILE_OUTPUT}" MATCHES "exit_with_error") + message(SEND_ERROR " COMPILE_OUT didn't contain \"exit_with_error\": \"${COMPILE_OUTPUT}\"") +endif() +#... but not the run time output +if("${COMPILE_OUTPUT}" MATCHES "hello world") + message(SEND_ERROR " COMPILE_OUT contains the run output: \"${COMPILE_OUTPUT}\"") +endif() +# check the run output, it should contain stdout +if(NOT "${RUN_OUTPUT}" MATCHES "hello world") + message(SEND_ERROR " RUN_OUTPUT didn't contain \"hello world\": \"${RUN_OUTPUT}\"") +endif() + +# try to run a file and parse stdout and stderr separately +# also check that COPY_FILE works +try_run(SHOULD_EXIT_WITH_ERROR SHOULD_COMPILE + ${try_compile_bindir_or_SOURCES} + ${TryCompile_SOURCE_DIR}/stdout_and_stderr.c + COPY_FILE ${TryCompile_BINARY_DIR}/CopyOfRun + COMPILE_OUTPUT_VARIABLE COMPILE_OUTPUT + RUN_OUTPUT_STDOUT_VARIABLE RUN_OUTPUT_STDOUT + RUN_OUTPUT_STDERR_VARIABLE RUN_OUTPUT_STDERR) + +if(NOT SHOULD_COMPILE) + message(STATUS " exit_with_error failed compiling: ${COMPILE_OUTPUT}") +endif() + +if(NOT EXISTS "${TryCompile_BINARY_DIR}/CopyOfRun") + message(SEND_ERROR "COPY_FILE to \"${TryCompile_BINARY_DIR}/CopyOfRun\" failed") +else() + file(REMOVE "${TryCompile_BINARY_DIR}/CopyOfRun") +endif() + +# check the run stdout output +if(NOT "${RUN_OUTPUT_STDOUT}" MATCHES "hello world") + message(SEND_ERROR " RUN_OUTPUT_STDOUT didn't contain \"hello world\": \"${RUN_OUTPUT_STDOUT}\"") +endif() +# check the run stderr output +if(NOT "${RUN_OUTPUT_STDERR}" MATCHES "error") + message(SEND_ERROR " RUN_OUTPUT_STDERR didn't contain \"error\": \"${RUN_OUTPUT_STDERR}\"") +endif() |