diff options
234 files changed, 1901 insertions, 1595 deletions
diff --git a/CMakeCPack.cmake b/CMakeCPack.cmake index 78e22cc..31c2fe4 100644 --- a/CMakeCPack.cmake +++ b/CMakeCPack.cmake @@ -215,7 +215,7 @@ if(NOT DEFINED CPACK_PACKAGE_FILE_NAME) endif() endif() -set(CPACK_PACKAGE_CONTACT "cmake@cmake.org") +set(CPACK_PACKAGE_CONTACT "cmake+development@discourse.cmake.org") if(UNIX) set(CPACK_STRIP_FILES "${CMAKE_BIN_DIR}/ccmake;${CMAKE_BIN_DIR}/cmake;${CMAKE_BIN_DIR}/cpack;${CMAKE_BIN_DIR}/ctest") diff --git a/Help/command/ctest_test.rst b/Help/command/ctest_test.rst index 0a33da3..7a3393b 100644 --- a/Help/command/ctest_test.rst +++ b/Help/command/ctest_test.rst @@ -17,7 +17,7 @@ Perform the :ref:`CTest Test Step` as a :ref:`Dashboard Client`. [EXCLUDE_FIXTURE_SETUP <regex>] [EXCLUDE_FIXTURE_CLEANUP <regex>] [PARALLEL_LEVEL <level>] - [HARDWARE_SPEC_FILE <file>] + [RESOURCE_SPEC_FILE <file>] [TEST_LOAD <threshold>] [SCHEDULE_RANDOM <ON|OFF>] [STOP_TIME <time-of-day>] @@ -83,10 +83,10 @@ The options are: Specify a positive number representing the number of tests to be run in parallel. -``HARDWARE_SPEC_FILE <file>`` +``RESOURCE_SPEC_FILE <file>`` Specify a - :ref:`hardware specification file <ctest-hardware-specification-file>`. See - :ref:`ctest-hardware-allocation` for more information. + :ref:`resource specification file <ctest-resource-specification-file>`. See + :ref:`ctest-resource-allocation` for more information. ``TEST_LOAD <threshold>`` While running tests in parallel, try not to start tests when they diff --git a/Help/command/file.rst b/Help/command/file.rst index 83e4516..b186177 100644 --- a/Help/command/file.rst +++ b/Help/command/file.rst @@ -187,14 +187,14 @@ The arguments are as follows: are typically created with :command:`add_executable`, but they do not have to be created by CMake. On Apple platforms, the paths to these files determine the value of ``@executable_path`` when recursively resolving the libraries. - Specifying ``STATIC`` libraries, ``MODULE`` s, or ``SHARED`` libraries here + Specifying any kind of library (``STATIC``, ``MODULE``, or ``SHARED``) here will result in undefined behavior. ``LIBRARIES <library_files>`` List of library files to read for dependencies. These are libraries that are typically created with :command:`add_library(SHARED)`, but they do not have - to be created by CMake. Specifying ``STATIC`` libraries, ``MODULE`` s, or - executables here will result in undefined behavior. + to be created by CMake. Specifying ``STATIC`` libraries, ``MODULE`` + libraries, or executables here will result in undefined behavior. ``MODULES <module_files>`` List of loadable module files to read for dependencies. These are modules @@ -209,13 +209,13 @@ The arguments are as follows: platforms, these directories are searched if the dependency is not found in any of the other usual paths. If it is found in such a directory, a warning is issued, because it means that the file is incomplete (it does not list all - of the directories that contain its dependencies.) On Windows platforms, + of the directories that contain its dependencies). On Windows platforms, these directories are searched if the dependency is not found in any of the other search paths, but no warning is issued, because searching other paths is a normal part of Windows dependency resolution. On Apple platforms, this argument has no effect. -``BUNDLE_EXECTUBLE <bundle_executable_file>`` +``BUNDLE_EXECUTABLE <bundle_executable_file>`` Executable to treat as the "bundle executable" when resolving libraries. On Apple platforms, this argument determines the value of ``@executable_path`` when recursively resolving libraries for ``LIBRARIES`` and ``MODULES`` files. @@ -284,7 +284,7 @@ On Linux platforms, library resolution works as follows: dependency is resolved to that file. In this case, a warning is issued, because finding a file in one of the ``DIRECTORIES`` means that the depending file is not complete (it does not list all the directories from - which it pulls dependencies.) + which it pulls dependencies). 5. Otherwise, the dependency is unresolved. On Windows platforms, library resolution works as follows: @@ -331,8 +331,8 @@ On Windows platforms, library resolution works as follows: dependency is resolved to that file. 5. Otherwise, if the library exists in one of the directories specified by ``DIRECTORIES``, in the order they are listed, the dependency is resolved to - that file. (In this case, a warning is not issued, because searching other - directories is a normal part of Windows library resolution.) + that file. In this case, a warning is not issued, because searching other + directories is a normal part of Windows library resolution. 6. Otherwise, the dependency is unresolved. On Apple platforms, library resolution works as follows: @@ -350,9 +350,9 @@ On Apple platforms, library resolution works as follows: existing file, the dependency is resolved to that file. 4. Otherwise, if the dependency starts with ``@rpath/``, and replacing ``@rpath/`` with one of the ``RPATH`` entries of the depending file yields - an existing file, the dependency is resolved to that file. (Note that + an existing file, the dependency is resolved to that file. Note that ``RPATH`` entries that start with ``@executable_path/`` or ``@loader_path/`` - also have these items replaced with the appropriate path.) + also have these items replaced with the appropriate path. 5. Otherwise, if the dependency is an absolute file that exists, the dependency is resolved to that file. 6. Otherwise, the dependency is unresolved. diff --git a/Help/command/find_package.rst b/Help/command/find_package.rst index 546b00f..64a16f3 100644 --- a/Help/command/find_package.rst +++ b/Help/command/find_package.rst @@ -353,8 +353,10 @@ enabled. 8. Search paths stored in the CMake :ref:`System Package Registry`. This can be skipped if ``NO_CMAKE_SYSTEM_PACKAGE_REGISTRY`` is passed - or by setting the + or by setting the :variable:`CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY` + variable to ``FALSE`` or the deprecated variable :variable:`CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY` to ``TRUE``. + See the :manual:`cmake-packages(7)` manual for details on the system package registry. diff --git a/Help/command/list.rst b/Help/command/list.rst index 39e7e2a..50bf417 100644 --- a/Help/command/list.rst +++ b/Help/command/list.rst @@ -180,7 +180,7 @@ Insert elements to the 0th position in the list. list(REMOVE_ITEM <list> <value> [<value> ...]) -Removes the given items from the list. +Removes all instances of the given items from the list. .. _REMOVE_AT: diff --git a/Help/command/load_cache.rst b/Help/command/load_cache.rst index 33625c4..b89eb61 100644 --- a/Help/command/load_cache.rst +++ b/Help/command/load_cache.rst @@ -5,7 +5,7 @@ Load in the values from another project's CMake cache. .. code-block:: cmake - load_cache(pathToCacheFile READ_WITH_PREFIX prefix entry1...) + load_cache(pathToBuildDirectory READ_WITH_PREFIX prefix entry1...) Reads the cache and store the requested entries in variables with their name prefixed with the given prefix. This only reads the values, and @@ -13,7 +13,7 @@ does not create entries in the local project's cache. .. code-block:: cmake - load_cache(pathToCacheFile [EXCLUDE entry1...] + load_cache(pathToBuildDirectory [EXCLUDE entry1...] [INCLUDE_INTERNALS entry1...]) Loads in the values from another cache and store them in the local diff --git a/Help/command/target_precompile_headers.rst b/Help/command/target_precompile_headers.rst index d283948..5ab3766 100644 --- a/Help/command/target_precompile_headers.rst +++ b/Help/command/target_precompile_headers.rst @@ -79,6 +79,17 @@ must be available for the compiler to find them. Other header file names source directory (e.g. :variable:`CMAKE_CURRENT_SOURCE_DIR`) and will be included by absolute path. +When specifying angle brackets inside a :manual:`generator expression +<cmake-generator-expressions(7)>`, be sure to encode the closing ``>`` +as ``$<ANGLE-R>``. For example: + +.. code-block:: cmake + + target_precompile_headers(mylib PRIVATE + "$<$<COMPILE_LANGUAGE:C>:<stddef.h$<ANGLE-R>>" + "$<$<COMPILE_LANGUAGE:CXX>:<cstddef$<ANGLE-R>>" + ) + See Also ^^^^^^^^ diff --git a/Help/dev/maint.rst b/Help/dev/maint.rst index 37a1d3a..44e2273 100644 --- a/Help/dev/maint.rst +++ b/Help/dev/maint.rst @@ -279,10 +279,11 @@ Push the update to the ``master`` and ``release`` branches: Announce 'release' Branch ------------------------- -Send email to the ``cmake-developers@cmake.org`` mailing list (perhaps -in reply to a release preparation thread) announcing that post-release -development is open:: +Post a topic to the `CMake Discourse Forum Development Category`_ +announcing that post-release development is open:: - I've branched 'release' for $ver. The repository is now open for - post-$ver development. Please rebase open merge requests on 'master' + I've branched `release` for $ver. The repository is now open for + post-$ver development. Please rebase open merge requests on `master` before staging or merging. + +.. _`CMake Discourse Forum Development Category`: https://discourse.cmake.org/c/development diff --git a/Help/guide/tutorial/index.rst b/Help/guide/tutorial/index.rst index d858c25..3f20aa2 100644 --- a/Help/guide/tutorial/index.rst +++ b/Help/guide/tutorial/index.rst @@ -18,9 +18,9 @@ A Basic Starting Point (Step 1) =============================== The most basic project is an executable built from source code files. -For simple projects, a three line CMakeLists file is all that is required. -This will be the starting point for our tutorial. Create a ``CMakeLists.txt`` -file in the ``Step1`` directory that looks like: +For simple projects, a three line ``CMakeLists.txt`` file is all that is +required. This will be the starting point for our tutorial. Create a +``CMakeLists.txt`` file in the ``Step1`` directory that looks like: .. code-block:: cmake @@ -33,7 +33,7 @@ file in the ``Step1`` directory that looks like: add_executable(Tutorial tutorial.cxx) -Note that this example uses lower case commands in the CMakeLists file. +Note that this example uses lower case commands in the ``CMakeLists.txt`` file. Upper, lower, and mixed case commands are supported by CMake. The source code for ``tutorial.cxx`` is provided in the ``Step1`` directory and can be used to compute the square root of a number. @@ -43,9 +43,9 @@ Adding a Version Number and Configured Header File The first feature we will add is to provide our executable and project with a version number. While we could do this exclusively in the source code, using -CMakeLists provides more flexibility. +``CMakeLists.txt`` provides more flexibility. -First, modify the CMakeLists file to set the version number. +First, modify the ``CMakeLists.txt`` file to set the version number. .. literalinclude:: Step2/CMakeLists.txt :language: cmake @@ -61,7 +61,7 @@ code: Since the configured file will be written into the binary tree, we must add that directory to the list of paths to search for include -files. Add the following lines to the end of the CMakeLists file: +files. Add the following lines to the end of the ``CMakeLists.txt`` file: .. literalinclude:: Step2/CMakeLists.txt :language: cmake @@ -103,8 +103,8 @@ Next let's add some C++11 features to our project by replacing ``atof`` with We will need to explicitly state in the CMake code that it should use the correct flags. The easiest way to enable support for a specific C++ standard in CMake is by using the ``CMAKE_CXX_STANDARD`` variable. For this tutorial, -set the ``CMAKE_CXX_STANDARD`` variable in the CMakeLists file to 11 and -``CMAKE_CXX_STANDARD_REQUIRED`` to True: +set the ``CMAKE_CXX_STANDARD`` variable in the ``CMakeLists.txt`` file to 11 +and ``CMAKE_CXX_STANDARD_REQUIRED`` to True: .. literalinclude:: Step2/CMakeLists.txt :language: cmake @@ -145,22 +145,22 @@ then use this library instead of the standard square root function provided by the compiler. For this tutorial we will put the library into a subdirectory -called MathFunctions. This directory already contains a header file, +called ``MathFunctions``. This directory already contains a header file, ``MathFunctions.h``, and a source file ``mysqrt.cxx``. The source file has one function called ``mysqrt`` that provides similar functionality to the compiler's ``sqrt`` function. -Add the following one line ``CMakeLists.txt`` file to the MathFunctions +Add the following one line ``CMakeLists.txt`` file to the ``MathFunctions`` directory: .. literalinclude:: Step3/MathFunctions/CMakeLists.txt :language: cmake To make use of the new library we will add an ``add_subdirectory`` call in the -top-level CMakeLists file so that the library will get built. We add the new -library to the executable, and add MathFunctions as an include directory so -that the ``mqsqrt.h`` header file can be found. The last few lines of the -top-level CMakeLists file should now look like: +top-level ``CMakeLists.txt`` file so that the library will get built. We add +the new library to the executable, and add ``MathFunctions`` as an include +directory so that the ``mqsqrt.h`` header file can be found. The last few lines +of the top-level ``CMakeLists.txt`` file should now look like: .. code-block:: cmake @@ -181,8 +181,8 @@ top-level CMakeLists file should now look like: Now let us make the MathFunctions library optional. While for the tutorial there really isn’t any need to do so, for larger projects this is a common -occurrence. The first step is to add an option to the top-level CMakeLists -file. +occurrence. The first step is to add an option to the top-level +``CMakeLists.txt`` file. .. literalinclude:: Step3/CMakeLists.txt :language: cmake @@ -195,8 +195,8 @@ the cache so that the user does not need to set the value each time they run CMake on a build directory. The next change is to make building and linking the MathFunctions library -conditional. To do this we change the end of the top-level CMakeLists file to -look like the following: +conditional. To do this we change the end of the top-level ``CMakeLists.txt`` +file to look like the following: .. literalinclude:: Step3/CMakeLists.txt :language: cmake @@ -209,15 +209,15 @@ classic approach when dealing with many optional components, we will cover the modern approach in the next step. The corresponding changes to the source code are fairly straightforward. First, -in ``tutorial.cxx``, include the MathFunctions header if we need it: +in ``tutorial.cxx``, include the ``MathFunctions.h`` header if we need it: .. literalinclude:: Step3/tutorial.cxx :language: c++ :start-after: // should we include the MathFunctions header :end-before: int main -Then, in the same file, make which square root function is used dependent on -``USE_MYMATH``: +Then, in the same file, make ``USE_MYMATH`` control which square root +function is used: .. literalinclude:: Step3/tutorial.cxx :language: c++ @@ -268,7 +268,7 @@ doesn't. Add the following lines to the end of ``MathFunctions/CMakeLists.txt``: Now that we've specified usage requirements for MathFunctions we can safely remove our uses of the ``EXTRA_INCLUDES`` variable from the top-level -CMakeLists, here: +``CMakeLists.txt``, here: .. literalinclude:: Step4/CMakeLists.txt :language: cmake @@ -330,9 +330,9 @@ Verify that the installed Tutorial runs. Testing Support --------------- -Next let's test our application. At the end of the top-level CMakeLists file we -can enable testing and then add a number of basic tests to verify that the -application is working correctly. +Next let's test our application. At the end of the top-level ``CMakeLists.txt`` +file we can enable testing and then add a number of basic tests to verify that +the application is working correctly. .. literalinclude:: Step5/CMakeLists.txt :language: cmake @@ -344,7 +344,7 @@ test. The next test makes use of the ``PASS_REGULAR_EXPRESSION`` test property to verify that the output of the test contains certain strings. In this case, -verifying that the the usage message is printed when an incorrect number of +verifying that the usage message is printed when an incorrect number of arguments are provided. Lastly, we have a function called ``do_test`` that runs the application and @@ -370,9 +370,9 @@ tutorial assume that they are not common. If the platform has ``log`` and ``exp`` then we will use them to compute the square root in the ``mysqrt`` function. We first test for the availability of -these functions using the ``CheckSymbolExists.cmake`` macro in the top-level -CMakeLists. We're going to use the new defines in ``TutorialConfig.h.in``, -so be sure to set them before that file is configured. +these functions using the ``CheckSymbolExists`` module in the top-level +``CMakeLists.txt``. We're going to use the new defines in +``TutorialConfig.h.in``, so be sure to set them before that file is configured. .. literalinclude:: Step6/MathFunctions/CMakeLists.txt :language: cmake @@ -405,9 +405,8 @@ You will notice that we're not using ``log`` and ``exp``, even if we think they should be available. We should realize quickly that we have forgotten to include ``TutorialConfig.h`` in ``mysqrt.cxx``. -We will also need to update MathFunctions/CMakeLists so ``mysqrt.cxx`` knows -where this file is located: - +We will also need to update ``MathFunctions/CMakeLists.txt`` so ``mysqrt.cxx`` +knows where this file is located: .. code-block:: cmake @@ -432,10 +431,10 @@ other than in ``TutorialConfig.h``? Let's try to use First, remove the defines from ``TutorialConfig.h.in``. We no longer need to include ``TutorialConfig.h`` from ``mysqrt.cxx`` or the extra include in -MathFunctions/CMakeLists. +``MathFunctions/CMakeLists.txt``. Next, we can move the check for ``HAVE_LOG`` and ``HAVE_EXP`` to -MathFunctions/CMakeLists and then add specify those values as ``PRIVATE`` +``MathFunctions/CMakeLists.txt`` and then specify those values as ``PRIVATE`` compile definitions. .. literalinclude:: Step6/MathFunctions/CMakeLists.txt @@ -444,7 +443,7 @@ compile definitions. :end-before: # install rules After making these updates, go ahead and build the project again. Run the -built Tutorial executable and verify that the results are same as earlier in +built Tutorial executable and verify that the results are same as earlier in this step. Adding a Custom Command and Generated File (Step 6) @@ -457,22 +456,23 @@ In this section, we will create the table as part of the build process, and then compile that table into our application. First, let's remove the check for the ``log`` and ``exp`` functions in -MathFunctions/CMakeLists. Then remove the check for ``HAVE_LOG`` and +``MathFunctions/CMakeLists.txt``. Then remove the check for ``HAVE_LOG`` and ``HAVE_EXP`` from ``mysqrt.cxx``. At the same time, we can remove :code:`#include <cmath>`. -In the MathFunctions subdirectory, a new source file named ``MakeTable.cxx`` +In the ``MathFunctions`` subdirectory, a new source file named ``MakeTable.cxx`` has been provided to generate the table. After reviewing the file, we can see that the table is produced as valid C++ code and that the output filename is passed in as an argument. -The next step is to add the appropriate commands to MathFunctions CMakeLists -file to build the MakeTable executable and then run it as part of the build -process. A few commands are needed to accomplish this. +The next step is to add the appropriate commands to the +``MathFunctions/CMakeLists.txt`` file to build the MakeTable executable and +then run it as part of the build process. A few commands are needed to +accomplish this. -First, at the top of MathFunctions/CMakeLists, the executable for ``MakeTable`` -is added as any other executable would be added. +First, at the top of ``MathFunctions/CMakeLists.txt``, the executable for +``MakeTable`` is added as any other executable would be added. .. literalinclude:: Step7/MathFunctions/CMakeLists.txt :language: cmake @@ -619,7 +619,7 @@ type must be specified:: Or, from an IDE, build the ``Experimental`` target. -Ctest will build and test the project and submit the results to the Kitware +``ctest`` will build and test the project and submit the results to the Kitware public dashboard. The results of your dashboard will be uploaded to Kitware's public dashboard here: https://my.cdash.org/index.php?project=CMakeTutorial. @@ -628,8 +628,8 @@ Mixing Static and Shared (Step 9) In this section we will show how by using the ``BUILD_SHARED_LIBS`` variable we can control the default behavior of ``add_library``, and allow control -over how libraries without an explicit type (STATIC/SHARED/MODULE/OBJECT) are -built. +over how libraries without an explicit type (``STATIC``, ``SHARED``, ``MODULE`` +or ``OBJECT``) are built. To accomplish this we need to add ``BUILD_SHARED_LIBS`` to the top-level ``CMakeLists.txt``. We use the ``option`` command as it allows users to @@ -678,10 +678,10 @@ Finally, update ``MathFunctions/MathFunctions.h`` to use dll export defines: :language: c++ At this point, if you build everything, you will notice that linking fails -as we are combining a static library without position enabled code with a -library that has position enabled code. The solution to this is to explicitly -set the ``POSITION_INDEPENDENT_CODE`` target property of SqrtLibrary to be -True no matter the build type. +as we are combining a static library without position independent code with a +library that has position independent code. The solution to this is to +explicitly set the ``POSITION_INDEPENDENT_CODE`` target property of SqrtLibrary +to be True no matter the build type. .. literalinclude:: Step10/MathFunctions/CMakeLists.txt :language: cmake @@ -718,7 +718,7 @@ string, and ``<1:...>`` results in the content of "...". They can also be nested. A common usage of generator expressions is to conditionally add compiler -flags, such as those as language levels or warnings. A nice pattern is +flags, such as those for language levels or warnings. A nice pattern is to associate this information to an ``INTERFACE`` target allowing this information to propagate. Lets start by constructing an ``INTERFACE`` target and specifying the required C++ standard level of ``11`` instead @@ -816,19 +816,19 @@ directory and from an install / package. This means converting the :start-after: # to find MathFunctions.h, while we don't. :end-before: # should we use our own math functions -Once this has been updated, we can re-run CMake and see verify that it doesn't +Once this has been updated, we can re-run CMake and verify that it doesn't warn anymore. At this point, we have CMake properly packaging the target information that is required but we will still need to generate a ``MathFunctionsConfig.cmake`` so -that the CMake ``find_package command`` can find our project. So let's go +that the CMake ``find_package`` command can find our project. So let's go ahead and add a new file to the top-level of the project called ``Config.cmake.in`` with the following contents: .. literalinclude:: Complete/Config.cmake.in Then, to properly configure and install that file, add the following to the -bottom of the top-level CMakeLists: +bottom of the top-level ``CMakeLists.txt``: .. literalinclude:: Complete/CMakeLists.txt :language: cmake @@ -838,7 +838,7 @@ bottom of the top-level CMakeLists: At this point, we have generated a relocatable CMake Configuration for our project that can be used after the project has been installed or packaged. If we want our project to also be used from a build directory we only have to add -the following to the bottom of the top level CMakeLists: +the following to the bottom of the top level ``CMakeLists.txt``: .. literalinclude:: Complete/CMakeLists.txt :language: cmake @@ -851,7 +851,7 @@ other projects, without needing it to be installed. Import a CMake Project (Consumer) ================================= -This examples shows how a project can find other CMake packages that +This example shows how a project can find other CMake packages that generate ``Config.cmake`` files. It also shows how to state a project's external dependencies when generating @@ -860,22 +860,24 @@ a ``Config.cmake``. Packaging Debug and Release (MultiPackage) ========================================== -By default CMake is model is that a build directory only contains a single +By default CMake's model is that a build directory only contains a single configuration, be it Debug, Release, MinSizeRel, or RelWithDebInfo. But it is possible to setup CPack to bundle multiple build directories at the same time to build a package that contains multiple configurations of the same project. -First we need to ahead and construct a directory called ``multi_config`` this +First we need to construct a directory called ``multi_config``, which will contain all the builds that we want to package together. Second create a ``debug`` and ``release`` directory underneath ``multi_config``. At the end you should have a layout that looks like: -─ multi_config - ├── debug - └── release +.. code-block:: none + + ─ multi_config + ├── debug + └── release Now we need to setup debug and release builds, which would roughly entail the following: @@ -891,8 +893,9 @@ the following: cd .. -Now that both the debug and release builds are complete we can now use -the custom MultiCPackConfig to package both builds into a single release. +Now that both the debug and release builds are complete, we can use +a custom ``MultiCPackConfig.cmake`` file to package both builds into a single +release. .. code-block:: console diff --git a/Help/manual/LINKS.txt b/Help/manual/LINKS.txt index 60a260c..810fa0b 100644 --- a/Help/manual/LINKS.txt +++ b/Help/manual/LINKS.txt @@ -11,11 +11,7 @@ Online Documentation and Community Resources Links to available documentation and community resources may be found on this web page. -Mailing List - https://cmake.org/mailing-lists +Discourse Forum + https://discourse.cmake.org - For help and discussion about using CMake, a mailing list is - provided at cmake@cmake.org. The list is member-post-only but one - may sign up on the CMake web page. Please first read the full - documentation at https://cmake.org before posting questions to - the list. + The Discourse Forum hosts discussion and questions about CMake. diff --git a/Help/manual/cmake-compile-features.7.rst b/Help/manual/cmake-compile-features.7.rst index 658694a..a821189 100644 --- a/Help/manual/cmake-compile-features.7.rst +++ b/Help/manual/cmake-compile-features.7.rst @@ -90,21 +90,21 @@ Requiring Language Standards In projects that use a large number of commonly available features from a particular language standard (e.g. C++ 11) one may specify a meta-feature (e.g. ``cxx_std_11``) that requires use of a compiler mode -aware of that standard. This is simpler than specifying all the -features individually, but does not guarantee the existence of any -particular feature. Diagnosis of use of unsupported features will be -delayed until compile time. +that is at minimum aware of that standard, but could be greater. +This is simpler than specifying all the features individually, but does +not guarantee the existence of any particular feature. +Diagnosis of use of unsupported features will be delayed until compile time. For example, if C++ 11 features are used extensively in a project's -header files, then clients must use a compiler mode aware of C++ 11 -or above. This can be requested with the code: +header files, then clients must use a compiler mode that is no less +than C++ 11. This can be requested with the code: .. code-block:: cmake target_compile_features(mylib PUBLIC cxx_std_11) In this example, CMake will ensure the compiler is invoked in a mode -that is aware of C++ 11 (or above), adding flags such as +of at-least C++ 11 (or C++ 14, C++ 17, ...), adding flags such as ``-std=gnu++11`` if necessary. This applies to sources within ``mylib`` as well as any dependents (that may include headers from ``mylib``). @@ -331,12 +331,12 @@ and :prop_gbl:`compile features <CMAKE_CXX_KNOWN_FEATURES>` available from the following :variable:`compiler ids <CMAKE_<LANG>_COMPILER_ID>` as of the versions specified for each: -* ``AppleClang``: Apple Clang for Xcode versions 4.4 though 9.2. -* ``Clang``: Clang compiler versions 2.9 through 6.0. -* ``GNU``: GNU compiler versions 4.4 through 8.0. -* ``MSVC``: Microsoft Visual Studio versions 2010 through 2017. -* ``SunPro``: Oracle SolarisStudio versions 12.4 through 12.6. -* ``Intel``: Intel compiler versions 12.1 through 17.0. +* ``AppleClang``: Apple Clang for Xcode versions 4.4+. +* ``Clang``: Clang compiler versions 2.9+. +* ``GNU``: GNU compiler versions 4.4+. +* ``MSVC``: Microsoft Visual Studio versions 2010+. +* ``SunPro``: Oracle SolarisStudio versions 12.4+. +* ``Intel``: Intel compiler versions 12.1+. CMake is currently aware of the :prop_tgt:`C standards <C_STANDARD>` and :prop_gbl:`compile features <CMAKE_C_KNOWN_FEATURES>` available from @@ -344,16 +344,16 @@ the following :variable:`compiler ids <CMAKE_<LANG>_COMPILER_ID>` as of the versions specified for each: * all compilers and versions listed above for C++. -* ``GNU``: GNU compiler versions 3.4 through 8.0. +* ``GNU``: GNU compiler versions 3.4+ CMake is currently aware of the :prop_tgt:`C++ standards <CXX_STANDARD>` and their associated meta-features (e.g. ``cxx_std_11``) available from the following :variable:`compiler ids <CMAKE_<LANG>_COMPILER_ID>` as of the versions specified for each: -* ``Cray``: Cray Compiler Environment version 8.1 through 8.5.8. -* ``PGI``: PGI version 12.10 through 17.5. -* ``XL``: IBM XL version 10.1 through 13.1.5. +* ``Cray``: Cray Compiler Environment version 8.1+. +* ``PGI``: PGI version 12.10+. +* ``XL``: IBM XL version 10.1+. CMake is currently aware of the :prop_tgt:`C standards <C_STANDARD>` and their associated meta-features (e.g. ``c_std_99``) available from the @@ -367,4 +367,4 @@ CMake is currently aware of the :prop_tgt:`CUDA standards <CUDA_STANDARD>` from the following :variable:`compiler ids <CMAKE_<LANG>_COMPILER_ID>` as of the versions specified for each: -* ``NVIDIA``: NVIDIA nvcc compiler 7.5 though 9.1. +* ``NVIDIA``: NVIDIA nvcc compiler 7.5+. diff --git a/Help/manual/cmake-generator-expressions.7.rst b/Help/manual/cmake-generator-expressions.7.rst index ba9887c..75f4bd4 100644 --- a/Help/manual/cmake-generator-expressions.7.rst +++ b/Help/manual/cmake-generator-expressions.7.rst @@ -47,8 +47,8 @@ Logical Operators ----------------- ``$<BOOL:string>`` - Converts ``string`` to ``0`` or ``1`` according to the rules of the - :command:`if()` command. Evaluates to ``0`` if any of the following is true: + Converts ``string`` to ``0`` or ``1``. Evaluates to ``0`` if any of the + following is true: * ``string`` is empty, * ``string`` is a case-insensitive equal of diff --git a/Help/manual/cmake-properties.7.rst b/Help/manual/cmake-properties.7.rst index 1369aa3..a59dd6b 100644 --- a/Help/manual/cmake-properties.7.rst +++ b/Help/manual/cmake-properties.7.rst @@ -414,10 +414,10 @@ Properties on Tests /prop_test/LABELS /prop_test/MEASUREMENT /prop_test/PASS_REGULAR_EXPRESSION - /prop_test/PROCESSES /prop_test/PROCESSOR_AFFINITY /prop_test/PROCESSORS /prop_test/REQUIRED_FILES + /prop_test/RESOURCE_GROUPS /prop_test/RESOURCE_LOCK /prop_test/RUN_SERIAL /prop_test/SKIP_REGULAR_EXPRESSION diff --git a/Help/manual/cmake-variables.7.rst b/Help/manual/cmake-variables.7.rst index 0442d89..360140c 100644 --- a/Help/manual/cmake-variables.7.rst +++ b/Help/manual/cmake-variables.7.rst @@ -191,6 +191,7 @@ Variables that Change Behavior /variable/CMAKE_FIND_USE_PACKAGE_REGISTRY /variable/CMAKE_FIND_USE_PACKAGE_ROOT_PATH /variable/CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH + /variable/CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY /variable/CMAKE_FRAMEWORK_PATH /variable/CMAKE_IGNORE_PATH /variable/CMAKE_INCLUDE_DIRECTORIES_BEFORE diff --git a/Help/manual/cpack.1.rst b/Help/manual/cpack.1.rst index f82c466..395cd41 100644 --- a/Help/manual/cpack.1.rst +++ b/Help/manual/cpack.1.rst @@ -55,6 +55,8 @@ Options When the CMake project uses a multi-configuration generator such as Xcode or Visual Studio, this option is needed to tell ``cpack`` which built executables to include in the package. + The user is responsible for ensuring that the configuration(s) listed + have already been built before invoking ``cpack``. ``-D <var>=<value>`` Set a CPack variable. This will override any value set for ``<var>`` in the diff --git a/Help/manual/ctest.1.rst b/Help/manual/ctest.1.rst index a18d43f..dbefb91 100644 --- a/Help/manual/ctest.1.rst +++ b/Help/manual/ctest.1.rst @@ -90,14 +90,14 @@ Options See `Label and Subproject Summary`_. -``--hardware-spec-file <file>`` - Run CTest with :ref:`hardware allocation <ctest-hardware-allocation>` enabled, +``--resource-spec-file <file>`` + Run CTest with :ref:`resource allocation <ctest-resource-allocation>` enabled, using the - :ref:`hardware specification file <ctest-hardware-specification-file>` + :ref:`resource specification file <ctest-resource-specification-file>` specified in ``<file>``. When ``ctest`` is run as a `Dashboard Client`_ this sets the - ``HardwareSpecFile`` option of the `CTest Test Step`_. + ``ResourceSpecFile`` option of the `CTest Test Step`_. ``--test-load <level>`` While running tests in parallel (e.g. with ``-j``), try not to start @@ -967,10 +967,10 @@ Arguments to the command may specify some of the step settings. Configuration settings include: -``HardwareSpecFile`` +``ResourceSpecFile`` Specify a - :ref:`hardware specification file <ctest-hardware-specification-file>`. See - :ref:`ctest-hardware-allocation` for more information. + :ref:`resource specification file <ctest-resource-specification-file>`. See + :ref:`ctest-resource-allocation` for more information. ``LabelsForSubprojects`` Specify a semicolon-separated list of labels that will be treated as @@ -1281,22 +1281,22 @@ model is defined as follows: Test properties. Can contain keys for each of the supported test properties. -.. _`ctest-hardware-allocation`: +.. _`ctest-resource-allocation`: -Hardware Allocation +Resource Allocation =================== -CTest provides a mechanism for tests to specify the hardware that they need and -how much of it they need, and for users to specify the hardware availiable on +CTest provides a mechanism for tests to specify the resources that they need +in a fine-grained way, and for users to specify the resources availiable on the running machine. This allows CTest to internally keep track of which -hardware is in use and which is free, scheduling tests in a way that prevents -them from trying to claim hardware that is not available. +resources are in use and which are free, scheduling tests in a way that +prevents them from trying to claim resources that are not available. A common use case for this feature is for tests that require the use of a GPU. Multiple tests can simultaneously allocate memory from a GPU, but if too many tests try to do this at once, some of them will fail to allocate, resulting in a failed test, even though the test would have succeeded if it had the memory -it needed. By using the hardware allocation feature, each test can specify how +it needed. By using the resource allocation feature, each test can specify how much memory it requires from a GPU, allowing CTest to schedule tests in a way that running several of these tests at once does not exhaust the GPU's memory pool. @@ -1312,36 +1312,35 @@ When a test is executed, and slots from a resource are allocated to that test, tests may assume that they have exclusive use of those slots for the duration of the test's process. -The CTest hardware allocation feature consists of two inputs: +The CTest resource allocation feature consists of two inputs: -* The :ref:`hardware specification file <ctest-hardware-specification-file>`, - described below, which describes the hardware resources available on the - system, and -* The :prop_test:`PROCESSES` property of tests, which describes the resources - required by the test +* The :ref:`resource specification file <ctest-resource-specification-file>`, + described below, which describes the resources available on the system. +* The :prop_test:`RESOURCE_GROUPS` property of tests, which describes the + resources required by the test. -When CTest runs a test, the hardware allocated to that test is passed in the +When CTest runs a test, the resources allocated to that test are passed in the form of a set of -:ref:`environment variables <ctest-hardware-environment-variables>` as +:ref:`environment variables <ctest-resource-environment-variables>` as described below. Using this information to decide which resource to connect to is left to the test writer. -Please note that these processes are not spawned by CTest. The ``PROCESSES`` -property merely tells CTest what processes the test expects to launch. It is up -to the test itself to do this process spawning, and read the :ref:`environment -variables <ctest-hardware-environment-variables>` to determine which resources -each process has been allocated. +The ``RESOURCE_GROUPS`` property tells CTest what resources a test expects +to use grouped in a way meaningful to the test. The test itself must read +the :ref:`environment variables <ctest-resource-environment-variables>` to +determine which resources have been allocated to each group. For example, +each group may correspond to a process the test will spawn when executed. -.. _`ctest-hardware-specification-file`: +.. _`ctest-resource-specification-file`: -Hardware Specification File +Resource Specification File --------------------------- -The hardware specification file is a JSON file which is passed to CTest, either -on the :manual:`ctest(1)` command line as ``--hardware-spec-file``, or as the -``HARDWARE_SPEC_FILE`` argument of :command:`ctest_test`. The hardware +The resource specification file is a JSON file which is passed to CTest, either +on the :manual:`ctest(1)` command line as ``--resource-spec-file``, or as the +``RESOURCE_SPEC_FILE`` argument of :command:`ctest_test`. The resource specification file must be a JSON object. All examples in this document assume -the following hardware specification file: +the following resource specification file: .. code-block:: json @@ -1378,11 +1377,11 @@ the following hardware specification file: The members are: ``local`` - A JSON array consisting of CPU sockets present on the system. Currently, only - one socket is supported. + A JSON array of resource sets present on the system. Currently, this array + is restricted to being of size 1. - Each socket is a JSON object with members whose names are equal to the - desired resource types, such as ``gpu``. These names must start with a + Each array element is a JSON object with members whose names are equal to the + desired resource types, such as ``gpus``. These names must start with a lowercase letter or an underscore, and subsequent characters can be a lowercase letter, a digit, or an underscore. Uppercase letters are not allowed, because certain platforms have case-insensitive environment @@ -1423,12 +1422,12 @@ In the example file above, there are four GPUs with ID's 0 through 3. GPU 0 has 2 slots, GPU 1 has 4, GPU 2 has 2, and GPU 3 has a default of 1 slot. There is also one cryptography chip with 4 slots. -``PROCESSES`` Property ----------------------- +``RESOURCE_GROUPS`` Property +---------------------------- -See :prop_test:`PROCESSES` for a description of this property. +See :prop_test:`RESOURCE_GROUPS` for a description of this property. -.. _`ctest-hardware-environment-variables`: +.. _`ctest-resource-environment-variables`: Environment Variables --------------------- @@ -1436,65 +1435,67 @@ Environment Variables Once CTest has decided which resources to allocate to a test, it passes this information to the test executable as a series of environment variables. For each example below, we will assume that the test in question has a -:prop_test:`PROCESSES` property of ``2,gpus:2;gpus:4,gpus:1,crypto_chips:2``. +:prop_test:`RESOURCE_GROUPS` property of +``2,gpus:2;gpus:4,gpus:1,crypto_chips:2``. The following variables are passed to the test process: -.. envvar:: CTEST_PROCESS_COUNT +.. envvar:: CTEST_RESOURCE_GROUP_COUNT - The total number of processes specified by the :prop_test:`PROCESSES` + The total number of groups specified by the :prop_test:`RESOURCE_GROUPS` property. For example: - * ``CTEST_PROCESS_COUNT=3`` + * ``CTEST_RESOURCE_GROUP_COUNT=3`` This variable will only be defined if :manual:`ctest(1)` has been given a - ``--hardware-spec-file``, or if :command:`ctest_test` has been given a - ``HARDWARE_SPEC_FILE``. If no hardware specification file has been given, + ``--resource-spec-file``, or if :command:`ctest_test` has been given a + ``RESOURCE_SPEC_FILE``. If no resource specification file has been given, this variable will not be defined. -.. envvar:: CTEST_PROCESS_<num> +.. envvar:: CTEST_RESOURCE_GROUP_<num> - The list of resource types allocated to each process, with each item + The list of resource types allocated to each group, with each item separated by a comma. ``<num>`` is a number from zero to - ``CTEST_PROCESS_COUNT`` minus one. ``CTEST_PROCESS_<num>`` is defined for - each ``<num>`` in this range. For example: + ``CTEST_RESOURCE_GROUP_COUNT`` minus one. ``CTEST_RESOURCE_GROUP_<num>`` + is defined for each ``<num>`` in this range. For example: - * ``CTEST_PROCESS_0=gpus`` - * ``CTEST_PROCESS_1=gpus`` - * ``CTEST_PROCESS_2=crypto_chips,gpus`` + * ``CTEST_RESOURCE_GROUP_0=gpus`` + * ``CTEST_RESOURCE_GROUP_1=gpus`` + * ``CTEST_RESOURCE_GROUP_2=crypto_chips,gpus`` -.. envvar:: CTEST_PROCESS_<num>_<resource-type> +.. envvar:: CTEST_RESOURCE_GROUP_<num>_<resource-type> The list of resource IDs and number of slots from each ID allocated to each - process for a given resource type. This variable consists of a series of + group for a given resource type. This variable consists of a series of pairs, each pair separated by a semicolon, and with the two items in the pair separated by a comma. The first item in each pair is ``id:`` followed by the ID of a resource of type ``<resource-type>``, and the second item is ``slots:`` followed by the number of slots from that resource allocated to - the given process. For example: + the given group. For example: - * ``CTEST_PROCESS_0_GPUS=id:0,slots:2`` - * ``CTEST_PROCESS_1_GPUS=id:2,slots:2`` - * ``CTEST_PROCESS_2_GPUS=id:1,slots:4;id:3,slots:1`` - * ``CTEST_PROCESS_2_CRYPTO_CHIPS=id:card0,slots:2`` + * ``CTEST_RESOURCE_GROUP_0_GPUS=id:0,slots:2`` + * ``CTEST_RESOURCE_GROUP_1_GPUS=id:2,slots:2`` + * ``CTEST_RESOURCE_GROUP_2_GPUS=id:1,slots:4;id:3,slots:1`` + * ``CTEST_RESOURCE_GROUP_2_CRYPTO_CHIPS=id:card0,slots:2`` - In this example, process 0 gets 2 slots from GPU ``0``, process 1 gets 2 slots - from GPU ``2``, and process 2 gets 4 slots from GPU ``1`` and 2 slots from - cryptography chip ``card0``. + In this example, group 0 gets 2 slots from GPU ``0``, group 1 gets 2 slots + from GPU ``2``, and group 2 gets 4 slots from GPU ``1``, 1 slot from GPU + ``3``, and 2 slots from cryptography chip ``card0``. - ``<num>`` is a number from zero to ``CTEST_PROCESS_COUNT`` minus one. + ``<num>`` is a number from zero to ``CTEST_RESOURCE_GROUP_COUNT`` minus one. ``<resource-type>`` is the name of a resource type, converted to uppercase. - ``CTEST_PROCESS_<num>_<resource-type>`` is defined for the product of each - ``<num>`` in the range listed above and each resource type listed in - ``CTEST_PROCESS_<num>``. + ``CTEST_RESOURCE_GROUP_<num>_<resource-type>`` is defined for the product + of each ``<num>`` in the range listed above and each resource type listed in + ``CTEST_RESOURCE_GROUP_<num>``. Because some platforms have case-insensitive names for environment variables, the names of resource types may not clash in a case-insensitive environment. Because of this, for the sake of simplicity, all resource types must be listed in all lowercase in the - :ref:`hardware specification file <ctest-hardware-specification-file>` and in - the :prop_test:`PROCESSES` property, and they are converted to all uppercase - in the ``CTEST_PROCESS_<num>_<resource-type>`` environment variable. + :ref:`resource specification file <ctest-resource-specification-file>` and + in the :prop_test:`RESOURCE_GROUPS` property, and they are converted to all + uppercase in the ``CTEST_RESOURCE_GROUP_<num>_<resource-type>`` environment + variable. See Also ======== diff --git a/Help/prop_gbl/CMAKE_CXX_KNOWN_FEATURES.rst b/Help/prop_gbl/CMAKE_CXX_KNOWN_FEATURES.rst index 262a67c..b921c6b 100644 --- a/Help/prop_gbl/CMAKE_CXX_KNOWN_FEATURES.rst +++ b/Help/prop_gbl/CMAKE_CXX_KNOWN_FEATURES.rst @@ -15,19 +15,19 @@ compile features and a list of supported compilers. The features known to this version of CMake are: ``cxx_std_98`` - Compiler mode is aware of C++ 98. + Compiler mode is at least C++ 98. ``cxx_std_11`` - Compiler mode is aware of C++ 11. + Compiler mode is at least C++ 11. ``cxx_std_14`` - Compiler mode is aware of C++ 14. + Compiler mode is at least C++ 14. ``cxx_std_17`` - Compiler mode is aware of C++ 17. + Compiler mode is at least C++ 17. ``cxx_std_20`` - Compiler mode is aware of C++ 20. + Compiler mode is at least C++ 20. ``cxx_aggregate_default_initializers`` Aggregate default initializers, as defined in N3605_. diff --git a/Help/prop_gbl/CMAKE_C_KNOWN_FEATURES.rst b/Help/prop_gbl/CMAKE_C_KNOWN_FEATURES.rst index 3707fef..e5f896e 100644 --- a/Help/prop_gbl/CMAKE_C_KNOWN_FEATURES.rst +++ b/Help/prop_gbl/CMAKE_C_KNOWN_FEATURES.rst @@ -14,13 +14,13 @@ compile features and a list of supported compilers. The features known to this version of CMake are: ``c_std_90`` - Compiler mode is aware of C 90. + Compiler mode is at least C 90. ``c_std_99`` - Compiler mode is aware of C 99. + Compiler mode is at least C 99. ``c_std_11`` - Compiler mode is aware of C 11. + Compiler mode is at least C 11. ``c_function_prototypes`` Function prototypes, as defined in ``ISO/IEC 9899:1990``. diff --git a/Help/prop_sf/SKIP_UNITY_BUILD_INCLUSION.rst b/Help/prop_sf/SKIP_UNITY_BUILD_INCLUSION.rst index 53f3970..6d1e60d 100644 --- a/Help/prop_sf/SKIP_UNITY_BUILD_INCLUSION.rst +++ b/Help/prop_sf/SKIP_UNITY_BUILD_INCLUSION.rst @@ -1,7 +1,11 @@ SKIP_UNITY_BUILD_INCLUSION -------------------------- -Is this source file skipped by :prop_tgt:`UNITY_BUILD` feature. +Setting this property to true ensures the source file will be skipped by +unity builds when its associated target has its :prop_tgt:`UNITY_BUILD` +property set to true. The source file will instead be compiled on its own +in the same way as it would with unity builds disabled. -This property helps with "ODR (One definition rule)" problems -that one would run into when using an :prop_tgt:`UNITY_BUILD`. +This property helps with "ODR (One definition rule)" problems where combining +a particular source file with others might lead to build errors or other +unintended side effects. diff --git a/Help/prop_test/PROCESSES.rst b/Help/prop_test/PROCESSES.rst deleted file mode 100644 index d09c6d1..0000000 --- a/Help/prop_test/PROCESSES.rst +++ /dev/null @@ -1,54 +0,0 @@ -PROCESSES ----------- - -Set to specify the number of processes spawned by a test, and the resources -that they require. See :ref:`hardware allocation <ctest-hardware-allocation>` -for more information on how this property integrates into the CTest hardware -allocation feature. - -The ``PROCESSES`` property is a :ref:`semicolon-separated list <CMake Language -Lists>` of process descriptions. Each process description consists of an -optional number of processes for the description followed by a series of -resource requirements for those processes. These requirements (and the number -of processes) are separated by commas. The resource requirements consist of the -name of a resource type, followed by a colon, followed by an unsigned integer -specifying the number of slots required on one resource of the given type. - -Please note that these processes are not spawned by CTest. The ``PROCESSES`` -property merely tells CTest what processes the test expects to launch. It is up -to the test itself to do this process spawning, and read the :ref:`environment -variables <ctest-hardware-environment-variables>` to determine which resources -each process has been allocated. - -Consider the following example: - -.. code-block:: cmake - - add_test(NAME MyTest COMMAND MyExe) - set_property(TEST MyTest PROPERTY PROCESSES - "2,gpus:2" - "gpus:4,crypto_chips:2") - -In this example, there are two process descriptions (implicitly separated by a -semicolon.) The content of the first description is ``2,gpus:2``. This -description spawns 2 processes, each of which requires 2 slots from a single -GPU. The content of the second description is ``gpus:4,crypto_chips:2``. This -description does not specify a process count, so a default of 1 is assumed. -This single process requires 4 slots from a single GPU and 2 slots from a -single cryptography chip. In total, 3 processes are spawned from this test, -each with their own unique requirements. - -When CTest sets the :ref:`environment variables -<ctest-hardware-environment-variables>` for a test, it assigns a process number -based on the process description, starting at 0 on the left and the number of -processes minus 1 on the right. For example, in the example above, the two -processes in the first description would have IDs of 0 and 1, and the single -process in the second description would have an ID of 2. - -Both the ``PROCESSES`` and :prop_test:`RESOURCE_LOCK` properties serve similar -purposes, but they are distinct and orthogonal. Resources specified by -``PROCESSES`` do not affect :prop_test:`RESOURCE_LOCK`, and vice versa. Whereas -:prop_test:`RESOURCE_LOCK` is a simpler property that is used for locking one -global resource, ``PROCESSES`` is a more advanced property that allows multiple -tests to simultaneously use multiple resources of the same type, specifying -their requirements in a fine-grained manner. diff --git a/Help/prop_test/RESOURCE_GROUPS.rst b/Help/prop_test/RESOURCE_GROUPS.rst new file mode 100644 index 0000000..436451c --- /dev/null +++ b/Help/prop_test/RESOURCE_GROUPS.rst @@ -0,0 +1,54 @@ +RESOURCE_GROUPS +--------------- + +Specify resources required by a test, grouped in a way that is meaningful to +the test. See :ref:`resource allocation <ctest-resource-allocation>` +for more information on how this property integrates into the CTest resource +allocation feature. + +The ``RESOURCE_GROUPS`` property is a :ref:`semicolon-separated list <CMake +Language Lists>` of group descriptions. Each entry consists of an optional +number of groups using the description followed by a series of resource +requirements for those groups. These requirements (and the number of groups) +are separated by commas. The resource requirements consist of the name of a +resource type, followed by a colon, followed by an unsigned integer +specifying the number of slots required on one resource of the given type. + +The ``RESOURCE_GROUPS`` property tells CTest what resources a test expects +to use grouped in a way meaningful to the test. The test itself must read +the :ref:`environment variables <ctest-resource-environment-variables>` to +determine which resources have been allocated to each group. For example, +each group may correspond to a process the test will spawn when executed. + +Consider the following example: + +.. code-block:: cmake + + add_test(NAME MyTest COMMAND MyExe) + set_property(TEST MyTest PROPERTY RESOURCE_GROUPS + "2,gpus:2" + "gpus:4,crypto_chips:2") + +In this example, there are two group descriptions (implicitly separated by a +semicolon.) The content of the first description is ``2,gpus:2``. This +description specifies 2 groups, each of which requires 2 slots from a single +GPU. The content of the second description is ``gpus:4,crypto_chips:2``. This +description does not specify a group count, so a default of 1 is assumed. +This single group requires 4 slots from a single GPU and 2 slots from a +single cryptography chip. In total, 3 resource groups are specified for this +test, each with its own unique requirements. + +When CTest sets the :ref:`environment variables +<ctest-resource-environment-variables>` for a test, it assigns a group number +based on the group description, starting at 0 on the left and the number of +groups minus 1 on the right. For example, in the example above, the two +groups in the first description would have IDs of 0 and 1, and the single +group in the second description would have an ID of 2. + +Both the ``RESOURCE_GROUPS`` and :prop_test:`RESOURCE_LOCK` properties serve +similar purposes, but they are distinct and orthogonal. Resources specified by +``RESOURCE_GROUPS`` do not affect :prop_test:`RESOURCE_LOCK`, and vice versa. +Whereas :prop_test:`RESOURCE_LOCK` is a simpler property that is used for +locking one global resource, ``RESOURCE_GROUPS`` is a more advanced property +that allows multiple tests to simultaneously use multiple resources of the +same type, specifying their requirements in a fine-grained manner. diff --git a/Help/prop_test/RESOURCE_LOCK.rst b/Help/prop_test/RESOURCE_LOCK.rst index 7d61f77..8b13a01 100644 --- a/Help/prop_test/RESOURCE_LOCK.rst +++ b/Help/prop_test/RESOURCE_LOCK.rst @@ -9,10 +9,10 @@ not to run concurrently. See also :prop_test:`FIXTURES_REQUIRED` if the resource requires any setup or cleanup steps. -Both the :prop_test:`PROCESSES` and ``RESOURCE_LOCK`` properties serve similar -purposes, but they are distinct and orthogonal. Resources specified by -:prop_test:`PROCESSES` do not affect ``RESOURCE_LOCK``, and vice versa. Whereas -``RESOURCE_LOCK`` is a simpler property that is used for locking one global -resource, :prop_test:`PROCESSES` is a more advanced property that allows -multiple tests to simultaneously use multiple resources of the same type, -specifying their requirements in a fine-grained manner. +Both the :prop_test:`RESOURCE_GROUPS` and ``RESOURCE_LOCK`` properties serve +similar purposes, but they are distinct and orthogonal. Resources specified by +:prop_test:`RESOURCE_GROUPS` do not affect ``RESOURCE_LOCK``, and vice versa. +Whereas ``RESOURCE_LOCK`` is a simpler property that is used for locking one +global resource, :prop_test:`RESOURCE_GROUPS` is a more advanced property +that allows multiple tests to simultaneously use multiple resources of the +same type, specifying their requirements in a fine-grained manner. diff --git a/Help/prop_tgt/INSTALL_REMOVE_ENVIRONMENT_RPATH.rst b/Help/prop_tgt/INSTALL_REMOVE_ENVIRONMENT_RPATH.rst index a474fc6..72dcaa0 100644 --- a/Help/prop_tgt/INSTALL_REMOVE_ENVIRONMENT_RPATH.rst +++ b/Help/prop_tgt/INSTALL_REMOVE_ENVIRONMENT_RPATH.rst @@ -1,10 +1,16 @@ INSTALL_REMOVE_ENVIRONMENT_RPATH -------------------------------- -Removes compiler defined rpaths durimg installation. +Controls whether toolchain-defined rpaths should be removed during installation. -``INSTALL_REMOVE_ENVIRONMENT_RPATH`` is a boolean that if set to ``True`` will -remove compiler defined rpaths from the project if the user also defines rpath -with :prop_tgt:`INSTALL_RPATH`. This property is initialized by whether the -value of :variable:`CMAKE_INSTALL_REMOVE_ENVIRONMENT_RPATH` is set when a -target is created. +When a target is being installed, CMake may need to rewrite its rpath +information. This occurs when the install rpath (as specified by the +:prop_tgt:`INSTALL_RPATH` target property) has different contents to the rpath +that the target was built with. Some toolchains insert their own rpath +contents into the binary as part of the build. By default, CMake will +preserve those extra inserted contents in the install rpath. For those +scenarios where such toolchain-inserted entries need to be discarded during +install, set the ``INSTALL_REMOVE_ENVIRONMENT_RPATH`` target property to true. + +This property is initialized by the value of +:variable:`CMAKE_INSTALL_REMOVE_ENVIRONMENT_RPATH` when the target is created. diff --git a/Help/prop_tgt/UNITY_BUILD.rst b/Help/prop_tgt/UNITY_BUILD.rst index 2faad92..479802e 100644 --- a/Help/prop_tgt/UNITY_BUILD.rst +++ b/Help/prop_tgt/UNITY_BUILD.rst @@ -1,61 +1,60 @@ UNITY_BUILD ----------- -Should the target source files be processed into batches for -faster compilation. This feature is known as "Unity build", -or "Jumbo build". - -The ``C`` and ``CXX`` source files are grouped separately. - -This property is initialized by the value of the -:variable:`CMAKE_UNITY_BUILD` variable if it is set when -a target is created. - -.. note:: - - It's not recommended to directly set :prop_tgt:`UNITY_BUILD` - to ``ON``, but to instead set :variable:`CMAKE_UNITY_BUILD` from - the command line. However, it IS recommended to set - :prop_tgt:`UNITY_BUILD` to ``OFF`` if you need to ensure that a - target doesn't get a unity build. - -The batch size can be specified by setting -:prop_tgt:`UNITY_BUILD_BATCH_SIZE`. - -The batching of source files is done by adding new sources files -which will ``#include`` the source files, and exclude them from -building by setting :prop_sf:`HEADER_FILE_ONLY` to ``ON``. +When this property is set to true, the target source files will be combined +into batches for faster compilation. This is done by creating a (set of) +unity sources which ``#include`` the original sources, then compiling these +unity sources instead of the originals. This is known as a *Unity* or *Jumbo* +build. The :prop_tgt:`UNITY_BUILD_BATCH_SIZE` property controls the upper +limit on how many sources can be combined per unity source file. + +Unity builds are not currently supported for all languages. CMake version +|release| supports combining ``C`` and ``CXX`` source files. For targets that +mix source files from more than one language, CMake will separate the languages +such that each generated unity source file only contains sources for a single +language. + +This property is initialized by the value of the :variable:`CMAKE_UNITY_BUILD` +variable when a target is created. .. note:: - Marking the original sources with :prop_sf:`HEADER_FILE_ONLY` - is considered an implementation detail that may change in the - future because it does not work well in combination with - the :variable:`CMAKE_EXPORT_COMPILE_COMMANDS` variable. + Projects should not directly set the ``UNITY_BUILD`` property or its + associated :variable:`CMAKE_UNITY_BUILD` variable to true. Depending + on the capabilities of the build machine and compiler used, it might or + might not be appropriate to enable unity builds. Therefore, this feature + should be under developer control, which would normally be through the + developer choosing whether or not to set the :variable:`CMAKE_UNITY_BUILD` + variable on the :manual:`cmake(1)` command line or some other equivalent + method. However, it IS recommended to set the ``UNITY_BUILD`` target + property to false if it is known that enabling unity builds for the + target can lead to problems. ODR (One definition rule) errors ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Since multiple source files are included into one source file, -it can lead to ODR errors. This section contains properties -which help fixing these errors. - -The source files marked by :prop_sf:`GENERATED` will be skipped -from unity build. This applies also for the source files marked -with :prop_sf:`SKIP_UNITY_BUILD_INCLUSION`. - -The source files that have :prop_sf:`COMPILE_OPTIONS`, -:prop_sf:`COMPILE_DEFINITIONS`, :prop_sf:`COMPILE_FLAGS`, or -:prop_sf:`INCLUDE_DIRECTORIES` will also be skipped. - -With the :prop_tgt:`UNITY_BUILD_CODE_BEFORE_INCLUDE` and -:prop_tgt:`UNITY_BUILD_CODE_AFTER_INCLUDE` one can specify code -to be injected in the unity source file before and after every -``#include`` statement. - -.. note:: - - The order of source files defined in the ``CMakeLists.txt`` will - be preserved into the generated unity source files. This can - be used to manually enforce a specific grouping based on the - :prop_tgt:`UNITY_BUILD_BATCH_SIZE` target property. +When multiple source files are included into one source file, as is done +for unity builds, it can potentially lead to ODR errors. CMake provides +a number of measures to help address such problems: + +* Any source file that has a non-empty :prop_sf:`COMPILE_OPTIONS`, + :prop_sf:`COMPILE_DEFINITIONS`, :prop_sf:`COMPILE_FLAGS`, or + :prop_sf:`INCLUDE_DIRECTORIES` source property will not be combined + into a unity source. + +* Projects can prevent an individual source file from being combined into + a unity source by setting its :prop_sf:`SKIP_UNITY_BUILD_INCLUSION` + source property to true. This can be a more effective way to prevent + problems with specific files than disabling unity builds for an entire + target. + +* The :prop_tgt:`UNITY_BUILD_CODE_BEFORE_INCLUDE` and + :prop_tgt:`UNITY_BUILD_CODE_AFTER_INCLUDE` target properties can be used + to inject code into the unity source files before and after every + ``#include`` statement. + +* The order of source files added to the target via commands like + :command:`add_library`, :command:`add_executable` or + :command:`target_sources` will be preserved in the generated unity source + files. This can be used to manually enforce a specific grouping based on + the :prop_tgt:`UNITY_BUILD_BATCH_SIZE` target property. diff --git a/Help/prop_tgt/UNITY_BUILD_BATCH_SIZE.rst b/Help/prop_tgt/UNITY_BUILD_BATCH_SIZE.rst index 84047f2..44ffe27 100644 --- a/Help/prop_tgt/UNITY_BUILD_BATCH_SIZE.rst +++ b/Help/prop_tgt/UNITY_BUILD_BATCH_SIZE.rst @@ -1,13 +1,23 @@ UNITY_BUILD_BATCH_SIZE ---------------------- -Specifies how many source code files will be included into a -:prop_tgt:`UNITY_BUILD` source file. +Specifies the maximum number of source files that can be combined into any one +unity source file when unity builds are enabled by the :prop_tgt:`UNITY_BUILD` +target property. The original source files will be distributed across as many +unity source files as necessary to honor this limit. -If the property is not set, CMake will use the value provided -by :variable:`CMAKE_UNITY_BUILD_BATCH_SIZE`. +The initial value for this property is taken from the +:variable:`CMAKE_UNITY_BUILD_BATCH_SIZE` variable when the target is created. +If that variable has not been set, the initial value will be 8. -By setting it to value `0` the generated unity source file will -contain all the source files that would otherwise be split -into multiple batches. It is not recommended to do so, since it -would affect performance. +The batch size needs to be selected carefully. If set too high, the size of +the combined source files could result in the compiler using excessive memory +or hitting other similar limits. In extreme cases, this can even result in +build failure. On the other hand, if the batch size is too low, there will be +little gain in build performance. + +Although strongly discouraged, the batch size may be set to a value of 0 to +combine all the sources for the target into a single unity file, regardless of +how many sources are involved. This runs the risk of creating an excessively +large unity source file and negatively impacting the build performance, so +a value of 0 is not generally recommended. diff --git a/Help/prop_tgt/UNITY_BUILD_CODE_AFTER_INCLUDE.rst b/Help/prop_tgt/UNITY_BUILD_CODE_AFTER_INCLUDE.rst index 7795289..7231b61 100644 --- a/Help/prop_tgt/UNITY_BUILD_CODE_AFTER_INCLUDE.rst +++ b/Help/prop_tgt/UNITY_BUILD_CODE_AFTER_INCLUDE.rst @@ -2,7 +2,18 @@ UNITY_BUILD_CODE_AFTER_INCLUDE ------------------------------ Code snippet which is included verbatim by the :prop_tgt:`UNITY_BUILD` -feature just after the `#include` statement of the targeted source -files. +feature just after every ``#include`` statement in the generated unity +source files. For example: -This could be something like `#undef NOMINMAX`. +.. code-block:: cmake + + set(after [[ + #if defined(NOMINMAX) + #undef NOMINMAX + #endif + ]]) + set_target_properties(myTarget PROPERTIES + UNITY_BUILD_CODE_AFTER_INCLUDE "${after}" + ) + +See also :prop_tgt:`UNITY_BUILD_CODE_BEFORE_INCLUDE`. diff --git a/Help/prop_tgt/UNITY_BUILD_CODE_BEFORE_INCLUDE.rst b/Help/prop_tgt/UNITY_BUILD_CODE_BEFORE_INCLUDE.rst index f335463..7ed6fa1 100644 --- a/Help/prop_tgt/UNITY_BUILD_CODE_BEFORE_INCLUDE.rst +++ b/Help/prop_tgt/UNITY_BUILD_CODE_BEFORE_INCLUDE.rst @@ -2,7 +2,18 @@ UNITY_BUILD_CODE_BEFORE_INCLUDE ------------------------------- Code snippet which is included verbatim by the :prop_tgt:`UNITY_BUILD` -feature just before the `#include` statement of the targeted source -files. +feature just before every ``#include`` statement in the generated unity +source files. For example: -This could be something like `#define NOMINMAX`. +.. code-block:: cmake + + set(before [[ + #if !defined(NOMINMAX) + #define NOMINMAX + #endif + ]]) + set_target_properties(myTarget PROPERTIES + UNITY_BUILD_CODE_BEFORE_INCLUDE "${before}" + ) + +See also :prop_tgt:`UNITY_BUILD_CODE_AFTER_INCLUDE`. diff --git a/Help/release/3.16.rst b/Help/release/3.16.rst index 570f536..0d1cc1e 100644 --- a/Help/release/3.16.rst +++ b/Help/release/3.16.rst @@ -95,7 +95,9 @@ Commands * The :command:`find_package` command has learned to check the :variable:`CMAKE_FIND_USE_PACKAGE_REGISTRY` variable to control the default - behavior of searching the CMake user package registry. + behavior of searching the CMake user package registry and to check the + :variable:`CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY` variable to control + the default behavior of searching the CMake system package registry. * The :command:`message` command learned indentation control with the new :variable:`CMAKE_MESSAGE_INDENT` variable. @@ -190,8 +192,8 @@ Autogen CTest ----- -* :manual:`ctest(1)` now has the ability to serialize tests based on hardware - requirements for each test. See :ref:`ctest-hardware-allocation` for +* :manual:`ctest(1)` now has the ability to schedule tests based on resource + requirements for each test. See :ref:`ctest-resource-allocation` for details. * A new test property, :prop_test:`SKIP_REGULAR_EXPRESSION`, has been added. @@ -205,9 +207,8 @@ CTest CPack ----- -* CPack variable :variable:`CPACK_INSTALL_CMAKE_CONFIGURATIONS` was added to - control what configurations are to be packaged for multi-configuration - CMake generators. +* :manual:`cpack(1)` learned support for multiple configurations for ``-C`` + option. * The :cpack_gen:`CPack DEB Generator` is now able to format generic text (usually used as the description for multiple CPack generators) according diff --git a/Help/variable/CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY.rst b/Help/variable/CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY.rst index 44588b1..107c183 100644 --- a/Help/variable/CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY.rst +++ b/Help/variable/CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY.rst @@ -1,12 +1,23 @@ CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY --------------------------------------------- -Skip :ref:`System Package Registry` in :command:`find_package` calls. +.. deprecated:: 3.16 + + Use the :variable:`CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY` variable instead. + +By default this variable is not set. If neither +:variable:`CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY` nor +``CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY`` is set, then +:command:`find_package()` will use the :ref:`System Package Registry` +unless the ``NO_CMAKE_SYSTEM_PACKAGE_REGISTRY`` option is provided. + +``CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY`` is ignored if +:variable:`CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY` is set. In some cases, it is not desirable to use the :ref:`System Package Registry` when searching for packages. If the :variable:`CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY` variable is -enabled, all the :command:`find_package` commands will skip +``TRUE``, all the :command:`find_package` commands will skip the :ref:`System Package Registry` as if they were called with the ``NO_CMAKE_SYSTEM_PACKAGE_REGISTRY`` argument. diff --git a/Help/variable/CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH.rst b/Help/variable/CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH.rst index 9ebf672..957e956 100644 --- a/Help/variable/CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH.rst +++ b/Help/variable/CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH.rst @@ -19,5 +19,6 @@ take precedence over this variable. See also the :variable:`CMAKE_FIND_USE_CMAKE_PATH`, :variable:`CMAKE_FIND_USE_CMAKE_SYSTEM_PATH`, :variable:`CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH`, +:variable:`CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY`, :variable:`CMAKE_FIND_USE_PACKAGE_REGISTRY`, and :variable:`CMAKE_FIND_USE_PACKAGE_ROOT_PATH` variables. diff --git a/Help/variable/CMAKE_FIND_USE_CMAKE_PATH.rst b/Help/variable/CMAKE_FIND_USE_CMAKE_PATH.rst index 62ae3cb..d2bdb09 100644 --- a/Help/variable/CMAKE_FIND_USE_CMAKE_PATH.rst +++ b/Help/variable/CMAKE_FIND_USE_CMAKE_PATH.rst @@ -19,5 +19,6 @@ take precedence over this variable. See also the :variable:`CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH`, :variable:`CMAKE_FIND_USE_CMAKE_SYSTEM_PATH`, :variable:`CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH`, +:variable:`CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY`, :variable:`CMAKE_FIND_USE_PACKAGE_REGISTRY`, and :variable:`CMAKE_FIND_USE_PACKAGE_ROOT_PATH` variables. diff --git a/Help/variable/CMAKE_FIND_USE_CMAKE_SYSTEM_PATH.rst b/Help/variable/CMAKE_FIND_USE_CMAKE_SYSTEM_PATH.rst index b484a6a..b99081d 100644 --- a/Help/variable/CMAKE_FIND_USE_CMAKE_SYSTEM_PATH.rst +++ b/Help/variable/CMAKE_FIND_USE_CMAKE_SYSTEM_PATH.rst @@ -19,5 +19,6 @@ take precedence over this variable. See also the :variable:`CMAKE_FIND_USE_CMAKE_PATH`, :variable:`CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH`, :variable:`CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH`, +:variable:`CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY`, :variable:`CMAKE_FIND_USE_PACKAGE_REGISTRY`, and :variable:`CMAKE_FIND_USE_PACKAGE_ROOT_PATH` variables. diff --git a/Help/variable/CMAKE_FIND_USE_PACKAGE_REGISTRY.rst b/Help/variable/CMAKE_FIND_USE_PACKAGE_REGISTRY.rst index a9c8469..7c7ca36 100644 --- a/Help/variable/CMAKE_FIND_USE_PACKAGE_REGISTRY.rst +++ b/Help/variable/CMAKE_FIND_USE_PACKAGE_REGISTRY.rst @@ -26,4 +26,5 @@ See also :ref:`Disabling the Package Registry` and the :variable:`CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH`, :variable:`CMAKE_FIND_USE_CMAKE_SYSTEM_PATH`, :variable:`CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH`, +:variable:`CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY`, and :variable:`CMAKE_FIND_USE_PACKAGE_ROOT_PATH` variables. diff --git a/Help/variable/CMAKE_FIND_USE_PACKAGE_ROOT_PATH.rst b/Help/variable/CMAKE_FIND_USE_PACKAGE_ROOT_PATH.rst index 25a25f3..e7f5b0f 100644 --- a/Help/variable/CMAKE_FIND_USE_PACKAGE_ROOT_PATH.rst +++ b/Help/variable/CMAKE_FIND_USE_PACKAGE_ROOT_PATH.rst @@ -18,4 +18,5 @@ See also the :variable:`CMAKE_FIND_USE_CMAKE_PATH`, :variable:`CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH`, :variable:`CMAKE_FIND_USE_CMAKE_SYSTEM_PATH`, :variable:`CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH`, +:variable:`CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY`, and :variable:`CMAKE_FIND_USE_PACKAGE_REGISTRY` variables. diff --git a/Help/variable/CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH.rst b/Help/variable/CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH.rst index 0713709..fbaba5a 100644 --- a/Help/variable/CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH.rst +++ b/Help/variable/CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH.rst @@ -20,4 +20,5 @@ See also the :variable:`CMAKE_FIND_USE_CMAKE_PATH`, :variable:`CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH`, :variable:`CMAKE_FIND_USE_CMAKE_SYSTEM_PATH`, :variable:`CMAKE_FIND_USE_PACKAGE_REGISTRY`, -and :variable:`CMAKE_FIND_USE_PACKAGE_ROOT_PATH` variables. +:variable:`CMAKE_FIND_USE_PACKAGE_ROOT_PATH`, +and :variable:`CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY` variables. diff --git a/Help/variable/CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY.rst b/Help/variable/CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY.rst new file mode 100644 index 0000000..cb4eec5 --- /dev/null +++ b/Help/variable/CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY.rst @@ -0,0 +1,31 @@ +CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY +-------------------------------------- + +Controls searching the :ref:`System Package Registry` by the +:command:`find_package` command. + +By default this variable is not set and the behavior will fall back +to that determined by the deprecated +:variable:`CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY` variable. +If that is also not set, then :command:`find_package()` will use the +:ref:`System Package Registry` unless the ``NO_CMAKE_SYSTEM_PACKAGE_REGISTRY`` +option is provided. + +This variable takes precedence over +:variable:`CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY` when both are set. + +In some cases, for example to locate only user specific installations, it +is not desirable to use the :ref:`System Package Registry` when searching +for packages. If the ``CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY`` +variable is ``FALSE``, all the :command:`find_package` commands will skip +the :ref:`System Package Registry` as if they were called with the +``NO_CMAKE_SYSTEM_PACKAGE_REGISTRY`` argument. + +See also :ref:`Disabling the Package Registry`. + +See also the :variable:`CMAKE_FIND_USE_CMAKE_PATH`, +:variable:`CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH`, +:variable:`CMAKE_FIND_USE_CMAKE_SYSTEM_PATH`, +:variable:`CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH`, +:variable:`CMAKE_FIND_USE_PACKAGE_REGISTRY`, +and :variable:`CMAKE_FIND_USE_PACKAGE_ROOT_PATH` variables. diff --git a/Help/variable/CMAKE_INSTALL_REMOVE_ENVIRONMENT_RPATH.rst b/Help/variable/CMAKE_INSTALL_REMOVE_ENVIRONMENT_RPATH.rst index 19ae5f3..76ca3da 100644 --- a/Help/variable/CMAKE_INSTALL_REMOVE_ENVIRONMENT_RPATH.rst +++ b/Help/variable/CMAKE_INSTALL_REMOVE_ENVIRONMENT_RPATH.rst @@ -1,9 +1,9 @@ CMAKE_INSTALL_REMOVE_ENVIRONMENT_RPATH -------------------------------------- -Removes compiler defined rpaths durimg installation. +Sets the default for whether toolchain-defined rpaths should be removed during +installation. -``CMAKE_INSTALL_REMOVE_ENVIRONMENT_RPATH`` is a boolean that if set to ``true`` -removes compiler defined rpaths from the project if the user also defines rpath -with :prop_tgt:`INSTALL_RPATH`. This is used to initialize the target property -:prop_tgt:`INSTALL_REMOVE_ENVIRONMENT_RPATH` for all targets. +``CMAKE_INSTALL_REMOVE_ENVIRONMENT_RPATH`` is a boolean that provides the +default value for the :prop_tgt:`INSTALL_REMOVE_ENVIRONMENT_RPATH` property +of all subsequently created targets. diff --git a/Help/variable/CMAKE_UNITY_BUILD.rst b/Help/variable/CMAKE_UNITY_BUILD.rst index bbcfd68..a86cd67 100644 --- a/Help/variable/CMAKE_UNITY_BUILD.rst +++ b/Help/variable/CMAKE_UNITY_BUILD.rst @@ -1,11 +1,19 @@ CMAKE_UNITY_BUILD ----------------- -Initializes the :prop_tgt:`UNITY_BUILD` target property on targets -as they are created. Set to ``ON`` to batch compilation of multiple -sources within each target. This feature is known as "Unity build", -or "Jumbo build". By default this variable is not set and so does -not enable unity builds on targets. +This variable is used to initialize the :prop_tgt:`UNITY_BUILD` +property of targets when they are created. Setting it to true +enables batch compilation of multiple sources within each target. +This feature is known as a *Unity* or *Jumbo* build. + +Projects should not set this variable, it is intended as a developer +control to be set on the :manual:`cmake(1)` command line or other +equivalent methods. The developer must have the ability to enable or +disable unity builds according to the capabilities of their own machine +and compiler. + +By default, this variable is not set, which will result in unity builds +being disabled. .. note:: This option currently does not work well in combination with diff --git a/Help/variable/CMAKE_UNITY_BUILD_BATCH_SIZE.rst b/Help/variable/CMAKE_UNITY_BUILD_BATCH_SIZE.rst index 3ab2344..7988d4b 100644 --- a/Help/variable/CMAKE_UNITY_BUILD_BATCH_SIZE.rst +++ b/Help/variable/CMAKE_UNITY_BUILD_BATCH_SIZE.rst @@ -1,6 +1,7 @@ CMAKE_UNITY_BUILD_BATCH_SIZE ---------------------------- -Default value for :prop_tgt:`UNITY_BUILD_BATCH_SIZE` of targets. - -By default ``CMAKE_UNITY_BUILD_BATCH_SIZE`` is set to ``8``. +This variable is used to initialize the :prop_tgt:`UNITY_BUILD_BATCH_SIZE` +property of targets when they are created. It specifies the default upper +limit on the number of source files that may be combined in any one unity +source file when unity builds are enabled for a target. diff --git a/Modules/CMakeFindBinUtils.cmake b/Modules/CMakeFindBinUtils.cmake index 69ace5a..c23e447 100644 --- a/Modules/CMakeFindBinUtils.cmake +++ b/Modules/CMakeFindBinUtils.cmake @@ -57,44 +57,6 @@ endfunction() __resolve_tool_path(CMAKE_LINKER "${_CMAKE_TOOLCHAIN_LOCATION}" "Default Linker") __resolve_tool_path(CMAKE_MT "${_CMAKE_TOOLCHAIN_LOCATION}" "Default Manifest Tool") -function(__get_compiler_component CMAKE_TOOL NAME) - get_property(_CMAKE_TOOL_CACHED CACHE ${CMAKE_TOOL} PROPERTY TYPE) - # If CMAKE_TOOL is present in the CMake Cache, return - if(_CMAKE_TOOL_CACHED) - return() - endif() - - cmake_parse_arguments(_COMPILER_COMP_ARGS "" "DOC" "HINTS;NAMES" ${ARGN}) - - set(_LOCATION_FROM_COMPILER ) - set(_NAME_FROM_COMPILER ) - - if (NOT DEFINED ${CMAKE_TOOL}) - if("x${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_ID}" STREQUAL "xGNU" OR - "x${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_ID}" STREQUAL "xClang") - execute_process( - COMMAND ${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER} -print-prog-name=${NAME} - RESULT_VARIABLE _CMAKE_TOOL_PROG_NAME_RESULT - OUTPUT_VARIABLE _CMAKE_TOOL_PROG_NAME_OUTPUT - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - if (_CMAKE_TOOL_PROG_NAME_RESULT STREQUAL "0" AND IS_ABSOLUTE "${_CMAKE_TOOL_PROG_NAME_OUTPUT}") - get_filename_component(_LOCATION_FROM_COMPILER "${_CMAKE_TOOL_PROG_NAME_OUTPUT}" DIRECTORY) - get_filename_component(_NAME_FROM_COMPILER "${_CMAKE_TOOL_PROG_NAME_OUTPUT}" NAME) - endif() - endif() - endif() - - if (NOT _COMPILER_COMP_ARGS_DOC) - set(_COMPILER_COMP_ARGS_DOC "Path to ${NAME} program") - endif() - find_program(${CMAKE_TOOL} - NAMES ${_NAME_FROM_COMPILER} ${_COMPILER_COMP_ARGS_NAMES} - HINTS ${_LOCATION_FROM_COMPILER} ${_COMPILER_COMP_ARGS_HINTS} - DOC "${_COMPILER_COMP_ARGS_DOC}" - ) -endfunction() - set(_CMAKE_TOOL_VARS "") # if it's the MS C/CXX compiler, search for link @@ -139,38 +101,28 @@ else() set(_CMAKE_ADDITIONAL_ADDR2LINE_NAMES "llvm-addr2line") endif() - __get_compiler_component(CMAKE_AR ar NAMES ${_CMAKE_TOOLCHAIN_PREFIX}ar${_CMAKE_TOOLCHAIN_SUFFIX} ${_CMAKE_ADDITIONAL_AR_NAMES} - HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) + find_program(CMAKE_AR NAMES ${_CMAKE_TOOLCHAIN_PREFIX}ar${_CMAKE_TOOLCHAIN_SUFFIX} ${_CMAKE_ADDITIONAL_AR_NAMES} HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) - __get_compiler_component(CMAKE_RANLIB ranlib NAMES ${_CMAKE_TOOLCHAIN_PREFIX}ranlib ${_CMAKE_ADDITIONAL_RANLIB_NAMES} - HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) + find_program(CMAKE_RANLIB NAMES ${_CMAKE_TOOLCHAIN_PREFIX}ranlib ${_CMAKE_ADDITIONAL_RANLIB_NAMES} HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) if(NOT CMAKE_RANLIB) set(CMAKE_RANLIB : CACHE INTERNAL "noop for ranlib") endif() - __get_compiler_component(CMAKE_STRIP strip NAMES ${_CMAKE_TOOLCHAIN_PREFIX}strip${_CMAKE_TOOLCHAIN_SUFFIX} ${_CMAKE_ADDITIONAL_STRIP_NAMES} - HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) - __get_compiler_component(CMAKE_LINKER ld NAMES ${_CMAKE_TOOLCHAIN_PREFIX}ld ${_CMAKE_ADDITIONAL_LINKER_NAMES} - HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) - __get_compiler_component(CMAKE_NM nm NAMES ${_CMAKE_TOOLCHAIN_PREFIX}nm ${_CMAKE_ADDITIONAL_NM_NAMES} - HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) - __get_compiler_component(CMAKE_OBJDUMP objdump NAMES ${_CMAKE_TOOLCHAIN_PREFIX}objdump ${_CMAKE_ADDITIONAL_OBJDUMP_NAMES} - HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) - __get_compiler_component(CMAKE_OBJCOPY objcopy NAMES ${_CMAKE_TOOLCHAIN_PREFIX}objcopy ${_CMAKE_ADDITIONAL_OBJCOPY_NAMES} - HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) - __get_compiler_component(CMAKE_READELF readelf NAMES ${_CMAKE_TOOLCHAIN_PREFIX}readelf ${_CMAKE_ADDITIONAL_READELF_NAMES} - HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) - __get_compiler_component(CMAKE_DLLTOOL dlltool NAMES ${_CMAKE_TOOLCHAIN_PREFIX}dlltool ${_CMAKE_ADDITIONAL_DLLTOOL_NAMES} - HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) - __get_compiler_component(CMAKE_ADDR2LINE addr2line NAMES ${_CMAKE_TOOLCHAIN_PREFIX}addr2line ${_CMAKE_ADDITIONAL_ADDR2LINE_NAMES} - HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) + find_program(CMAKE_STRIP NAMES ${_CMAKE_TOOLCHAIN_PREFIX}strip${_CMAKE_TOOLCHAIN_SUFFIX} ${_CMAKE_ADDITIONAL_STRIP_NAMES} HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) + find_program(CMAKE_LINKER NAMES ${_CMAKE_TOOLCHAIN_PREFIX}ld ${_CMAKE_ADDITIONAL_LINKER_NAMES} HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) + find_program(CMAKE_NM NAMES ${_CMAKE_TOOLCHAIN_PREFIX}nm ${_CMAKE_ADDITIONAL_NM_NAMES} HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) + find_program(CMAKE_OBJDUMP NAMES ${_CMAKE_TOOLCHAIN_PREFIX}objdump ${_CMAKE_ADDITIONAL_OBJDUMP_NAMES} HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) + find_program(CMAKE_OBJCOPY NAMES ${_CMAKE_TOOLCHAIN_PREFIX}objcopy ${_CMAKE_ADDITIONAL_OBJCOPY_NAMES} HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) + find_program(CMAKE_READELF NAMES ${_CMAKE_TOOLCHAIN_PREFIX}readelf ${_CMAKE_ADDITIONAL_READELF_NAMES} HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) + find_program(CMAKE_DLLTOOL NAMES ${_CMAKE_TOOLCHAIN_PREFIX}dlltool ${_CMAKE_ADDITIONAL_DLLTOOL_NAMES} HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) + find_program(CMAKE_ADDR2LINE NAMES ${_CMAKE_TOOLCHAIN_PREFIX}addr2line ${_CMAKE_ADDITIONAL_ADDR2LINE_NAMES} HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) list(APPEND _CMAKE_TOOL_VARS AR RANLIB STRIP LINKER NM OBJDUMP OBJCOPY READELF DLLTOOL ADDR2LINE) endif() if(CMAKE_PLATFORM_HAS_INSTALLNAME) - __get_compiler_component(CMAKE_INSTALL_NAME_TOOL install_name_tool NAMES ${_CMAKE_TOOLCHAIN_PREFIX}install_name_tool HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) + find_program(CMAKE_INSTALL_NAME_TOOL NAMES ${_CMAKE_TOOLCHAIN_PREFIX}install_name_tool HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) if(NOT CMAKE_INSTALL_NAME_TOOL) message(FATAL_ERROR "Could not find install_name_tool, please check your installation.") diff --git a/Modules/CMakeOBJCInformation.cmake b/Modules/CMakeOBJCInformation.cmake index 2baad4a..cb61cb8 100644 --- a/Modules/CMakeOBJCInformation.cmake +++ b/Modules/CMakeOBJCInformation.cmake @@ -165,7 +165,7 @@ endif() # compile an Objective-C file into an object file if(NOT CMAKE_OBJC_COMPILE_OBJECT) set(CMAKE_OBJC_COMPILE_OBJECT - "<CMAKE_OBJC_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>") + "<CMAKE_OBJC_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -x objective-c -o <OBJECT> -c <SOURCE>") endif() if(NOT CMAKE_OBJC_LINK_EXECUTABLE) diff --git a/Modules/CMakeOBJCXXInformation.cmake b/Modules/CMakeOBJCXXInformation.cmake index 3f55b01..71ac26a 100644 --- a/Modules/CMakeOBJCXXInformation.cmake +++ b/Modules/CMakeOBJCXXInformation.cmake @@ -258,7 +258,7 @@ endif() # compile an Objective-C++ file into an object file if(NOT CMAKE_OBJCXX_COMPILE_OBJECT) set(CMAKE_OBJCXX_COMPILE_OBJECT - "<CMAKE_OBJCXX_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>") + "<CMAKE_OBJCXX_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -x objective-c++ -o <OBJECT> -c <SOURCE>") endif() if(NOT CMAKE_OBJCXX_LINK_EXECUTABLE) diff --git a/Modules/CMakeSystemSpecificInformation.cmake b/Modules/CMakeSystemSpecificInformation.cmake index c6a8814..ea3a445 100644 --- a/Modules/CMakeSystemSpecificInformation.cmake +++ b/Modules/CMakeSystemSpecificInformation.cmake @@ -27,13 +27,13 @@ include(${CMAKE_SYSTEM_INFO_FILE} OPTIONAL RESULT_VARIABLE _INCLUDED_SYSTEM_INFO if(NOT _INCLUDED_SYSTEM_INFO_FILE) message("System is unknown to cmake, create:\n${CMAKE_SYSTEM_INFO_FILE}" - " to use this system, please send your config file to " - "cmake@www.cmake.org so it can be added to cmake") + " to use this system, please post your config file on " + "discourse.cmake.org so it can be added to cmake") if(EXISTS ${CMAKE_BINARY_DIR}/CMakeCache.txt) configure_file(${CMAKE_BINARY_DIR}/CMakeCache.txt ${CMAKE_BINARY_DIR}/CopyOfCMakeCache.txt COPYONLY) message("Your CMakeCache.txt file was copied to CopyOfCMakeCache.txt. " - "Please send that file to cmake@www.cmake.org.") + "Please post that file on discourse.cmake.org.") endif() endif() diff --git a/Modules/CPack.cmake b/Modules/CPack.cmake index 1809846..8a6a712 100644 --- a/Modules/CPack.cmake +++ b/Modules/CPack.cmake @@ -301,13 +301,6 @@ The following variables are for advanced uses of CPack: project. Defaults to the value of :variable:`CMAKE_GENERATOR`. Few users will want to change this setting. -.. variable:: CPACK_INSTALL_CMAKE_CONFIGURATIONS - - Specify the project configurations to be packaged (e.g. ``Debug``, ``Release``, - etc.). When the CMake project uses a multi-configuration generator such as Xcode - or Visual Studio, this option can be used to specify what configurations - to include in the package. - .. variable:: CPACK_INSTALL_CMAKE_PROJECTS List of four values that specify what project to install. The four values diff --git a/Modules/CTestCoverageCollectGCOV.cmake b/Modules/CTestCoverageCollectGCOV.cmake index 655827a..ff48cc2 100644 --- a/Modules/CTestCoverageCollectGCOV.cmake +++ b/Modules/CTestCoverageCollectGCOV.cmake @@ -20,7 +20,7 @@ This tarball also contains the following: After generating this tar file, it can be sent to CDash for display with the :command:`ctest_submit(CDASH_UPLOAD)` command. -.. command:: cdash_coverage_collect_gcov +.. command:: ctest_coverage_collect_gcov :: diff --git a/Modules/Compiler/GNU-FindBinUtils.cmake b/Modules/Compiler/GNU-FindBinUtils.cmake index a47b7ad..097fbf3 100644 --- a/Modules/Compiler/GNU-FindBinUtils.cmake +++ b/Modules/Compiler/GNU-FindBinUtils.cmake @@ -15,27 +15,21 @@ string(REGEX MATCH "^([0-9]+\\.[0-9]+)" __version_x_y get_filename_component(__gcc_hints "${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER}" DIRECTORY) # http://manpages.ubuntu.com/manpages/wily/en/man1/gcc-ar.1.html -__get_compiler_component( - CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_AR gcc-ar - HINTS - ${__gcc_hints} - NAMES - "${_CMAKE_TOOLCHAIN_PREFIX}gcc-ar-${__version_x_y}" - "${_CMAKE_TOOLCHAIN_PREFIX}gcc-ar-${__version_x}" - "${_CMAKE_TOOLCHAIN_PREFIX}gcc-ar" +find_program(CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_AR NAMES + "${_CMAKE_TOOLCHAIN_PREFIX}gcc-ar-${__version_x_y}" + "${_CMAKE_TOOLCHAIN_PREFIX}gcc-ar-${__version_x}" + "${_CMAKE_TOOLCHAIN_PREFIX}gcc-ar${_CMAKE_COMPILER_SUFFIX}" + HINTS ${__gcc_hints} DOC "A wrapper around 'ar' adding the appropriate '--plugin' option for the GCC compiler" ) mark_as_advanced(CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_AR) # http://manpages.ubuntu.com/manpages/wily/en/man1/gcc-ranlib.1.html -__get_compiler_component( - CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_RANLIB gcc-ranlib - HINTS - ${__gcc_hints} - NAMES - "${_CMAKE_TOOLCHAIN_PREFIX}gcc-ranlib-${__version_x_y}" - "${_CMAKE_TOOLCHAIN_PREFIX}gcc-ranlib-${__version_x}" - "${_CMAKE_TOOLCHAIN_PREFIX}gcc-ranlib" +find_program(CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_RANLIB NAMES + "${_CMAKE_TOOLCHAIN_PREFIX}gcc-ranlib-${__version_x_y}" + "${_CMAKE_TOOLCHAIN_PREFIX}gcc-ranlib-${__version_x}" + "${_CMAKE_TOOLCHAIN_PREFIX}gcc-ranlib${_CMAKE_COMPILER_SUFFIX}" + HINTS ${__gcc_hints} DOC "A wrapper around 'ranlib' adding the appropriate '--plugin' option for the GCC compiler" ) mark_as_advanced(CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_RANLIB) diff --git a/Modules/Compiler/GNU.cmake b/Modules/Compiler/GNU.cmake index e0ff174..6960571 100644 --- a/Modules/Compiler/GNU.cmake +++ b/Modules/Compiler/GNU.cmake @@ -13,6 +13,8 @@ include(Internal/CMakeCheckCompilerFlag) set(__pch_header_C "c-header") set(__pch_header_CXX "c++-header") +set(__pch_header_OBJC "objective-c-header") +set(__pch_header_OBJCXX "objective-c++-header") macro(__compiler_gnu lang) # Feature flags. diff --git a/Modules/FindBoost.cmake b/Modules/FindBoost.cmake index 744d2c7..ef962bc 100644 --- a/Modules/FindBoost.cmake +++ b/Modules/FindBoost.cmake @@ -449,6 +449,9 @@ if (NOT Boost_NO_BOOST_CMAKE) # Convert component found variables to standard variables if required # Necessary for legacy boost-cmake and 1.70 builtin BoostConfig if(Boost_FIND_COMPONENTS) + # Ignore the meta-component "ALL", introduced by Boost 1.73 + list(REMOVE_ITEM Boost_FIND_COMPONENTS "ALL") + foreach(_comp IN LISTS Boost_FIND_COMPONENTS) if(DEFINED Boost_${_comp}_FOUND) continue() diff --git a/Modules/FindPostgreSQL.cmake b/Modules/FindPostgreSQL.cmake index cfa4ebc..4fcc79d 100644 --- a/Modules/FindPostgreSQL.cmake +++ b/Modules/FindPostgreSQL.cmake @@ -208,11 +208,22 @@ if (PostgreSQL_INCLUDE_DIR) endif() endforeach() if (_PostgreSQL_VERSION_NUM) - math(EXPR _PostgreSQL_major_version "${_PostgreSQL_VERSION_NUM} / 10000") - math(EXPR _PostgreSQL_minor_version "${_PostgreSQL_VERSION_NUM} % 10000") - set(PostgreSQL_VERSION_STRING "${_PostgreSQL_major_version}.${_PostgreSQL_minor_version}") - unset(_PostgreSQL_major_version) - unset(_PostgreSQL_minor_version) + # 9.x and older encoding + if (_PostgreSQL_VERSION_NUM LESS 100000) + math(EXPR _PostgreSQL_major_version "${_PostgreSQL_VERSION_NUM} / 10000") + math(EXPR _PostgreSQL_minor_version "${_PostgreSQL_VERSION_NUM} % 10000 / 100") + math(EXPR _PostgreSQL_patch_version "${_PostgreSQL_VERSION_NUM} % 100") + set(PostgreSQL_VERSION_STRING "${_PostgreSQL_major_version}.${_PostgreSQL_minor_version}.${_PostgreSQL_patch_version}") + unset(_PostgreSQL_major_version) + unset(_PostgreSQL_minor_version) + unset(_PostgreSQL_patch_version) + else () + math(EXPR _PostgreSQL_major_version "${_PostgreSQL_VERSION_NUM} / 10000") + math(EXPR _PostgreSQL_minor_version "${_PostgreSQL_VERSION_NUM} % 10000") + set(PostgreSQL_VERSION_STRING "${_PostgreSQL_major_version}.${_PostgreSQL_minor_version}") + unset(_PostgreSQL_major_version) + unset(_PostgreSQL_minor_version) + endif () else () foreach(_PG_CONFIG_HEADER ${_PG_CONFIG_HEADERS}) if(EXISTS "${_PG_CONFIG_HEADER}") diff --git a/Modules/FindwxWidgets.cmake b/Modules/FindwxWidgets.cmake index c813ead..fd69e21 100644 --- a/Modules/FindwxWidgets.cmake +++ b/Modules/FindwxWidgets.cmake @@ -505,6 +505,8 @@ if(wxWidgets_FIND_STYLE STREQUAL "win32") elseif(MSVC) set(_WX_TOOL vc) set(_WX_TOOLVER ${MSVC_TOOLSET_VERSION}) + # support for a lib/vc14x_x64_dll/ path from wxW 3.1.3 distribution + string(REGEX REPLACE ".$" "x" _WX_TOOLVERx ${_WX_TOOLVER}) if(CMAKE_SIZEOF_VOID_P EQUAL 8) set(_WX_ARCH _x64) endif() @@ -523,9 +525,13 @@ if(wxWidgets_FIND_STYLE STREQUAL "win32") PATHS ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVER}_xp${_WX_ARCH}_dll # prefer shared ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVER}${_WX_ARCH}_dll # prefer shared + ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVERx}_xp${_WX_ARCH}_dll # prefer shared + ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVERx}${_WX_ARCH}_dll # prefer shared ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_ARCH}_dll # prefer shared ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVER}_xp${_WX_ARCH}_lib ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVER}${_WX_ARCH}_lib + ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVERx}_xp${_WX_ARCH}_lib + ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVERx}${_WX_ARCH}_lib ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_ARCH}_lib DOC "Path to wxWidgets libraries" NO_DEFAULT_PATH @@ -544,9 +550,13 @@ if(wxWidgets_FIND_STYLE STREQUAL "win32") PATHS ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVER}_xp${_WX_ARCH}_lib # prefer static ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVER}${_WX_ARCH}_lib # prefer static + ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVERx}_xp${_WX_ARCH}_lib # prefer static + ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVERx}${_WX_ARCH}_lib # prefer static ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_ARCH}_lib # prefer static ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVER}_xp${_WX_ARCH}_dll ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVER}${_WX_ARCH}_dll + ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVERx}_xp${_WX_ARCH}_dll + ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVERx}${_WX_ARCH}_dll ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_ARCH}_dll DOC "Path to wxWidgets libraries" NO_DEFAULT_PATH diff --git a/Modules/Platform/Darwin.cmake b/Modules/Platform/Darwin.cmake index d0bb359..1482d76 100644 --- a/Modules/Platform/Darwin.cmake +++ b/Modules/Platform/Darwin.cmake @@ -52,24 +52,21 @@ if("${DARWIN_MAJOR_VERSION}" GREATER 8) set(CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG "-Wl,-rpath,") endif() -set(CMAKE_C_OSX_COMPATIBILITY_VERSION_FLAG "-compatibility_version ") -set(CMAKE_C_OSX_CURRENT_VERSION_FLAG "-current_version ") -set(CMAKE_CXX_OSX_COMPATIBILITY_VERSION_FLAG "${CMAKE_C_OSX_COMPATIBILITY_VERSION_FLAG}") -set(CMAKE_CXX_OSX_CURRENT_VERSION_FLAG "${CMAKE_C_OSX_CURRENT_VERSION_FLAG}") +foreach(lang C CXX OBJC OBJCXX) + set(CMAKE_${lang}_OSX_COMPATIBILITY_VERSION_FLAG "-compatibility_version ") + set(CMAKE_${lang}_OSX_CURRENT_VERSION_FLAG "-current_version ") + set(CMAKE_${lang}_LINK_FLAGS "-Wl,-headerpad_max_install_names") -set(CMAKE_C_LINK_FLAGS "-Wl,-headerpad_max_install_names") -set(CMAKE_CXX_LINK_FLAGS "-Wl,-headerpad_max_install_names") + if(HAVE_FLAG_SEARCH_PATHS_FIRST) + set(CMAKE_${lang}_LINK_FLAGS "-Wl,-search_paths_first ${CMAKE_${lang}_LINK_FLAGS}") + endif() -if(HAVE_FLAG_SEARCH_PATHS_FIRST) - set(CMAKE_C_LINK_FLAGS "-Wl,-search_paths_first ${CMAKE_C_LINK_FLAGS}") - set(CMAKE_CXX_LINK_FLAGS "-Wl,-search_paths_first ${CMAKE_CXX_LINK_FLAGS}") -endif() + set(CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS "-dynamiclib -Wl,-headerpad_max_install_names") + set(CMAKE_SHARED_MODULE_CREATE_${lang}_FLAGS "-bundle -Wl,-headerpad_max_install_names") + set(CMAKE_SHARED_MODULE_LOADER_${lang}_FLAG "-Wl,-bundle_loader,") +endforeach() set(CMAKE_PLATFORM_HAS_INSTALLNAME 1) -set(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "-dynamiclib -Wl,-headerpad_max_install_names") -set(CMAKE_SHARED_MODULE_CREATE_C_FLAGS "-bundle -Wl,-headerpad_max_install_names") -set(CMAKE_SHARED_MODULE_LOADER_C_FLAG "-Wl,-bundle_loader,") -set(CMAKE_SHARED_MODULE_LOADER_CXX_FLAG "-Wl,-bundle_loader,") set(CMAKE_FIND_LIBRARY_SUFFIXES ".tbd" ".dylib" ".so" ".a") # hack: if a new cmake (which uses CMAKE_INSTALL_NAME_TOOL) runs on an old build tree @@ -84,12 +81,6 @@ endif() # Enable shared library versioning. set(CMAKE_SHARED_LIBRARY_SONAME_C_FLAG "-install_name") -# Xcode does not support -isystem yet. -if(XCODE) - set(CMAKE_INCLUDE_SYSTEM_FLAG_C) - set(CMAKE_INCLUDE_SYSTEM_FLAG_CXX) -endif() - if("${_CURRENT_OSX_VERSION}" VERSION_LESS "10.5") # Need to list dependent shared libraries on link line. When building # with -isysroot (for universal binaries), the linker always looks for @@ -98,40 +89,25 @@ if("${_CURRENT_OSX_VERSION}" VERSION_LESS "10.5") set(CMAKE_LINK_DEPENDENT_LIBRARY_FILES 1) endif() -set(CMAKE_C_CREATE_SHARED_LIBRARY - "<CMAKE_C_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> <LINK_FLAGS> -o <TARGET> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>") -set(CMAKE_CXX_CREATE_SHARED_LIBRARY - "<CMAKE_CXX_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>") -set(CMAKE_Fortran_CREATE_SHARED_LIBRARY - "<CMAKE_Fortran_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_Fortran_FLAGS> <LINK_FLAGS> -o <TARGET> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>") - -set(CMAKE_CXX_CREATE_SHARED_MODULE - "<CMAKE_CXX_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>") - -set(CMAKE_C_CREATE_SHARED_MODULE - "<CMAKE_C_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_MODULE_CREATE_C_FLAGS> <LINK_FLAGS> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>") - -set(CMAKE_Fortran_CREATE_SHARED_MODULE - "<CMAKE_Fortran_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_MODULE_CREATE_Fortran_FLAGS> <LINK_FLAGS> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>") +foreach(lang C CXX Fortran OBJC OBJCXX) + # Xcode does not support -isystem yet. + if(XCODE) + set(CMAKE_INCLUDE_SYSTEM_FLAG_${lang}) + endif() -set(CMAKE_C_CREATE_MACOSX_FRAMEWORK - "<CMAKE_C_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> <LINK_FLAGS> -o <TARGET> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>") -set(CMAKE_CXX_CREATE_MACOSX_FRAMEWORK - "<CMAKE_CXX_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>") + set(CMAKE_${lang}_CREATE_SHARED_LIBRARY + "<CMAKE_${lang}_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS> <LINK_FLAGS> -o <TARGET> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>") -set(CMAKE_OBJC_CREATE_MACOSX_FRAMEWORK - "<CMAKE_OBJC_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_OBJC_FLAGS> <LINK_FLAGS> -o <TARGET> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>") + set(CMAKE_${lang}_CREATE_SHARED_MODULE + "<CMAKE_${lang}_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_MODULE_CREATE_${lang}_FLAGS> <LINK_FLAGS> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>") -set(CMAKE_OBJCXX_CREATE_MACOSX_FRAMEWORK - "<CMAKE_OBJCXX_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_OBJCXX_FLAGS> <LINK_FLAGS> -o <TARGET> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>") + set(CMAKE_${lang}_CREATE_MACOSX_FRAMEWORK + "<CMAKE_${lang}_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS> <LINK_FLAGS> -o <TARGET> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>") -# Set default framework search path flag for languages known to use a -# preprocessor that may find headers in frameworks. -set(CMAKE_C_FRAMEWORK_SEARCH_FLAG -F) -set(CMAKE_CXX_FRAMEWORK_SEARCH_FLAG -F) -set(CMAKE_OBJC_FRAMEWORK_SEARCH_FLAG -F) -set(CMAKE_OBJCXX_FRAMEWORK_SEARCH_FLAG -F) -set(CMAKE_Fortran_FRAMEWORK_SEARCH_FLAG -F) + # Set default framework search path flag for languages known to use a + # preprocessor that may find headers in frameworks. + set(CMAKE_${lang}_FRAMEWORK_SEARCH_FLAG -F) +endforeach() # default to searching for frameworks first if(NOT DEFINED CMAKE_FIND_FRAMEWORK) diff --git a/Modules/Platform/Windows-Clang.cmake b/Modules/Platform/Windows-Clang.cmake index f226553..02864c6 100644 --- a/Modules/Platform/Windows-Clang.cmake +++ b/Modules/Platform/Windows-Clang.cmake @@ -8,9 +8,6 @@ if(__WINDOWS_CLANG) endif() set(__WINDOWS_CLANG 1) -set(__pch_header_C "c-header") -set(__pch_header_CXX "c++-header") - macro(__windows_compiler_clang_gnu lang) set(CMAKE_LIBRARY_PATH_FLAG "-L") set(CMAKE_LINK_LIBRARY_FLAG "-l") @@ -10,7 +10,7 @@ For full documentation visit the `CMake Home Page`_ and the references useful guides and recipes. .. _`CMake Home Page`: https://cmake.org -.. _`CMake Documentation Page`: https://cmake.org/cmake/help/documentation.html +.. _`CMake Documentation Page`: https://cmake.org/documentation .. _`CMake Community Wiki`: https://gitlab.kitware.com/cmake/community/wikis/home CMake is maintained and supported by `Kitware`_ and developed in @@ -42,10 +42,10 @@ Supported Platforms Other UNIX-like operating systems may work too out of the box, if not it should not be a major problem to port CMake to this platform. -Subscribe and post to the `CMake Users List`_ to ask if others have +Please post to the `CMake Discourse Forum`_ to ask if others have had experience with the platform. -.. _`CMake Users List`: https://cmake.org/mailman/listinfo/cmake +.. _`CMake Discourse Forum`: https://discourse.cmake.org Building CMake from Scratch --------------------------- @@ -88,7 +88,7 @@ There are two ways for building CMake under Windows: and bootstrap as above. -.. _`CMake Download Page`: https://cmake.org/cmake/resources/software.html +.. _`CMake Download Page`: https://cmake.org/download .. _`MSYS2`: https://www.msys2.org/ Building CMake with CMake @@ -99,7 +99,7 @@ run the installed CMake on the sources of this CMake with your preferred options and generators. Then build it and install it. For instructions how to do this, see documentation on `Running CMake`_. -.. _`Running CMake`: https://cmake.org/cmake/help/runningcmake.html +.. _`Running CMake`: https://cmake.org/runningcmake To build the documentation, install `Sphinx`_ and configure CMake with ``-DSPHINX_HTML=ON`` and/or ``-DSPHINX_MAN=ON`` to enable the "html" or @@ -115,7 +115,7 @@ If you have found a bug: 1. If you have a patch, please read the `CONTRIBUTING.rst`_ document. -2. Otherwise, please join the `CMake Users List`_ and ask about +2. Otherwise, please post to the `CMake Discourse Forum`_ and ask about the expected and observed behaviors to determine if it is really a bug. diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index 63e08de..b1f7b29 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -919,14 +919,14 @@ set(CTEST_SRCS cmCTest.cxx CTest/cmCTestEmptyBinaryDirectoryCommand.cxx CTest/cmCTestGenericHandler.cxx CTest/cmCTestHandlerCommand.cxx - CTest/cmCTestHardwareAllocator.cxx - CTest/cmCTestHardwareSpec.cxx + CTest/cmCTestResourceAllocator.cxx + CTest/cmCTestResourceSpec.cxx CTest/cmCTestLaunch.cxx CTest/cmCTestMemCheckCommand.cxx CTest/cmCTestMemCheckHandler.cxx CTest/cmCTestMultiProcessHandler.cxx - CTest/cmCTestProcessesLexerHelper.cxx CTest/cmCTestReadCustomFilesCommand.cxx + CTest/cmCTestResourceGroupsLexerHelper.cxx CTest/cmCTestRunScriptCommand.cxx CTest/cmCTestRunTest.cxx CTest/cmCTestScriptHandler.cxx @@ -958,9 +958,9 @@ set(CTEST_SRCS cmCTest.cxx CTest/cmCTestP4.cxx CTest/cmCTestP4.h - LexerParser/cmCTestProcessesLexer.cxx - LexerParser/cmCTestProcessesLexer.h - LexerParser/cmCTestProcessesLexer.in.l + LexerParser/cmCTestResourceGroupsLexer.cxx + LexerParser/cmCTestResourceGroupsLexer.h + LexerParser/cmCTestResourceGroupsLexer.in.l ) # Build CTestLib @@ -1177,7 +1177,7 @@ if(WIN32) unset(CMake_RCVERSION_MONTH_DAY) unset(CMake_RCVERSION_YEAR) else() - set(CMake_RCVERSION ${CMake_VERSION_MAJOR},${CMake_VERSION_MINOR},${CMake_VERSION_PATCH}) + set(CMake_RCVERSION ${CMake_VERSION_MAJOR},${CMake_VERSION_MINOR},${CMake_VERSION_PATCH},0) endif() set(CMake_RCVERSION_STR ${CMake_VERSION}) diff --git a/Source/CPack/cmCPackGenerator.cxx b/Source/CPack/cmCPackGenerator.cxx index 153f328..7a6c50b 100644 --- a/Source/CPack/cmCPackGenerator.cxx +++ b/Source/CPack/cmCPackGenerator.cxx @@ -605,14 +605,6 @@ int cmCPackGenerator::InstallProjectViaInstallCMakeProjects( cmExpandList(buildConfig, buildConfigs); } - // Try get configurations requested by the user explicitly - { - const char* const configsCstr = - this->GetOption("CPACK_INSTALL_CMAKE_CONFIGURATIONS"); - auto configs = configsCstr ? configsCstr : std::string{}; - cmExpandList(configs, buildConfigs); - } - // Remove duplicates std::sort(buildConfigs.begin(), buildConfigs.end()); buildConfigs.erase(std::unique(buildConfigs.begin(), buildConfigs.end()), diff --git a/Source/CTest/cmCTestBinPacker.cxx b/Source/CTest/cmCTestBinPacker.cxx index e9e3bee..e21b14d 100644 --- a/Source/CTest/cmCTestBinPacker.cxx +++ b/Source/CTest/cmCTestBinPacker.cxx @@ -23,7 +23,7 @@ namespace { /* * The following algorithm is used to do two things: * - * 1) Determine if a test's hardware requirements can fit within the hardware + * 1) Determine if a test's resource requirements can fit within the resources * present on the system, and * 2) Do the actual allocation * @@ -34,46 +34,46 @@ namespace { * more combinations can be tried. */ template <typename AllocationStrategy> -static bool AllocateCTestHardware( - const std::map<std::string, cmCTestHardwareAllocator::Resource>& hardware, - const std::vector<std::string>& hardwareSorted, std::size_t currentIndex, +static bool AllocateCTestResources( + const std::map<std::string, cmCTestResourceAllocator::Resource>& resources, + const std::vector<std::string>& resourcesSorted, std::size_t currentIndex, std::vector<cmCTestBinPackerAllocation*>& allocations) { // Iterate through all large enough resources until we find a solution - std::size_t hardwareIndex = 0; - while (hardwareIndex < hardwareSorted.size()) { - auto const& resource = hardware.at(hardwareSorted[hardwareIndex]); + std::size_t resourceIndex = 0; + while (resourceIndex < resourcesSorted.size()) { + auto const& resource = resources.at(resourcesSorted[resourceIndex]); if (resource.Free() >= static_cast<unsigned int>(allocations[currentIndex]->SlotsNeeded)) { // Preemptively allocate the resource - allocations[currentIndex]->Id = hardwareSorted[hardwareIndex]; + allocations[currentIndex]->Id = resourcesSorted[resourceIndex]; if (currentIndex + 1 >= allocations.size()) { // We have a solution return true; } // Move the resource up the list until it is sorted again - auto hardware2 = hardware; - auto hardwareSorted2 = hardwareSorted; - hardware2[hardwareSorted2[hardwareIndex]].Locked += + auto resources2 = resources; + auto resourcesSorted2 = resourcesSorted; + resources2[resourcesSorted2[resourceIndex]].Locked += allocations[currentIndex]->SlotsNeeded; - AllocationStrategy::IncrementalSort(hardware2, hardwareSorted2, - hardwareIndex); + AllocationStrategy::IncrementalSort(resources2, resourcesSorted2, + resourceIndex); // Recurse one level deeper - if (AllocateCTestHardware<AllocationStrategy>( - hardware2, hardwareSorted2, currentIndex + 1, allocations)) { + if (AllocateCTestResources<AllocationStrategy>( + resources2, resourcesSorted2, currentIndex + 1, allocations)) { return true; } } // No solution found here, deallocate the resource and try the next one allocations[currentIndex]->Id.clear(); - auto freeSlots = hardware.at(hardwareSorted.at(hardwareIndex)).Free(); + auto freeSlots = resources.at(resourcesSorted.at(resourceIndex)).Free(); do { - ++hardwareIndex; - } while (hardwareIndex < hardwareSorted.size() && - hardware.at(hardwareSorted.at(hardwareIndex)).Free() == + ++resourceIndex; + } while (resourceIndex < resourcesSorted.size() && + resources.at(resourcesSorted.at(resourceIndex)).Free() == freeSlots); } @@ -82,8 +82,8 @@ static bool AllocateCTestHardware( } template <typename AllocationStrategy> -static bool AllocateCTestHardware( - const std::map<std::string, cmCTestHardwareAllocator::Resource>& hardware, +static bool AllocateCTestResources( + const std::map<std::string, cmCTestResourceAllocator::Resource>& resources, std::vector<cmCTestBinPackerAllocation>& allocations) { // Sort the resource requirements in descending order by slots needed @@ -99,103 +99,105 @@ static bool AllocateCTestHardware( }); // Sort the resources according to sort strategy - std::vector<std::string> hardwareSorted; - hardwareSorted.reserve(hardware.size()); - for (auto const& hw : hardware) { - hardwareSorted.push_back(hw.first); + std::vector<std::string> resourcesSorted; + resourcesSorted.reserve(resources.size()); + for (auto const& res : resources) { + resourcesSorted.push_back(res.first); } - AllocationStrategy::InitialSort(hardware, hardwareSorted); + AllocationStrategy::InitialSort(resources, resourcesSorted); // Do the actual allocation - return AllocateCTestHardware<AllocationStrategy>( - hardware, hardwareSorted, std::size_t(0), allocationsPtr); + return AllocateCTestResources<AllocationStrategy>( + resources, resourcesSorted, std::size_t(0), allocationsPtr); } class RoundRobinAllocationStrategy { public: static void InitialSort( - const std::map<std::string, cmCTestHardwareAllocator::Resource>& hardware, - std::vector<std::string>& hardwareSorted); + const std::map<std::string, cmCTestResourceAllocator::Resource>& resources, + std::vector<std::string>& resourcesSorted); static void IncrementalSort( - const std::map<std::string, cmCTestHardwareAllocator::Resource>& hardware, - std::vector<std::string>& hardwareSorted, std::size_t lastAllocatedIndex); + const std::map<std::string, cmCTestResourceAllocator::Resource>& resources, + std::vector<std::string>& resourcesSorted, std::size_t lastAllocatedIndex); }; void RoundRobinAllocationStrategy::InitialSort( - const std::map<std::string, cmCTestHardwareAllocator::Resource>& hardware, - std::vector<std::string>& hardwareSorted) + const std::map<std::string, cmCTestResourceAllocator::Resource>& resources, + std::vector<std::string>& resourcesSorted) { std::stable_sort( - hardwareSorted.rbegin(), hardwareSorted.rend(), - [&hardware](const std::string& id1, const std::string& id2) { - return hardware.at(id1).Free() < hardware.at(id2).Free(); + resourcesSorted.rbegin(), resourcesSorted.rend(), + [&resources](const std::string& id1, const std::string& id2) { + return resources.at(id1).Free() < resources.at(id2).Free(); }); } void RoundRobinAllocationStrategy::IncrementalSort( - const std::map<std::string, cmCTestHardwareAllocator::Resource>& hardware, - std::vector<std::string>& hardwareSorted, std::size_t lastAllocatedIndex) + const std::map<std::string, cmCTestResourceAllocator::Resource>& resources, + std::vector<std::string>& resourcesSorted, std::size_t lastAllocatedIndex) { - auto tmp = hardwareSorted[lastAllocatedIndex]; + auto tmp = resourcesSorted[lastAllocatedIndex]; std::size_t i = lastAllocatedIndex; - while (i < hardwareSorted.size() - 1 && - hardware.at(hardwareSorted[i + 1]).Free() > hardware.at(tmp).Free()) { - hardwareSorted[i] = hardwareSorted[i + 1]; + while (i < resourcesSorted.size() - 1 && + resources.at(resourcesSorted[i + 1]).Free() > + resources.at(tmp).Free()) { + resourcesSorted[i] = resourcesSorted[i + 1]; ++i; } - hardwareSorted[i] = tmp; + resourcesSorted[i] = tmp; } class BlockAllocationStrategy { public: static void InitialSort( - const std::map<std::string, cmCTestHardwareAllocator::Resource>& hardware, - std::vector<std::string>& hardwareSorted); + const std::map<std::string, cmCTestResourceAllocator::Resource>& resources, + std::vector<std::string>& resourcesSorted); static void IncrementalSort( - const std::map<std::string, cmCTestHardwareAllocator::Resource>& hardware, - std::vector<std::string>& hardwareSorted, std::size_t lastAllocatedIndex); + const std::map<std::string, cmCTestResourceAllocator::Resource>& resources, + std::vector<std::string>& resourcesSorted, std::size_t lastAllocatedIndex); }; void BlockAllocationStrategy::InitialSort( - const std::map<std::string, cmCTestHardwareAllocator::Resource>& hardware, - std::vector<std::string>& hardwareSorted) + const std::map<std::string, cmCTestResourceAllocator::Resource>& resources, + std::vector<std::string>& resourcesSorted) { std::stable_sort( - hardwareSorted.rbegin(), hardwareSorted.rend(), - [&hardware](const std::string& id1, const std::string& id2) { - return hardware.at(id1).Free() < hardware.at(id2).Free(); + resourcesSorted.rbegin(), resourcesSorted.rend(), + [&resources](const std::string& id1, const std::string& id2) { + return resources.at(id1).Free() < resources.at(id2).Free(); }); } void BlockAllocationStrategy::IncrementalSort( - const std::map<std::string, cmCTestHardwareAllocator::Resource>&, - std::vector<std::string>& hardwareSorted, std::size_t lastAllocatedIndex) + const std::map<std::string, cmCTestResourceAllocator::Resource>&, + std::vector<std::string>& resourcesSorted, std::size_t lastAllocatedIndex) { - auto tmp = hardwareSorted[lastAllocatedIndex]; + auto tmp = resourcesSorted[lastAllocatedIndex]; std::size_t i = lastAllocatedIndex; while (i > 0) { - hardwareSorted[i] = hardwareSorted[i - 1]; + resourcesSorted[i] = resourcesSorted[i - 1]; --i; } - hardwareSorted[i] = tmp; + resourcesSorted[i] = tmp; } } -bool cmAllocateCTestHardwareRoundRobin( - const std::map<std::string, cmCTestHardwareAllocator::Resource>& hardware, +bool cmAllocateCTestResourcesRoundRobin( + const std::map<std::string, cmCTestResourceAllocator::Resource>& resources, std::vector<cmCTestBinPackerAllocation>& allocations) { - return AllocateCTestHardware<RoundRobinAllocationStrategy>(hardware, - allocations); + return AllocateCTestResources<RoundRobinAllocationStrategy>(resources, + allocations); } -bool cmAllocateCTestHardwareBlock( - const std::map<std::string, cmCTestHardwareAllocator::Resource>& hardware, +bool cmAllocateCTestResourcesBlock( + const std::map<std::string, cmCTestResourceAllocator::Resource>& resources, std::vector<cmCTestBinPackerAllocation>& allocations) { - return AllocateCTestHardware<BlockAllocationStrategy>(hardware, allocations); + return AllocateCTestResources<BlockAllocationStrategy>(resources, + allocations); } diff --git a/Source/CTest/cmCTestBinPacker.h b/Source/CTest/cmCTestBinPacker.h index 54f03d7..ff02b85 100644 --- a/Source/CTest/cmCTestBinPacker.h +++ b/Source/CTest/cmCTestBinPacker.h @@ -8,7 +8,7 @@ #include <string> #include <vector> -#include "cmCTestHardwareAllocator.h" +#include "cmCTestResourceAllocator.h" struct cmCTestBinPackerAllocation { @@ -20,12 +20,12 @@ struct cmCTestBinPackerAllocation bool operator!=(const cmCTestBinPackerAllocation& other) const; }; -bool cmAllocateCTestHardwareRoundRobin( - const std::map<std::string, cmCTestHardwareAllocator::Resource>& hardware, +bool cmAllocateCTestResourcesRoundRobin( + const std::map<std::string, cmCTestResourceAllocator::Resource>& resources, std::vector<cmCTestBinPackerAllocation>& allocations); -bool cmAllocateCTestHardwareBlock( - const std::map<std::string, cmCTestHardwareAllocator::Resource>& hardware, +bool cmAllocateCTestResourcesBlock( + const std::map<std::string, cmCTestResourceAllocator::Resource>& resources, std::vector<cmCTestBinPackerAllocation>& allocations); #endif diff --git a/Source/CTest/cmCTestMultiProcessHandler.cxx b/Source/CTest/cmCTestMultiProcessHandler.cxx index 7e8d548..02d396e 100644 --- a/Source/CTest/cmCTestMultiProcessHandler.cxx +++ b/Source/CTest/cmCTestMultiProcessHandler.cxx @@ -140,7 +140,7 @@ void cmCTestMultiProcessHandler::RunTests() assert(this->Completed == this->Total); assert(this->Tests.empty()); } - assert(this->AllHardwareAvailable()); + assert(this->AllResourcesAvailable()); this->MarkFinished(); this->UpdateCostData(); @@ -177,9 +177,9 @@ bool cmCTestMultiProcessHandler::StartTestProcess(int test) } testRun->SetIndex(test); testRun->SetTestProperties(this->Properties[test]); - if (this->TestHandler->UseHardwareSpec) { - testRun->SetUseAllocatedHardware(true); - testRun->SetAllocatedHardware(this->AllocatedHardware[test]); + if (this->TestHandler->UseResourceSpec) { + testRun->SetUseAllocatedResources(true); + testRun->SetAllocatedResources(this->AllocatedResources[test]); } // Find any failed dependencies for this test. We assume the more common @@ -192,10 +192,10 @@ bool cmCTestMultiProcessHandler::StartTestProcess(int test) // Always lock the resources we'll be using, even if we fail to set the // working directory because FinishTestProcess() will try to unlock them - this->AllocateResources(test); + this->LockResources(test); - if (!this->TestsHaveSufficientHardware[test]) { - testRun->StartFailure("Insufficient hardware"); + if (!this->TestsHaveSufficientResources[test]) { + testRun->StartFailure("Insufficient resources"); this->FinishTestProcess(testRun, false); return false; } @@ -218,26 +218,26 @@ bool cmCTestMultiProcessHandler::StartTestProcess(int test) return false; } -bool cmCTestMultiProcessHandler::AllocateHardware(int index) +bool cmCTestMultiProcessHandler::AllocateResources(int index) { - if (!this->TestHandler->UseHardwareSpec) { + if (!this->TestHandler->UseResourceSpec) { return true; } std::map<std::string, std::vector<cmCTestBinPackerAllocation>> allocations; - if (!this->TryAllocateHardware(index, allocations)) { + if (!this->TryAllocateResources(index, allocations)) { return false; } - auto& allocatedHardware = this->AllocatedHardware[index]; - allocatedHardware.resize(this->Properties[index]->Processes.size()); + auto& allocatedResources = this->AllocatedResources[index]; + allocatedResources.resize(this->Properties[index]->ResourceGroups.size()); for (auto const& it : allocations) { for (auto const& alloc : it.second) { - bool result = this->HardwareAllocator.AllocateResource( + bool result = this->ResourceAllocator.AllocateResource( it.first, alloc.Id, alloc.SlotsNeeded); (void)result; assert(result); - allocatedHardware[alloc.ProcessIndex][it.first].push_back( + allocatedResources[alloc.ProcessIndex][it.first].push_back( { alloc.Id, static_cast<unsigned int>(alloc.SlotsNeeded) }); } } @@ -245,14 +245,14 @@ bool cmCTestMultiProcessHandler::AllocateHardware(int index) return true; } -bool cmCTestMultiProcessHandler::TryAllocateHardware( +bool cmCTestMultiProcessHandler::TryAllocateResources( int index, std::map<std::string, std::vector<cmCTestBinPackerAllocation>>& allocations) { allocations.clear(); std::size_t processIndex = 0; - for (auto const& process : this->Properties[index]->Processes) { + for (auto const& process : this->Properties[index]->ResourceGroups) { for (auto const& requirement : process) { for (int i = 0; i < requirement.UnitsNeeded; ++i) { allocations[requirement.ResourceType].push_back( @@ -262,13 +262,13 @@ bool cmCTestMultiProcessHandler::TryAllocateHardware( ++processIndex; } - auto const& availableHardware = this->HardwareAllocator.GetResources(); + auto const& availableResources = this->ResourceAllocator.GetResources(); for (auto& it : allocations) { - if (!availableHardware.count(it.first)) { + if (!availableResources.count(it.first)) { return false; } - if (!cmAllocateCTestHardwareRoundRobin(availableHardware.at(it.first), - it.second)) { + if (!cmAllocateCTestResourcesRoundRobin(availableResources.at(it.first), + it.second)) { return false; } } @@ -276,19 +276,19 @@ bool cmCTestMultiProcessHandler::TryAllocateHardware( return true; } -void cmCTestMultiProcessHandler::DeallocateHardware(int index) +void cmCTestMultiProcessHandler::DeallocateResources(int index) { - if (!this->TestHandler->UseHardwareSpec) { + if (!this->TestHandler->UseResourceSpec) { return; } { - auto& allocatedHardware = this->AllocatedHardware[index]; - for (auto const& processAlloc : allocatedHardware) { + auto& allocatedResources = this->AllocatedResources[index]; + for (auto const& processAlloc : allocatedResources) { for (auto const& it : processAlloc) { auto resourceType = it.first; for (auto const& it2 : it.second) { - bool success = this->HardwareAllocator.DeallocateResource( + bool success = this->ResourceAllocator.DeallocateResource( resourceType, it2.Id, it2.Slots); (void)success; assert(success); @@ -296,12 +296,12 @@ void cmCTestMultiProcessHandler::DeallocateHardware(int index) } } } - this->AllocatedHardware.erase(index); + this->AllocatedResources.erase(index); } -bool cmCTestMultiProcessHandler::AllHardwareAvailable() +bool cmCTestMultiProcessHandler::AllResourcesAvailable() { - for (auto const& it : this->HardwareAllocator.GetResources()) { + for (auto const& it : this->ResourceAllocator.GetResources()) { for (auto const& it2 : it.second) { if (it2.second.Locked != 0) { return false; @@ -312,13 +312,13 @@ bool cmCTestMultiProcessHandler::AllHardwareAvailable() return true; } -void cmCTestMultiProcessHandler::CheckHardwareAvailable() +void cmCTestMultiProcessHandler::CheckResourcesAvailable() { for (auto test : this->SortedTests) { std::map<std::string, std::vector<cmCTestBinPackerAllocation>> allocations; - this->TestsHaveSufficientHardware[test] = - !this->TestHandler->UseHardwareSpec || - this->TryAllocateHardware(test, allocations); + this->TestsHaveSufficientResources[test] = + !this->TestHandler->UseResourceSpec || + this->TryAllocateResources(test, allocations); } } @@ -346,7 +346,7 @@ void cmCTestMultiProcessHandler::SetStopTimePassed() } } -void cmCTestMultiProcessHandler::AllocateResources(int index) +void cmCTestMultiProcessHandler::LockResources(int index) { this->LockedResources.insert( this->Properties[index]->LockedResources.begin(), @@ -357,7 +357,7 @@ void cmCTestMultiProcessHandler::AllocateResources(int index) } } -void cmCTestMultiProcessHandler::DeallocateResources(int index) +void cmCTestMultiProcessHandler::UnlockResources(int index) { for (std::string const& i : this->Properties[index]->LockedResources) { this->LockedResources.erase(i); @@ -404,10 +404,10 @@ bool cmCTestMultiProcessHandler::StartTest(int test) } } - // Allocate hardware - if (this->TestsHaveSufficientHardware[test] && - !this->AllocateHardware(test)) { - this->DeallocateHardware(test); + // Allocate resources + if (this->TestsHaveSufficientResources[test] && + !this->AllocateResources(test)) { + this->DeallocateResources(test); return false; } @@ -417,7 +417,7 @@ bool cmCTestMultiProcessHandler::StartTest(int test) } // This test was not able to start because it is waiting // on depends to run - this->DeallocateHardware(test); + this->DeallocateResources(test); return false; } @@ -602,8 +602,8 @@ void cmCTestMultiProcessHandler::FinishTestProcess(cmCTestRunTest* runner, this->TestFinishMap[test] = true; this->TestRunningMap[test] = false; this->WriteCheckpoint(test); - this->DeallocateHardware(test); this->DeallocateResources(test); + this->UnlockResources(test); this->RunningCount -= GetProcessorsUsed(test); for (auto p : properties->Affinity) { @@ -912,14 +912,14 @@ static Json::Value DumpTimeoutAfterMatch( return timeoutAfterMatch; } -static Json::Value DumpProcessesToJsonArray( +static Json::Value DumpResourceGroupsToJsonArray( const std::vector< std::vector<cmCTestTestHandler::cmCTestTestResourceRequirement>>& - processes) + resourceGroups) { - Json::Value jsonProcesses = Json::arrayValue; - for (auto const& it : processes) { - Json::Value jsonProcess = Json::objectValue; + Json::Value jsonResourceGroups = Json::arrayValue; + for (auto const& it : resourceGroups) { + Json::Value jsonResourceGroup = Json::objectValue; Json::Value requirements = Json::arrayValue; for (auto const& it2 : it) { Json::Value res = Json::objectValue; @@ -928,10 +928,10 @@ static Json::Value DumpProcessesToJsonArray( res["slots"] = it2.SlotsNeeded; requirements.append(res); } - jsonProcess["requirements"] = requirements; - jsonProcesses.append(jsonProcess); + jsonResourceGroup["requirements"] = requirements; + jsonResourceGroups.append(jsonResourceGroup); } - return jsonProcesses; + return jsonResourceGroups; } static Json::Value DumpCTestProperty(std::string const& name, @@ -1005,9 +1005,10 @@ static Json::Value DumpCTestProperties( "PASS_REGULAR_EXPRESSION", DumpRegExToJsonArray(testProperties.RequiredRegularExpressions))); } - if (!testProperties.Processes.empty()) { + if (!testProperties.ResourceGroups.empty()) { properties.append(DumpCTestProperty( - "PROCESSES", DumpProcessesToJsonArray(testProperties.Processes))); + "RESOURCE_GROUPS", + DumpResourceGroupsToJsonArray(testProperties.ResourceGroups))); } if (testProperties.WantAffinity) { properties.append( diff --git a/Source/CTest/cmCTestMultiProcessHandler.h b/Source/CTest/cmCTestMultiProcessHandler.h index da716f0..1db4bfd 100644 --- a/Source/CTest/cmCTestMultiProcessHandler.h +++ b/Source/CTest/cmCTestMultiProcessHandler.h @@ -14,13 +14,13 @@ #include "cm_uv.h" -#include "cmCTestHardwareAllocator.h" +#include "cmCTestResourceAllocator.h" #include "cmCTestTestHandler.h" #include "cmUVHandlePtr.h" class cmCTest; struct cmCTestBinPackerAllocation; -class cmCTestHardwareSpec; +class cmCTestResourceSpec; class cmCTestRunTest; /** \class cmCTestMultiProcessHandler @@ -47,7 +47,7 @@ public: : public std::map<int, cmCTestTestHandler::cmCTestTestProperties*> { }; - struct HardwareAllocation + struct ResourceAllocation { std::string Id; unsigned int Slots; @@ -87,12 +87,12 @@ public: void SetQuiet(bool b) { this->Quiet = b; } - void InitHardwareAllocator(const cmCTestHardwareSpec& spec) + void InitResourceAllocator(const cmCTestResourceSpec& spec) { - this->HardwareAllocator.InitializeFromHardwareSpec(spec); + this->ResourceAllocator.InitializeFromResourceSpec(spec); } - void CheckHardwareAvailable(); + void CheckResourcesAvailable(); protected: // Start the next test or tests as many as are allowed by @@ -134,16 +134,16 @@ protected: bool CheckStopTimePassed(); void SetStopTimePassed(); - void AllocateResources(int index); - void DeallocateResources(int index); + void LockResources(int index); + void UnlockResources(int index); - bool AllocateHardware(int index); - bool TryAllocateHardware( + bool AllocateResources(int index); + bool TryAllocateResources( int index, std::map<std::string, std::vector<cmCTestBinPackerAllocation>>& allocations); - void DeallocateHardware(int index); - bool AllHardwareAvailable(); + void DeallocateResources(int index); + bool AllResourcesAvailable(); // map from test number to set of depend tests TestMap Tests; @@ -166,10 +166,10 @@ protected: std::vector<std::string> LastTestsFailed; std::set<std::string> LockedResources; std::map<int, - std::vector<std::map<std::string, std::vector<HardwareAllocation>>>> - AllocatedHardware; - std::map<int, bool> TestsHaveSufficientHardware; - cmCTestHardwareAllocator HardwareAllocator; + std::vector<std::map<std::string, std::vector<ResourceAllocation>>>> + AllocatedResources; + std::map<int, bool> TestsHaveSufficientResources; + cmCTestResourceAllocator ResourceAllocator; std::vector<cmCTestTestHandler::cmCTestTestResult>* TestResults; size_t ParallelLevel; // max number of process that can be run at once unsigned long TestLoad; diff --git a/Source/CTest/cmCTestProcessesLexerHelper.cxx b/Source/CTest/cmCTestProcessesLexerHelper.cxx deleted file mode 100644 index 797164b..0000000 --- a/Source/CTest/cmCTestProcessesLexerHelper.cxx +++ /dev/null @@ -1,55 +0,0 @@ -/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying - file Copyright.txt or https://cmake.org/licensing for details. */ -#include "cmCTestProcessesLexerHelper.h" - -#include "cmCTestProcessesLexer.h" -#include "cmCTestTestHandler.h" - -cmCTestProcessesLexerHelper::cmCTestProcessesLexerHelper( - std::vector<std::vector<cmCTestTestHandler::cmCTestTestResourceRequirement>>& - output) - : Output(output) -{ -} - -bool cmCTestProcessesLexerHelper::ParseString(const std::string& value) -{ - yyscan_t lexer; - cmCTestProcesses_yylex_init_extra(this, &lexer); - - auto state = cmCTestProcesses_yy_scan_string(value.c_str(), lexer); - int retval = cmCTestProcesses_yylex(lexer); - cmCTestProcesses_yy_delete_buffer(state, lexer); - - cmCTestProcesses_yylex_destroy(lexer); - return retval == 0; -} - -void cmCTestProcessesLexerHelper::SetProcessCount(unsigned int count) -{ - this->ProcessCount = count; -} - -void cmCTestProcessesLexerHelper::SetResourceType(const std::string& type) -{ - this->ResourceType = type; -} - -void cmCTestProcessesLexerHelper::SetNeededSlots(int count) -{ - this->NeededSlots = count; -} - -void cmCTestProcessesLexerHelper::WriteRequirement() -{ - this->Process.push_back({ this->ResourceType, this->NeededSlots, 1 }); -} - -void cmCTestProcessesLexerHelper::WriteProcess() -{ - for (unsigned int i = 0; i < this->ProcessCount; ++i) { - this->Output.push_back(this->Process); - } - this->Process.clear(); - this->ProcessCount = 1; -} diff --git a/Source/CTest/cmCTestHardwareAllocator.cxx b/Source/CTest/cmCTestResourceAllocator.cxx index 2d1833d..9d468a7 100644 --- a/Source/CTest/cmCTestHardwareAllocator.cxx +++ b/Source/CTest/cmCTestResourceAllocator.cxx @@ -1,15 +1,15 @@ /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ -#include "cmCTestHardwareAllocator.h" +#include "cmCTestResourceAllocator.h" #include <utility> #include <vector> -#include "cmCTestHardwareSpec.h" +#include "cmCTestResourceSpec.h" -void cmCTestHardwareAllocator::InitializeFromHardwareSpec( - const cmCTestHardwareSpec& spec) +void cmCTestResourceAllocator::InitializeFromResourceSpec( + const cmCTestResourceSpec& spec) { this->Resources.clear(); @@ -23,13 +23,13 @@ void cmCTestHardwareAllocator::InitializeFromHardwareSpec( } const std::map<std::string, - std::map<std::string, cmCTestHardwareAllocator::Resource>>& -cmCTestHardwareAllocator::GetResources() const + std::map<std::string, cmCTestResourceAllocator::Resource>>& +cmCTestResourceAllocator::GetResources() const { return this->Resources; } -bool cmCTestHardwareAllocator::AllocateResource(const std::string& name, +bool cmCTestResourceAllocator::AllocateResource(const std::string& name, const std::string& id, unsigned int slots) { @@ -51,7 +51,7 @@ bool cmCTestHardwareAllocator::AllocateResource(const std::string& name, return true; } -bool cmCTestHardwareAllocator::DeallocateResource(const std::string& name, +bool cmCTestResourceAllocator::DeallocateResource(const std::string& name, const std::string& id, unsigned int slots) { @@ -73,13 +73,13 @@ bool cmCTestHardwareAllocator::DeallocateResource(const std::string& name, return true; } -bool cmCTestHardwareAllocator::Resource::operator==( +bool cmCTestResourceAllocator::Resource::operator==( const Resource& other) const { return this->Total == other.Total && this->Locked == other.Locked; } -bool cmCTestHardwareAllocator::Resource::operator!=( +bool cmCTestResourceAllocator::Resource::operator!=( const Resource& other) const { return !(*this == other); diff --git a/Source/CTest/cmCTestHardwareAllocator.h b/Source/CTest/cmCTestResourceAllocator.h index 441f84d..9f0b9c9 100644 --- a/Source/CTest/cmCTestHardwareAllocator.h +++ b/Source/CTest/cmCTestResourceAllocator.h @@ -1,14 +1,14 @@ /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ -#ifndef cmCTestHardwareAllocator_h -#define cmCTestHardwareAllocator_h +#ifndef cmCTestResourceAllocator_h +#define cmCTestResourceAllocator_h #include <map> #include <string> -class cmCTestHardwareSpec; +class cmCTestResourceSpec; -class cmCTestHardwareAllocator +class cmCTestResourceAllocator { public: struct Resource @@ -22,7 +22,7 @@ public: bool operator!=(const Resource& other) const; }; - void InitializeFromHardwareSpec(const cmCTestHardwareSpec& spec); + void InitializeFromResourceSpec(const cmCTestResourceSpec& spec); const std::map<std::string, std::map<std::string, Resource>>& GetResources() const; diff --git a/Source/CTest/cmCTestResourceGroupsLexerHelper.cxx b/Source/CTest/cmCTestResourceGroupsLexerHelper.cxx new file mode 100644 index 0000000..072af42 --- /dev/null +++ b/Source/CTest/cmCTestResourceGroupsLexerHelper.cxx @@ -0,0 +1,55 @@ +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file Copyright.txt or https://cmake.org/licensing for details. */ +#include "cmCTestResourceGroupsLexerHelper.h" + +#include "cmCTestResourceGroupsLexer.h" +#include "cmCTestTestHandler.h" + +cmCTestResourceGroupsLexerHelper::cmCTestResourceGroupsLexerHelper( + std::vector<std::vector<cmCTestTestHandler::cmCTestTestResourceRequirement>>& + output) + : Output(output) +{ +} + +bool cmCTestResourceGroupsLexerHelper::ParseString(const std::string& value) +{ + yyscan_t lexer; + cmCTestResourceGroups_yylex_init_extra(this, &lexer); + + auto state = cmCTestResourceGroups_yy_scan_string(value.c_str(), lexer); + int retval = cmCTestResourceGroups_yylex(lexer); + cmCTestResourceGroups_yy_delete_buffer(state, lexer); + + cmCTestResourceGroups_yylex_destroy(lexer); + return retval == 0; +} + +void cmCTestResourceGroupsLexerHelper::SetProcessCount(unsigned int count) +{ + this->ProcessCount = count; +} + +void cmCTestResourceGroupsLexerHelper::SetResourceType(const std::string& type) +{ + this->ResourceType = type; +} + +void cmCTestResourceGroupsLexerHelper::SetNeededSlots(int count) +{ + this->NeededSlots = count; +} + +void cmCTestResourceGroupsLexerHelper::WriteRequirement() +{ + this->Process.push_back({ this->ResourceType, this->NeededSlots, 1 }); +} + +void cmCTestResourceGroupsLexerHelper::WriteProcess() +{ + for (unsigned int i = 0; i < this->ProcessCount; ++i) { + this->Output.push_back(this->Process); + } + this->Process.clear(); + this->ProcessCount = 1; +} diff --git a/Source/CTest/cmCTestProcessesLexerHelper.h b/Source/CTest/cmCTestResourceGroupsLexerHelper.h index 6c9289f..2cb6cb1 100644 --- a/Source/CTest/cmCTestProcessesLexerHelper.h +++ b/Source/CTest/cmCTestResourceGroupsLexerHelper.h @@ -1,25 +1,25 @@ /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ -#ifndef cmCTestProcessesLexerHelper_h -#define cmCTestProcessesLexerHelper_h +#ifndef cmCTestResourceGroupsLexerHelper_h +#define cmCTestResourceGroupsLexerHelper_h #include <string> #include <vector> #include "cmCTestTestHandler.h" -class cmCTestProcessesLexerHelper +class cmCTestResourceGroupsLexerHelper { public: struct ParserType { }; - cmCTestProcessesLexerHelper( + cmCTestResourceGroupsLexerHelper( std::vector< std::vector<cmCTestTestHandler::cmCTestTestResourceRequirement>>& output); - ~cmCTestProcessesLexerHelper() = default; + ~cmCTestResourceGroupsLexerHelper() = default; bool ParseString(const std::string& value); @@ -39,6 +39,6 @@ private: std::vector<cmCTestTestHandler::cmCTestTestResourceRequirement> Process; }; -#define YY_EXTRA_TYPE cmCTestProcessesLexerHelper* +#define YY_EXTRA_TYPE cmCTestResourceGroupsLexerHelper* #endif diff --git a/Source/CTest/cmCTestHardwareSpec.cxx b/Source/CTest/cmCTestResourceSpec.cxx index 137398a..b4a2b30 100644 --- a/Source/CTest/cmCTestHardwareSpec.cxx +++ b/Source/CTest/cmCTestResourceSpec.cxx @@ -1,6 +1,6 @@ /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ -#include "cmCTestHardwareSpec.h" +#include "cmCTestResourceSpec.h" #include <map> #include <string> @@ -16,7 +16,7 @@ static const cmsys::RegularExpression IdentifierRegex{ "^[a-z_][a-z0-9_]*$" }; static const cmsys::RegularExpression IdRegex{ "^[a-z0-9_]+$" }; -bool cmCTestHardwareSpec::ReadFromJSONFile(const std::string& filename) +bool cmCTestResourceSpec::ReadFromJSONFile(const std::string& filename) { cmsys::ifstream fin(filename.c_str()); if (!fin) { @@ -50,7 +50,7 @@ bool cmCTestHardwareSpec::ReadFromJSONFile(const std::string& filename) if (!localSocket.isObject()) { return false; } - std::map<std::string, std::vector<cmCTestHardwareSpec::Resource>> resources; + std::map<std::string, std::vector<cmCTestResourceSpec::Resource>> resources; cmsys::RegularExpressionMatch match; for (auto const& key : localSocket.getMemberNames()) { if (IdentifierRegex.find(key.c_str(), match)) { @@ -59,7 +59,7 @@ bool cmCTestHardwareSpec::ReadFromJSONFile(const std::string& filename) if (value.isArray()) { for (auto const& item : value) { if (item.isObject()) { - cmCTestHardwareSpec::Resource resource; + cmCTestResourceSpec::Resource resource; if (!item.isMember("id")) { return false; @@ -98,36 +98,36 @@ bool cmCTestHardwareSpec::ReadFromJSONFile(const std::string& filename) return true; } -bool cmCTestHardwareSpec::operator==(const cmCTestHardwareSpec& other) const +bool cmCTestResourceSpec::operator==(const cmCTestResourceSpec& other) const { return this->LocalSocket == other.LocalSocket; } -bool cmCTestHardwareSpec::operator!=(const cmCTestHardwareSpec& other) const +bool cmCTestResourceSpec::operator!=(const cmCTestResourceSpec& other) const { return !(*this == other); } -bool cmCTestHardwareSpec::Socket::operator==( - const cmCTestHardwareSpec::Socket& other) const +bool cmCTestResourceSpec::Socket::operator==( + const cmCTestResourceSpec::Socket& other) const { return this->Resources == other.Resources; } -bool cmCTestHardwareSpec::Socket::operator!=( - const cmCTestHardwareSpec::Socket& other) const +bool cmCTestResourceSpec::Socket::operator!=( + const cmCTestResourceSpec::Socket& other) const { return !(*this == other); } -bool cmCTestHardwareSpec::Resource::operator==( - const cmCTestHardwareSpec::Resource& other) const +bool cmCTestResourceSpec::Resource::operator==( + const cmCTestResourceSpec::Resource& other) const { return this->Id == other.Id && this->Capacity == other.Capacity; } -bool cmCTestHardwareSpec::Resource::operator!=( - const cmCTestHardwareSpec::Resource& other) const +bool cmCTestResourceSpec::Resource::operator!=( + const cmCTestResourceSpec::Resource& other) const { return !(*this == other); } diff --git a/Source/CTest/cmCTestHardwareSpec.h b/Source/CTest/cmCTestResourceSpec.h index a0b4cae..4646db8 100644 --- a/Source/CTest/cmCTestHardwareSpec.h +++ b/Source/CTest/cmCTestResourceSpec.h @@ -1,13 +1,13 @@ /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ -#ifndef cmCTestHardwareSpec_h -#define cmCTestHardwareSpec_h +#ifndef cmCTestResourceSpec_h +#define cmCTestResourceSpec_h #include <map> #include <string> #include <vector> -class cmCTestHardwareSpec +class cmCTestResourceSpec { public: class Resource @@ -33,8 +33,8 @@ public: bool ReadFromJSONFile(const std::string& filename); - bool operator==(const cmCTestHardwareSpec& other) const; - bool operator!=(const cmCTestHardwareSpec& other) const; + bool operator==(const cmCTestResourceSpec& other) const; + bool operator!=(const cmCTestResourceSpec& other) const; }; #endif diff --git a/Source/CTest/cmCTestRunTest.cxx b/Source/CTest/cmCTestRunTest.cxx index 7f7f736..3091050 100644 --- a/Source/CTest/cmCTestRunTest.cxx +++ b/Source/CTest/cmCTestRunTest.cxx @@ -690,25 +690,25 @@ bool cmCTestRunTest::ForkProcess(cmDuration testTimeOut, bool explicitTimeout, cmSystemTools::AppendEnv(*environment); } - if (this->UseAllocatedHardware) { - this->SetupHardwareEnvironment(); + if (this->UseAllocatedResources) { + this->SetupResourcesEnvironment(); } else { - cmSystemTools::UnsetEnv("CTEST_PROCESS_COUNT"); + cmSystemTools::UnsetEnv("CTEST_RESOURCE_GROUP_COUNT"); } return this->TestProcess->StartProcess(this->MultiTestHandler.Loop, affinity); } -void cmCTestRunTest::SetupHardwareEnvironment() +void cmCTestRunTest::SetupResourcesEnvironment() { - std::string processCount = "CTEST_PROCESS_COUNT="; - processCount += std::to_string(this->AllocatedHardware.size()); + std::string processCount = "CTEST_RESOURCE_GROUP_COUNT="; + processCount += std::to_string(this->AllocatedResources.size()); cmSystemTools::PutEnv(processCount); std::size_t i = 0; - for (auto const& process : this->AllocatedHardware) { - std::string prefix = "CTEST_PROCESS_"; + for (auto const& process : this->AllocatedResources) { + std::string prefix = "CTEST_RESOURCE_GROUP_"; prefix += std::to_string(i); std::string resourceList = prefix + '='; prefix += '_'; diff --git a/Source/CTest/cmCTestRunTest.h b/Source/CTest/cmCTestRunTest.h index 085a6b8..f781c7a 100644 --- a/Source/CTest/cmCTestRunTest.h +++ b/Source/CTest/cmCTestRunTest.h @@ -84,14 +84,17 @@ public: bool TimedOutForStopTime() const { return this->TimeoutIsForStopTime; } - void SetUseAllocatedHardware(bool use) { this->UseAllocatedHardware = use; } - void SetAllocatedHardware( + void SetUseAllocatedResources(bool use) + { + this->UseAllocatedResources = use; + } + void SetAllocatedResources( const std::vector< std::map<std::string, - std::vector<cmCTestMultiProcessHandler::HardwareAllocation>>>& - hardware) + std::vector<cmCTestMultiProcessHandler::ResourceAllocation>>>& + resources) { - this->AllocatedHardware = hardware; + this->AllocatedResources = resources; } private: @@ -105,7 +108,7 @@ private: // Run post processing of the process output for MemCheck void MemCheckPostProcess(); - void SetupHardwareEnvironment(); + void SetupResourcesEnvironment(); // Returns "completed/total Test #Index: " std::string GetTestPrefix(size_t completed, size_t total) const; @@ -125,10 +128,10 @@ private: std::string StartTime; std::string ActualCommand; std::vector<std::string> Arguments; - bool UseAllocatedHardware = false; + bool UseAllocatedResources = false; std::vector<std::map< - std::string, std::vector<cmCTestMultiProcessHandler::HardwareAllocation>>> - AllocatedHardware; + std::string, std::vector<cmCTestMultiProcessHandler::ResourceAllocation>>> + AllocatedResources; bool RunUntilFail; int NumberOfRunsLeft; bool RunAgain; diff --git a/Source/CTest/cmCTestTestCommand.cxx b/Source/CTest/cmCTestTestCommand.cxx index 5496353..9784214 100644 --- a/Source/CTest/cmCTestTestCommand.cxx +++ b/Source/CTest/cmCTestTestCommand.cxx @@ -32,7 +32,7 @@ void cmCTestTestCommand::BindArguments() this->Bind("SCHEDULE_RANDOM"_s, this->ScheduleRandom); this->Bind("STOP_TIME"_s, this->StopTime); this->Bind("TEST_LOAD"_s, this->TestLoad); - this->Bind("HARDWARE_SPEC_FILE"_s, this->HardwareSpecFile); + this->Bind("RESOURCE_SPEC_FILE"_s, this->ResourceSpecFile); } cmCTestGenericHandler* cmCTestTestCommand::InitializeHandler() @@ -88,8 +88,8 @@ cmCTestGenericHandler* cmCTestTestCommand::InitializeHandler() if (!this->ScheduleRandom.empty()) { handler->SetOption("ScheduleRandom", this->ScheduleRandom.c_str()); } - if (!this->HardwareSpecFile.empty()) { - handler->SetOption("HardwareSpecFile", this->HardwareSpecFile.c_str()); + if (!this->ResourceSpecFile.empty()) { + handler->SetOption("ResourceSpecFile", this->ResourceSpecFile.c_str()); } if (!this->StopTime.empty()) { this->CTest->SetStopTime(this->StopTime); diff --git a/Source/CTest/cmCTestTestCommand.h b/Source/CTest/cmCTestTestCommand.h index dc15279..4019694 100644 --- a/Source/CTest/cmCTestTestCommand.h +++ b/Source/CTest/cmCTestTestCommand.h @@ -58,7 +58,7 @@ protected: std::string ScheduleRandom; std::string StopTime; std::string TestLoad; - std::string HardwareSpecFile; + std::string ResourceSpecFile; }; #endif diff --git a/Source/CTest/cmCTestTestHandler.cxx b/Source/CTest/cmCTestTestHandler.cxx index 2be62ae..8e3ac22 100644 --- a/Source/CTest/cmCTestTestHandler.cxx +++ b/Source/CTest/cmCTestTestHandler.cxx @@ -29,7 +29,7 @@ #include "cmAlgorithms.h" #include "cmCTest.h" #include "cmCTestMultiProcessHandler.h" -#include "cmCTestProcessesLexerHelper.h" +#include "cmCTestResourceGroupsLexerHelper.h" #include "cmDuration.h" #include "cmExecutionStatus.h" #include "cmGeneratedFileStream.h" @@ -289,7 +289,7 @@ cmCTestTestHandler::cmCTestTestHandler() this->UseIncludeRegExpFlag = false; this->UseExcludeRegExpFlag = false; this->UseExcludeRegExpFirst = false; - this->UseHardwareSpec = false; + this->UseResourceSpec = false; this->CustomMaximumPassedTestOutputSize = 1 * 1024; this->CustomMaximumFailedTestOutputSize = 300 * 1024; @@ -510,12 +510,12 @@ bool cmCTestTestHandler::ProcessOptions() } this->SetRerunFailed(cmIsOn(this->GetOption("RerunFailed"))); - val = this->GetOption("HardwareSpecFile"); + val = this->GetOption("ResourceSpecFile"); if (val) { - this->UseHardwareSpec = true; - if (!this->HardwareSpec.ReadFromJSONFile(val)) { + this->UseResourceSpec = true; + if (!this->ResourceSpec.ReadFromJSONFile(val)) { cmCTestLog(this->CTest, ERROR_MESSAGE, - "Could not read hardware spec file: " << val << std::endl); + "Could not read resource spec file: " << val << std::endl); return false; } } @@ -1237,8 +1237,8 @@ void cmCTestTestHandler::ProcessDirectory(std::vector<std::string>& passed, } else { parallel->SetTestLoad(this->CTest->GetTestLoad()); } - if (this->UseHardwareSpec) { - parallel->InitHardwareAllocator(this->HardwareSpec); + if (this->UseResourceSpec) { + parallel->InitResourceAllocator(this->ResourceSpec); } *this->LogFile @@ -1283,7 +1283,7 @@ void cmCTestTestHandler::ProcessDirectory(std::vector<std::string>& passed, parallel->SetPassFailVectors(&passed, &failed); this->TestResults.clear(); parallel->SetTestResults(&this->TestResults); - parallel->CheckHardwareAvailable(); + parallel->CheckResourcesAvailable(); if (this->CTest->ShouldPrintLabels()) { parallel->PrintLabels(); @@ -1626,11 +1626,11 @@ std::string cmCTestTestHandler::FindExecutable( return fullPath; } -bool cmCTestTestHandler::ParseProcessesProperty( +bool cmCTestTestHandler::ParseResourceGroupsProperty( const std::string& val, - std::vector<std::vector<cmCTestTestResourceRequirement>>& processes) + std::vector<std::vector<cmCTestTestResourceRequirement>>& resourceGroups) { - cmCTestProcessesLexerHelper lexer(processes); + cmCTestResourceGroupsLexerHelper lexer(resourceGroups); return lexer.ParseString(val); } @@ -2203,8 +2203,8 @@ bool cmCTestTestHandler::SetTestsProperties( if (key == "PROCESSOR_AFFINITY") { rt.WantAffinity = cmIsOn(val); } - if (key == "PROCESSES") { - if (!ParseProcessesProperty(val, rt.Processes)) { + if (key == "RESOURCE_GROUPS") { + if (!ParseResourceGroupsProperty(val, rt.ResourceGroups)) { return false; } } diff --git a/Source/CTest/cmCTestTestHandler.h b/Source/CTest/cmCTestTestHandler.h index 525215c..eab75d0 100644 --- a/Source/CTest/cmCTestTestHandler.h +++ b/Source/CTest/cmCTestTestHandler.h @@ -19,7 +19,7 @@ #include "cmsys/RegularExpression.hxx" #include "cmCTestGenericHandler.h" -#include "cmCTestHardwareSpec.h" +#include "cmCTestResourceSpec.h" #include "cmDuration.h" #include "cmListFileCache.h" @@ -158,7 +158,7 @@ public: std::set<std::string> FixturesCleanup; std::set<std::string> FixturesRequired; std::set<std::string> RequireSuccessDepends; - std::vector<std::vector<cmCTestTestResourceRequirement>> Processes; + std::vector<std::vector<cmCTestTestResourceRequirement>> ResourceGroups; // Private test generator properties used to track backtraces cmListFileBacktrace Backtrace; }; @@ -202,9 +202,9 @@ public: std::vector<std::string>& extraPaths, std::vector<std::string>& failed); - static bool ParseProcessesProperty( + static bool ParseResourceGroupsProperty( const std::string& val, - std::vector<std::vector<cmCTestTestResourceRequirement>>& processes); + std::vector<std::vector<cmCTestTestResourceRequirement>>& resourceGroups); using ListOfTests = std::vector<cmCTestTestProperties>; @@ -336,8 +336,8 @@ private: cmsys::RegularExpression IncludeTestsRegularExpression; cmsys::RegularExpression ExcludeTestsRegularExpression; - bool UseHardwareSpec; - cmCTestHardwareSpec HardwareSpec; + bool UseResourceSpec; + cmCTestResourceSpec ResourceSpec; void GenerateRegressionImages(cmXMLWriter& xml, const std::string& dart); cmsys::RegularExpression DartStuff1; diff --git a/Source/LexerParser/.gitattributes b/Source/LexerParser/.gitattributes index e5a1d8b..bf70249 100644 --- a/Source/LexerParser/.gitattributes +++ b/Source/LexerParser/.gitattributes @@ -2,8 +2,8 @@ /cmCommandArgumentLexer.h generated /cmCommandArgumentParser.cxx generated /cmCommandArgumentParserTokens.h generated -/cmCTestProcessesLexer.cxx generated -/cmCTestProcessesLexer.h generated +/cmCTestResourceGroupsLexer.cxx generated +/cmCTestResourceGroupsLexer.h generated /cmDependsJavaLexer.cxx generated /cmDependsJavaLexer.h generated /cmDependsJavaParser.cxx generated diff --git a/Source/LexerParser/cmCTestProcessesLexer.cxx b/Source/LexerParser/cmCTestResourceGroupsLexer.cxx index 2a5dab3..de07c46 100644 --- a/Source/LexerParser/cmCTestProcessesLexer.cxx +++ b/Source/LexerParser/cmCTestResourceGroupsLexer.cxx @@ -14,213 +14,213 @@ #endif #ifdef yy_create_buffer -#define cmCTestProcesses_yy_create_buffer_ALREADY_DEFINED +#define cmCTestResourceGroups_yy_create_buffer_ALREADY_DEFINED #else -#define yy_create_buffer cmCTestProcesses_yy_create_buffer +#define yy_create_buffer cmCTestResourceGroups_yy_create_buffer #endif #ifdef yy_delete_buffer -#define cmCTestProcesses_yy_delete_buffer_ALREADY_DEFINED +#define cmCTestResourceGroups_yy_delete_buffer_ALREADY_DEFINED #else -#define yy_delete_buffer cmCTestProcesses_yy_delete_buffer +#define yy_delete_buffer cmCTestResourceGroups_yy_delete_buffer #endif #ifdef yy_scan_buffer -#define cmCTestProcesses_yy_scan_buffer_ALREADY_DEFINED +#define cmCTestResourceGroups_yy_scan_buffer_ALREADY_DEFINED #else -#define yy_scan_buffer cmCTestProcesses_yy_scan_buffer +#define yy_scan_buffer cmCTestResourceGroups_yy_scan_buffer #endif #ifdef yy_scan_string -#define cmCTestProcesses_yy_scan_string_ALREADY_DEFINED +#define cmCTestResourceGroups_yy_scan_string_ALREADY_DEFINED #else -#define yy_scan_string cmCTestProcesses_yy_scan_string +#define yy_scan_string cmCTestResourceGroups_yy_scan_string #endif #ifdef yy_scan_bytes -#define cmCTestProcesses_yy_scan_bytes_ALREADY_DEFINED +#define cmCTestResourceGroups_yy_scan_bytes_ALREADY_DEFINED #else -#define yy_scan_bytes cmCTestProcesses_yy_scan_bytes +#define yy_scan_bytes cmCTestResourceGroups_yy_scan_bytes #endif #ifdef yy_init_buffer -#define cmCTestProcesses_yy_init_buffer_ALREADY_DEFINED +#define cmCTestResourceGroups_yy_init_buffer_ALREADY_DEFINED #else -#define yy_init_buffer cmCTestProcesses_yy_init_buffer +#define yy_init_buffer cmCTestResourceGroups_yy_init_buffer #endif #ifdef yy_flush_buffer -#define cmCTestProcesses_yy_flush_buffer_ALREADY_DEFINED +#define cmCTestResourceGroups_yy_flush_buffer_ALREADY_DEFINED #else -#define yy_flush_buffer cmCTestProcesses_yy_flush_buffer +#define yy_flush_buffer cmCTestResourceGroups_yy_flush_buffer #endif #ifdef yy_load_buffer_state -#define cmCTestProcesses_yy_load_buffer_state_ALREADY_DEFINED +#define cmCTestResourceGroups_yy_load_buffer_state_ALREADY_DEFINED #else -#define yy_load_buffer_state cmCTestProcesses_yy_load_buffer_state +#define yy_load_buffer_state cmCTestResourceGroups_yy_load_buffer_state #endif #ifdef yy_switch_to_buffer -#define cmCTestProcesses_yy_switch_to_buffer_ALREADY_DEFINED +#define cmCTestResourceGroups_yy_switch_to_buffer_ALREADY_DEFINED #else -#define yy_switch_to_buffer cmCTestProcesses_yy_switch_to_buffer +#define yy_switch_to_buffer cmCTestResourceGroups_yy_switch_to_buffer #endif #ifdef yypush_buffer_state -#define cmCTestProcesses_yypush_buffer_state_ALREADY_DEFINED +#define cmCTestResourceGroups_yypush_buffer_state_ALREADY_DEFINED #else -#define yypush_buffer_state cmCTestProcesses_yypush_buffer_state +#define yypush_buffer_state cmCTestResourceGroups_yypush_buffer_state #endif #ifdef yypop_buffer_state -#define cmCTestProcesses_yypop_buffer_state_ALREADY_DEFINED +#define cmCTestResourceGroups_yypop_buffer_state_ALREADY_DEFINED #else -#define yypop_buffer_state cmCTestProcesses_yypop_buffer_state +#define yypop_buffer_state cmCTestResourceGroups_yypop_buffer_state #endif #ifdef yyensure_buffer_stack -#define cmCTestProcesses_yyensure_buffer_stack_ALREADY_DEFINED +#define cmCTestResourceGroups_yyensure_buffer_stack_ALREADY_DEFINED #else -#define yyensure_buffer_stack cmCTestProcesses_yyensure_buffer_stack +#define yyensure_buffer_stack cmCTestResourceGroups_yyensure_buffer_stack #endif #ifdef yylex -#define cmCTestProcesses_yylex_ALREADY_DEFINED +#define cmCTestResourceGroups_yylex_ALREADY_DEFINED #else -#define yylex cmCTestProcesses_yylex +#define yylex cmCTestResourceGroups_yylex #endif #ifdef yyrestart -#define cmCTestProcesses_yyrestart_ALREADY_DEFINED +#define cmCTestResourceGroups_yyrestart_ALREADY_DEFINED #else -#define yyrestart cmCTestProcesses_yyrestart +#define yyrestart cmCTestResourceGroups_yyrestart #endif #ifdef yylex_init -#define cmCTestProcesses_yylex_init_ALREADY_DEFINED +#define cmCTestResourceGroups_yylex_init_ALREADY_DEFINED #else -#define yylex_init cmCTestProcesses_yylex_init +#define yylex_init cmCTestResourceGroups_yylex_init #endif #ifdef yylex_init_extra -#define cmCTestProcesses_yylex_init_extra_ALREADY_DEFINED +#define cmCTestResourceGroups_yylex_init_extra_ALREADY_DEFINED #else -#define yylex_init_extra cmCTestProcesses_yylex_init_extra +#define yylex_init_extra cmCTestResourceGroups_yylex_init_extra #endif #ifdef yylex_destroy -#define cmCTestProcesses_yylex_destroy_ALREADY_DEFINED +#define cmCTestResourceGroups_yylex_destroy_ALREADY_DEFINED #else -#define yylex_destroy cmCTestProcesses_yylex_destroy +#define yylex_destroy cmCTestResourceGroups_yylex_destroy #endif #ifdef yyget_debug -#define cmCTestProcesses_yyget_debug_ALREADY_DEFINED +#define cmCTestResourceGroups_yyget_debug_ALREADY_DEFINED #else -#define yyget_debug cmCTestProcesses_yyget_debug +#define yyget_debug cmCTestResourceGroups_yyget_debug #endif #ifdef yyset_debug -#define cmCTestProcesses_yyset_debug_ALREADY_DEFINED +#define cmCTestResourceGroups_yyset_debug_ALREADY_DEFINED #else -#define yyset_debug cmCTestProcesses_yyset_debug +#define yyset_debug cmCTestResourceGroups_yyset_debug #endif #ifdef yyget_extra -#define cmCTestProcesses_yyget_extra_ALREADY_DEFINED +#define cmCTestResourceGroups_yyget_extra_ALREADY_DEFINED #else -#define yyget_extra cmCTestProcesses_yyget_extra +#define yyget_extra cmCTestResourceGroups_yyget_extra #endif #ifdef yyset_extra -#define cmCTestProcesses_yyset_extra_ALREADY_DEFINED +#define cmCTestResourceGroups_yyset_extra_ALREADY_DEFINED #else -#define yyset_extra cmCTestProcesses_yyset_extra +#define yyset_extra cmCTestResourceGroups_yyset_extra #endif #ifdef yyget_in -#define cmCTestProcesses_yyget_in_ALREADY_DEFINED +#define cmCTestResourceGroups_yyget_in_ALREADY_DEFINED #else -#define yyget_in cmCTestProcesses_yyget_in +#define yyget_in cmCTestResourceGroups_yyget_in #endif #ifdef yyset_in -#define cmCTestProcesses_yyset_in_ALREADY_DEFINED +#define cmCTestResourceGroups_yyset_in_ALREADY_DEFINED #else -#define yyset_in cmCTestProcesses_yyset_in +#define yyset_in cmCTestResourceGroups_yyset_in #endif #ifdef yyget_out -#define cmCTestProcesses_yyget_out_ALREADY_DEFINED +#define cmCTestResourceGroups_yyget_out_ALREADY_DEFINED #else -#define yyget_out cmCTestProcesses_yyget_out +#define yyget_out cmCTestResourceGroups_yyget_out #endif #ifdef yyset_out -#define cmCTestProcesses_yyset_out_ALREADY_DEFINED +#define cmCTestResourceGroups_yyset_out_ALREADY_DEFINED #else -#define yyset_out cmCTestProcesses_yyset_out +#define yyset_out cmCTestResourceGroups_yyset_out #endif #ifdef yyget_leng -#define cmCTestProcesses_yyget_leng_ALREADY_DEFINED +#define cmCTestResourceGroups_yyget_leng_ALREADY_DEFINED #else -#define yyget_leng cmCTestProcesses_yyget_leng +#define yyget_leng cmCTestResourceGroups_yyget_leng #endif #ifdef yyget_text -#define cmCTestProcesses_yyget_text_ALREADY_DEFINED +#define cmCTestResourceGroups_yyget_text_ALREADY_DEFINED #else -#define yyget_text cmCTestProcesses_yyget_text +#define yyget_text cmCTestResourceGroups_yyget_text #endif #ifdef yyget_lineno -#define cmCTestProcesses_yyget_lineno_ALREADY_DEFINED +#define cmCTestResourceGroups_yyget_lineno_ALREADY_DEFINED #else -#define yyget_lineno cmCTestProcesses_yyget_lineno +#define yyget_lineno cmCTestResourceGroups_yyget_lineno #endif #ifdef yyset_lineno -#define cmCTestProcesses_yyset_lineno_ALREADY_DEFINED +#define cmCTestResourceGroups_yyset_lineno_ALREADY_DEFINED #else -#define yyset_lineno cmCTestProcesses_yyset_lineno +#define yyset_lineno cmCTestResourceGroups_yyset_lineno #endif #ifdef yyget_column -#define cmCTestProcesses_yyget_column_ALREADY_DEFINED +#define cmCTestResourceGroups_yyget_column_ALREADY_DEFINED #else -#define yyget_column cmCTestProcesses_yyget_column +#define yyget_column cmCTestResourceGroups_yyget_column #endif #ifdef yyset_column -#define cmCTestProcesses_yyset_column_ALREADY_DEFINED +#define cmCTestResourceGroups_yyset_column_ALREADY_DEFINED #else -#define yyset_column cmCTestProcesses_yyset_column +#define yyset_column cmCTestResourceGroups_yyset_column #endif #ifdef yywrap -#define cmCTestProcesses_yywrap_ALREADY_DEFINED +#define cmCTestResourceGroups_yywrap_ALREADY_DEFINED #else -#define yywrap cmCTestProcesses_yywrap +#define yywrap cmCTestResourceGroups_yywrap #endif #ifdef yyalloc -#define cmCTestProcesses_yyalloc_ALREADY_DEFINED +#define cmCTestResourceGroups_yyalloc_ALREADY_DEFINED #else -#define yyalloc cmCTestProcesses_yyalloc +#define yyalloc cmCTestResourceGroups_yyalloc #endif #ifdef yyrealloc -#define cmCTestProcesses_yyrealloc_ALREADY_DEFINED +#define cmCTestResourceGroups_yyrealloc_ALREADY_DEFINED #else -#define yyrealloc cmCTestProcesses_yyrealloc +#define yyrealloc cmCTestResourceGroups_yyrealloc #endif #ifdef yyfree -#define cmCTestProcesses_yyfree_ALREADY_DEFINED +#define cmCTestResourceGroups_yyfree_ALREADY_DEFINED #else -#define yyfree cmCTestProcesses_yyfree +#define yyfree cmCTestResourceGroups_yyfree #endif /* First, we deal with platform-specific or compiler-specific issues. */ @@ -526,7 +526,7 @@ void yyfree ( void * , yyscan_t yyscanner ); /* Begin user sect3 */ -#define cmCTestProcesses_yywrap(yyscanner) (/*CONSTCOND*/1) +#define cmCTestResourceGroups_yywrap(yyscanner) (/*CONSTCOND*/1) #define YY_SKIP_YYWRAP typedef flex_uint8_t YY_CHAR; @@ -648,12 +648,12 @@ This file must be translated to C++ and modified to build everywhere. Run flex >= 2.6 like this: - flex --nounistd -DFLEXINT_H --noline --header-file=cmCTestProcessesLexer.h -ocmCTestProcessesLexer.cxx cmCTestProcessesLexer.in.l + flex --nounistd -DFLEXINT_H --noline --header-file=cmCTestResourceGroupsLexer.h -ocmCTestResourceGroupsLexer.cxx cmCTestResourceGroupsLexer.in.l -Modify cmCTestProcessesLexer.cxx: - - remove trailing whitespace: sed -i 's/\s*$//' cmCTestProcessesLexer.h cmCTestProcessesLexer.cxx - - remove blank lines at end of file: sed -i '${/^$/d;}' cmCTestProcessesLexer.h cmCTestProcessesLexer.cxx - - #include "cmStandardLexer.h" at the top: sed -i '1i#include "cmStandardLexer.h"' cmCTestProcessesLexer.cxx +Modify cmCTestResourceGroupsLexer.cxx: + - remove trailing whitespace: sed -i 's/\s*$//' cmCTestResourceGroupsLexer.h cmCTestResourceGroupsLexer.cxx + - remove blank lines at end of file: sed -i '${/^$/d;}' cmCTestResourceGroupsLexer.h cmCTestResourceGroupsLexer.cxx + - #include "cmStandardLexer.h" at the top: sed -i '1i#include "cmStandardLexer.h"' cmCTestResourceGroupsLexer.cxx */ @@ -661,7 +661,7 @@ Modify cmCTestProcessesLexer.cxx: #ifndef __clang_analyzer__ /* Suppress clang scan-build warnings */ -#include "cmCTestProcessesLexerHelper.h" +#include "cmCTestResourceGroupsLexerHelper.h" #include <string> @@ -670,8 +670,8 @@ Modify cmCTestProcessesLexer.cxx: /*--------------------------------------------------------------------------*/ #define INITIAL 0 -#define PROCESSES_START 1 -#define PROCESSES_END 2 +#define RESOURCE_GROUPS_START 1 +#define RESOURCE_GROUPS_END 2 #define RESOURCE_START 3 #define RESOURCE_COUNT 4 #define RESOURCE_END 5 @@ -990,7 +990,7 @@ YY_RULE_SETUP case 2: YY_RULE_SETUP { - BEGIN(PROCESSES_END); + BEGIN(RESOURCE_GROUPS_END); std::size_t len = yyleng; yyextra->SetProcessCount(std::stoll(yytext, &len, 10)); } @@ -1013,18 +1013,18 @@ YY_RULE_SETUP case 5: YY_RULE_SETUP { - BEGIN(PROCESSES_START); + BEGIN(RESOURCE_GROUPS_START); } YY_BREAK case 6: YY_RULE_SETUP { - BEGIN(PROCESSES_START); + BEGIN(RESOURCE_GROUPS_START); yyextra->WriteProcess(); } YY_BREAK case YY_STATE_EOF(RESOURCE_START): -case YY_STATE_EOF(PROCESSES_END): +case YY_STATE_EOF(RESOURCE_GROUPS_END): case YY_STATE_EOF(RESOURCE_END): { yyextra->WriteProcess(); @@ -1032,7 +1032,7 @@ case YY_STATE_EOF(RESOURCE_END): } YY_BREAK case YY_STATE_EOF(INITIAL): -case YY_STATE_EOF(PROCESSES_START): +case YY_STATE_EOF(RESOURCE_GROUPS_START): { return 0; } diff --git a/Source/LexerParser/cmCTestProcessesLexer.h b/Source/LexerParser/cmCTestResourceGroupsLexer.h index b6437b4..e323a50 100644 --- a/Source/LexerParser/cmCTestProcessesLexer.h +++ b/Source/LexerParser/cmCTestResourceGroupsLexer.h @@ -1,6 +1,6 @@ -#ifndef cmCTestProcesses_yyHEADER_H -#define cmCTestProcesses_yyHEADER_H 1 -#define cmCTestProcesses_yyIN_HEADER 1 +#ifndef cmCTestResourceGroups_yyHEADER_H +#define cmCTestResourceGroups_yyHEADER_H 1 +#define cmCTestResourceGroups_yyIN_HEADER 1 #define FLEXINT_H 1 #define YY_INT_ALIGNED short int @@ -16,213 +16,213 @@ #endif #ifdef yy_create_buffer -#define cmCTestProcesses_yy_create_buffer_ALREADY_DEFINED +#define cmCTestResourceGroups_yy_create_buffer_ALREADY_DEFINED #else -#define yy_create_buffer cmCTestProcesses_yy_create_buffer +#define yy_create_buffer cmCTestResourceGroups_yy_create_buffer #endif #ifdef yy_delete_buffer -#define cmCTestProcesses_yy_delete_buffer_ALREADY_DEFINED +#define cmCTestResourceGroups_yy_delete_buffer_ALREADY_DEFINED #else -#define yy_delete_buffer cmCTestProcesses_yy_delete_buffer +#define yy_delete_buffer cmCTestResourceGroups_yy_delete_buffer #endif #ifdef yy_scan_buffer -#define cmCTestProcesses_yy_scan_buffer_ALREADY_DEFINED +#define cmCTestResourceGroups_yy_scan_buffer_ALREADY_DEFINED #else -#define yy_scan_buffer cmCTestProcesses_yy_scan_buffer +#define yy_scan_buffer cmCTestResourceGroups_yy_scan_buffer #endif #ifdef yy_scan_string -#define cmCTestProcesses_yy_scan_string_ALREADY_DEFINED +#define cmCTestResourceGroups_yy_scan_string_ALREADY_DEFINED #else -#define yy_scan_string cmCTestProcesses_yy_scan_string +#define yy_scan_string cmCTestResourceGroups_yy_scan_string #endif #ifdef yy_scan_bytes -#define cmCTestProcesses_yy_scan_bytes_ALREADY_DEFINED +#define cmCTestResourceGroups_yy_scan_bytes_ALREADY_DEFINED #else -#define yy_scan_bytes cmCTestProcesses_yy_scan_bytes +#define yy_scan_bytes cmCTestResourceGroups_yy_scan_bytes #endif #ifdef yy_init_buffer -#define cmCTestProcesses_yy_init_buffer_ALREADY_DEFINED +#define cmCTestResourceGroups_yy_init_buffer_ALREADY_DEFINED #else -#define yy_init_buffer cmCTestProcesses_yy_init_buffer +#define yy_init_buffer cmCTestResourceGroups_yy_init_buffer #endif #ifdef yy_flush_buffer -#define cmCTestProcesses_yy_flush_buffer_ALREADY_DEFINED +#define cmCTestResourceGroups_yy_flush_buffer_ALREADY_DEFINED #else -#define yy_flush_buffer cmCTestProcesses_yy_flush_buffer +#define yy_flush_buffer cmCTestResourceGroups_yy_flush_buffer #endif #ifdef yy_load_buffer_state -#define cmCTestProcesses_yy_load_buffer_state_ALREADY_DEFINED +#define cmCTestResourceGroups_yy_load_buffer_state_ALREADY_DEFINED #else -#define yy_load_buffer_state cmCTestProcesses_yy_load_buffer_state +#define yy_load_buffer_state cmCTestResourceGroups_yy_load_buffer_state #endif #ifdef yy_switch_to_buffer -#define cmCTestProcesses_yy_switch_to_buffer_ALREADY_DEFINED +#define cmCTestResourceGroups_yy_switch_to_buffer_ALREADY_DEFINED #else -#define yy_switch_to_buffer cmCTestProcesses_yy_switch_to_buffer +#define yy_switch_to_buffer cmCTestResourceGroups_yy_switch_to_buffer #endif #ifdef yypush_buffer_state -#define cmCTestProcesses_yypush_buffer_state_ALREADY_DEFINED +#define cmCTestResourceGroups_yypush_buffer_state_ALREADY_DEFINED #else -#define yypush_buffer_state cmCTestProcesses_yypush_buffer_state +#define yypush_buffer_state cmCTestResourceGroups_yypush_buffer_state #endif #ifdef yypop_buffer_state -#define cmCTestProcesses_yypop_buffer_state_ALREADY_DEFINED +#define cmCTestResourceGroups_yypop_buffer_state_ALREADY_DEFINED #else -#define yypop_buffer_state cmCTestProcesses_yypop_buffer_state +#define yypop_buffer_state cmCTestResourceGroups_yypop_buffer_state #endif #ifdef yyensure_buffer_stack -#define cmCTestProcesses_yyensure_buffer_stack_ALREADY_DEFINED +#define cmCTestResourceGroups_yyensure_buffer_stack_ALREADY_DEFINED #else -#define yyensure_buffer_stack cmCTestProcesses_yyensure_buffer_stack +#define yyensure_buffer_stack cmCTestResourceGroups_yyensure_buffer_stack #endif #ifdef yylex -#define cmCTestProcesses_yylex_ALREADY_DEFINED +#define cmCTestResourceGroups_yylex_ALREADY_DEFINED #else -#define yylex cmCTestProcesses_yylex +#define yylex cmCTestResourceGroups_yylex #endif #ifdef yyrestart -#define cmCTestProcesses_yyrestart_ALREADY_DEFINED +#define cmCTestResourceGroups_yyrestart_ALREADY_DEFINED #else -#define yyrestart cmCTestProcesses_yyrestart +#define yyrestart cmCTestResourceGroups_yyrestart #endif #ifdef yylex_init -#define cmCTestProcesses_yylex_init_ALREADY_DEFINED +#define cmCTestResourceGroups_yylex_init_ALREADY_DEFINED #else -#define yylex_init cmCTestProcesses_yylex_init +#define yylex_init cmCTestResourceGroups_yylex_init #endif #ifdef yylex_init_extra -#define cmCTestProcesses_yylex_init_extra_ALREADY_DEFINED +#define cmCTestResourceGroups_yylex_init_extra_ALREADY_DEFINED #else -#define yylex_init_extra cmCTestProcesses_yylex_init_extra +#define yylex_init_extra cmCTestResourceGroups_yylex_init_extra #endif #ifdef yylex_destroy -#define cmCTestProcesses_yylex_destroy_ALREADY_DEFINED +#define cmCTestResourceGroups_yylex_destroy_ALREADY_DEFINED #else -#define yylex_destroy cmCTestProcesses_yylex_destroy +#define yylex_destroy cmCTestResourceGroups_yylex_destroy #endif #ifdef yyget_debug -#define cmCTestProcesses_yyget_debug_ALREADY_DEFINED +#define cmCTestResourceGroups_yyget_debug_ALREADY_DEFINED #else -#define yyget_debug cmCTestProcesses_yyget_debug +#define yyget_debug cmCTestResourceGroups_yyget_debug #endif #ifdef yyset_debug -#define cmCTestProcesses_yyset_debug_ALREADY_DEFINED +#define cmCTestResourceGroups_yyset_debug_ALREADY_DEFINED #else -#define yyset_debug cmCTestProcesses_yyset_debug +#define yyset_debug cmCTestResourceGroups_yyset_debug #endif #ifdef yyget_extra -#define cmCTestProcesses_yyget_extra_ALREADY_DEFINED +#define cmCTestResourceGroups_yyget_extra_ALREADY_DEFINED #else -#define yyget_extra cmCTestProcesses_yyget_extra +#define yyget_extra cmCTestResourceGroups_yyget_extra #endif #ifdef yyset_extra -#define cmCTestProcesses_yyset_extra_ALREADY_DEFINED +#define cmCTestResourceGroups_yyset_extra_ALREADY_DEFINED #else -#define yyset_extra cmCTestProcesses_yyset_extra +#define yyset_extra cmCTestResourceGroups_yyset_extra #endif #ifdef yyget_in -#define cmCTestProcesses_yyget_in_ALREADY_DEFINED +#define cmCTestResourceGroups_yyget_in_ALREADY_DEFINED #else -#define yyget_in cmCTestProcesses_yyget_in +#define yyget_in cmCTestResourceGroups_yyget_in #endif #ifdef yyset_in -#define cmCTestProcesses_yyset_in_ALREADY_DEFINED +#define cmCTestResourceGroups_yyset_in_ALREADY_DEFINED #else -#define yyset_in cmCTestProcesses_yyset_in +#define yyset_in cmCTestResourceGroups_yyset_in #endif #ifdef yyget_out -#define cmCTestProcesses_yyget_out_ALREADY_DEFINED +#define cmCTestResourceGroups_yyget_out_ALREADY_DEFINED #else -#define yyget_out cmCTestProcesses_yyget_out +#define yyget_out cmCTestResourceGroups_yyget_out #endif #ifdef yyset_out -#define cmCTestProcesses_yyset_out_ALREADY_DEFINED +#define cmCTestResourceGroups_yyset_out_ALREADY_DEFINED #else -#define yyset_out cmCTestProcesses_yyset_out +#define yyset_out cmCTestResourceGroups_yyset_out #endif #ifdef yyget_leng -#define cmCTestProcesses_yyget_leng_ALREADY_DEFINED +#define cmCTestResourceGroups_yyget_leng_ALREADY_DEFINED #else -#define yyget_leng cmCTestProcesses_yyget_leng +#define yyget_leng cmCTestResourceGroups_yyget_leng #endif #ifdef yyget_text -#define cmCTestProcesses_yyget_text_ALREADY_DEFINED +#define cmCTestResourceGroups_yyget_text_ALREADY_DEFINED #else -#define yyget_text cmCTestProcesses_yyget_text +#define yyget_text cmCTestResourceGroups_yyget_text #endif #ifdef yyget_lineno -#define cmCTestProcesses_yyget_lineno_ALREADY_DEFINED +#define cmCTestResourceGroups_yyget_lineno_ALREADY_DEFINED #else -#define yyget_lineno cmCTestProcesses_yyget_lineno +#define yyget_lineno cmCTestResourceGroups_yyget_lineno #endif #ifdef yyset_lineno -#define cmCTestProcesses_yyset_lineno_ALREADY_DEFINED +#define cmCTestResourceGroups_yyset_lineno_ALREADY_DEFINED #else -#define yyset_lineno cmCTestProcesses_yyset_lineno +#define yyset_lineno cmCTestResourceGroups_yyset_lineno #endif #ifdef yyget_column -#define cmCTestProcesses_yyget_column_ALREADY_DEFINED +#define cmCTestResourceGroups_yyget_column_ALREADY_DEFINED #else -#define yyget_column cmCTestProcesses_yyget_column +#define yyget_column cmCTestResourceGroups_yyget_column #endif #ifdef yyset_column -#define cmCTestProcesses_yyset_column_ALREADY_DEFINED +#define cmCTestResourceGroups_yyset_column_ALREADY_DEFINED #else -#define yyset_column cmCTestProcesses_yyset_column +#define yyset_column cmCTestResourceGroups_yyset_column #endif #ifdef yywrap -#define cmCTestProcesses_yywrap_ALREADY_DEFINED +#define cmCTestResourceGroups_yywrap_ALREADY_DEFINED #else -#define yywrap cmCTestProcesses_yywrap +#define yywrap cmCTestResourceGroups_yywrap #endif #ifdef yyalloc -#define cmCTestProcesses_yyalloc_ALREADY_DEFINED +#define cmCTestResourceGroups_yyalloc_ALREADY_DEFINED #else -#define yyalloc cmCTestProcesses_yyalloc +#define yyalloc cmCTestResourceGroups_yyalloc #endif #ifdef yyrealloc -#define cmCTestProcesses_yyrealloc_ALREADY_DEFINED +#define cmCTestResourceGroups_yyrealloc_ALREADY_DEFINED #else -#define yyrealloc cmCTestProcesses_yyrealloc +#define yyrealloc cmCTestResourceGroups_yyrealloc #endif #ifdef yyfree -#define cmCTestProcesses_yyfree_ALREADY_DEFINED +#define cmCTestResourceGroups_yyfree_ALREADY_DEFINED #else -#define yyfree cmCTestProcesses_yyfree +#define yyfree cmCTestResourceGroups_yyfree #endif /* First, we deal with platform-specific or compiler-specific issues. */ @@ -423,15 +423,15 @@ void yyfree ( void * , yyscan_t yyscanner ); /* Begin user sect3 */ -#define cmCTestProcesses_yywrap(yyscanner) (/*CONSTCOND*/1) +#define cmCTestResourceGroups_yywrap(yyscanner) (/*CONSTCOND*/1) #define YY_SKIP_YYWRAP #define yytext_ptr yytext_r #ifdef YY_HEADER_EXPORT_START_CONDITIONS #define INITIAL 0 -#define PROCESSES_START 1 -#define PROCESSES_END 2 +#define RESOURCE_GROUPS_START 1 +#define RESOURCE_GROUPS_END 2 #define RESOURCE_START 3 #define RESOURCE_COUNT 4 #define RESOURCE_END 5 @@ -543,150 +543,150 @@ extern int yylex (yyscan_t yyscanner); #undef YY_DECL #endif -#ifndef cmCTestProcesses_yy_create_buffer_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yy_create_buffer_ALREADY_DEFINED #undef yy_create_buffer #endif -#ifndef cmCTestProcesses_yy_delete_buffer_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yy_delete_buffer_ALREADY_DEFINED #undef yy_delete_buffer #endif -#ifndef cmCTestProcesses_yy_scan_buffer_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yy_scan_buffer_ALREADY_DEFINED #undef yy_scan_buffer #endif -#ifndef cmCTestProcesses_yy_scan_string_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yy_scan_string_ALREADY_DEFINED #undef yy_scan_string #endif -#ifndef cmCTestProcesses_yy_scan_bytes_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yy_scan_bytes_ALREADY_DEFINED #undef yy_scan_bytes #endif -#ifndef cmCTestProcesses_yy_init_buffer_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yy_init_buffer_ALREADY_DEFINED #undef yy_init_buffer #endif -#ifndef cmCTestProcesses_yy_flush_buffer_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yy_flush_buffer_ALREADY_DEFINED #undef yy_flush_buffer #endif -#ifndef cmCTestProcesses_yy_load_buffer_state_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yy_load_buffer_state_ALREADY_DEFINED #undef yy_load_buffer_state #endif -#ifndef cmCTestProcesses_yy_switch_to_buffer_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yy_switch_to_buffer_ALREADY_DEFINED #undef yy_switch_to_buffer #endif -#ifndef cmCTestProcesses_yypush_buffer_state_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yypush_buffer_state_ALREADY_DEFINED #undef yypush_buffer_state #endif -#ifndef cmCTestProcesses_yypop_buffer_state_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yypop_buffer_state_ALREADY_DEFINED #undef yypop_buffer_state #endif -#ifndef cmCTestProcesses_yyensure_buffer_stack_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yyensure_buffer_stack_ALREADY_DEFINED #undef yyensure_buffer_stack #endif -#ifndef cmCTestProcesses_yylex_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yylex_ALREADY_DEFINED #undef yylex #endif -#ifndef cmCTestProcesses_yyrestart_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yyrestart_ALREADY_DEFINED #undef yyrestart #endif -#ifndef cmCTestProcesses_yylex_init_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yylex_init_ALREADY_DEFINED #undef yylex_init #endif -#ifndef cmCTestProcesses_yylex_init_extra_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yylex_init_extra_ALREADY_DEFINED #undef yylex_init_extra #endif -#ifndef cmCTestProcesses_yylex_destroy_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yylex_destroy_ALREADY_DEFINED #undef yylex_destroy #endif -#ifndef cmCTestProcesses_yyget_debug_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yyget_debug_ALREADY_DEFINED #undef yyget_debug #endif -#ifndef cmCTestProcesses_yyset_debug_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yyset_debug_ALREADY_DEFINED #undef yyset_debug #endif -#ifndef cmCTestProcesses_yyget_extra_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yyget_extra_ALREADY_DEFINED #undef yyget_extra #endif -#ifndef cmCTestProcesses_yyset_extra_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yyset_extra_ALREADY_DEFINED #undef yyset_extra #endif -#ifndef cmCTestProcesses_yyget_in_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yyget_in_ALREADY_DEFINED #undef yyget_in #endif -#ifndef cmCTestProcesses_yyset_in_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yyset_in_ALREADY_DEFINED #undef yyset_in #endif -#ifndef cmCTestProcesses_yyget_out_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yyget_out_ALREADY_DEFINED #undef yyget_out #endif -#ifndef cmCTestProcesses_yyset_out_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yyset_out_ALREADY_DEFINED #undef yyset_out #endif -#ifndef cmCTestProcesses_yyget_leng_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yyget_leng_ALREADY_DEFINED #undef yyget_leng #endif -#ifndef cmCTestProcesses_yyget_text_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yyget_text_ALREADY_DEFINED #undef yyget_text #endif -#ifndef cmCTestProcesses_yyget_lineno_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yyget_lineno_ALREADY_DEFINED #undef yyget_lineno #endif -#ifndef cmCTestProcesses_yyset_lineno_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yyset_lineno_ALREADY_DEFINED #undef yyset_lineno #endif -#ifndef cmCTestProcesses_yyget_column_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yyget_column_ALREADY_DEFINED #undef yyget_column #endif -#ifndef cmCTestProcesses_yyset_column_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yyset_column_ALREADY_DEFINED #undef yyset_column #endif -#ifndef cmCTestProcesses_yywrap_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yywrap_ALREADY_DEFINED #undef yywrap #endif -#ifndef cmCTestProcesses_yyget_lval_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yyget_lval_ALREADY_DEFINED #undef yyget_lval #endif -#ifndef cmCTestProcesses_yyset_lval_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yyset_lval_ALREADY_DEFINED #undef yyset_lval #endif -#ifndef cmCTestProcesses_yyget_lloc_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yyget_lloc_ALREADY_DEFINED #undef yyget_lloc #endif -#ifndef cmCTestProcesses_yyset_lloc_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yyset_lloc_ALREADY_DEFINED #undef yyset_lloc #endif -#ifndef cmCTestProcesses_yyalloc_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yyalloc_ALREADY_DEFINED #undef yyalloc #endif -#ifndef cmCTestProcesses_yyrealloc_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yyrealloc_ALREADY_DEFINED #undef yyrealloc #endif -#ifndef cmCTestProcesses_yyfree_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yyfree_ALREADY_DEFINED #undef yyfree #endif -#ifndef cmCTestProcesses_yytext_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yytext_ALREADY_DEFINED #undef yytext #endif -#ifndef cmCTestProcesses_yyleng_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yyleng_ALREADY_DEFINED #undef yyleng #endif -#ifndef cmCTestProcesses_yyin_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yyin_ALREADY_DEFINED #undef yyin #endif -#ifndef cmCTestProcesses_yyout_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yyout_ALREADY_DEFINED #undef yyout #endif -#ifndef cmCTestProcesses_yy_flex_debug_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yy_flex_debug_ALREADY_DEFINED #undef yy_flex_debug #endif -#ifndef cmCTestProcesses_yylineno_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yylineno_ALREADY_DEFINED #undef yylineno #endif -#ifndef cmCTestProcesses_yytables_fload_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yytables_fload_ALREADY_DEFINED #undef yytables_fload #endif -#ifndef cmCTestProcesses_yytables_destroy_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yytables_destroy_ALREADY_DEFINED #undef yytables_destroy #endif -#ifndef cmCTestProcesses_yyTABLES_NAME_ALREADY_DEFINED +#ifndef cmCTestResourceGroups_yyTABLES_NAME_ALREADY_DEFINED #undef yyTABLES_NAME #endif -#undef cmCTestProcesses_yyIN_HEADER -#endif /* cmCTestProcesses_yyHEADER_H */ +#undef cmCTestResourceGroups_yyIN_HEADER +#endif /* cmCTestResourceGroups_yyHEADER_H */ diff --git a/Source/LexerParser/cmCTestProcessesLexer.in.l b/Source/LexerParser/cmCTestResourceGroupsLexer.in.l index ef494d5..2aabea4 100644 --- a/Source/LexerParser/cmCTestProcessesLexer.in.l +++ b/Source/LexerParser/cmCTestResourceGroupsLexer.in.l @@ -7,12 +7,12 @@ This file must be translated to C++ and modified to build everywhere. Run flex >= 2.6 like this: - flex --nounistd -DFLEXINT_H --noline --header-file=cmCTestProcessesLexer.h -ocmCTestProcessesLexer.cxx cmCTestProcessesLexer.in.l + flex --nounistd -DFLEXINT_H --noline --header-file=cmCTestResourceGroupsLexer.h -ocmCTestResourceGroupsLexer.cxx cmCTestResourceGroupsLexer.in.l -Modify cmCTestProcessesLexer.cxx: - - remove trailing whitespace: sed -i 's/\s*$//' cmCTestProcessesLexer.h cmCTestProcessesLexer.cxx - - remove blank lines at end of file: sed -i '${/^$/d;}' cmCTestProcessesLexer.h cmCTestProcessesLexer.cxx - - #include "cmStandardLexer.h" at the top: sed -i '1i#include "cmStandardLexer.h"' cmCTestProcessesLexer.cxx +Modify cmCTestResourceGroupsLexer.cxx: + - remove trailing whitespace: sed -i 's/\s*$//' cmCTestResourceGroupsLexer.h cmCTestResourceGroupsLexer.cxx + - remove blank lines at end of file: sed -i '${/^$/d;}' cmCTestResourceGroupsLexer.h cmCTestResourceGroupsLexer.cxx + - #include "cmStandardLexer.h" at the top: sed -i '1i#include "cmStandardLexer.h"' cmCTestResourceGroupsLexer.cxx */ @@ -20,7 +20,7 @@ Modify cmCTestProcessesLexer.cxx: #ifndef __clang_analyzer__ /* Suppress clang scan-build warnings */ -#include "cmCTestProcessesLexerHelper.h" +#include "cmCTestResourceGroupsLexerHelper.h" #include <string> @@ -29,15 +29,15 @@ Modify cmCTestProcessesLexer.cxx: /*--------------------------------------------------------------------------*/ %} -%option prefix="cmCTestProcesses_yy" +%option prefix="cmCTestResourceGroups_yy" %option reentrant %option noyywrap %option nodefault %pointer -%s PROCESSES_START -%s PROCESSES_END +%s RESOURCE_GROUPS_START +%s RESOURCE_GROUPS_END %s RESOURCE_START %s RESOURCE_COUNT %s RESOURCE_END @@ -47,13 +47,13 @@ IDENTIFIER [a-z_][a-z0-9_]* %% -<INITIAL,PROCESSES_START,RESOURCE_START>{IDENTIFIER}: { +<INITIAL,RESOURCE_GROUPS_START,RESOURCE_START>{IDENTIFIER}: { BEGIN(RESOURCE_COUNT); yyextra->SetResourceType(std::string(yytext, yyleng - 1)); } -<INITIAL,PROCESSES_START>{NUMBER} { - BEGIN(PROCESSES_END); +<INITIAL,RESOURCE_GROUPS_START>{NUMBER} { + BEGIN(RESOURCE_GROUPS_END); std::size_t len = yyleng; yyextra->SetProcessCount(std::stoll(yytext, &len, 10)); } @@ -65,25 +65,25 @@ IDENTIFIER [a-z_][a-z0-9_]* yyextra->WriteRequirement(); } -<PROCESSES_END,RESOURCE_END>,+ { +<RESOURCE_GROUPS_END,RESOURCE_END>,+ { BEGIN(RESOURCE_START); } -<INITIAL,PROCESSES_START,RESOURCE_START>;+ { - BEGIN(PROCESSES_START); +<INITIAL,RESOURCE_GROUPS_START,RESOURCE_START>;+ { + BEGIN(RESOURCE_GROUPS_START); } -<PROCESSES_END,RESOURCE_END>;+ { - BEGIN(PROCESSES_START); +<RESOURCE_GROUPS_END,RESOURCE_END>;+ { + BEGIN(RESOURCE_GROUPS_START); yyextra->WriteProcess(); } -<RESOURCE_START,PROCESSES_END,RESOURCE_END><<EOF>> { +<RESOURCE_START,RESOURCE_GROUPS_END,RESOURCE_END><<EOF>> { yyextra->WriteProcess(); return 0; } -<INITIAL,PROCESSES_START><<EOF>> { +<INITIAL,RESOURCE_GROUPS_START><<EOF>> { return 0; } diff --git a/Source/cmCTest.cxx b/Source/cmCTest.cxx index 10b7646..6eae26e 100644 --- a/Source/cmCTest.cxx +++ b/Source/cmCTest.cxx @@ -2090,12 +2090,12 @@ bool cmCTest::HandleCommandLineArguments(size_t& i, "ExcludeFixtureCleanupRegularExpression", args[i].c_str()); } - if (this->CheckArgument(arg, "--hardware-spec-file") && + if (this->CheckArgument(arg, "--resource-spec-file") && i < args.size() - 1) { i++; - this->GetTestHandler()->SetPersistentOption("HardwareSpecFile", + this->GetTestHandler()->SetPersistentOption("ResourceSpecFile", args[i].c_str()); - this->GetMemCheckHandler()->SetPersistentOption("HardwareSpecFile", + this->GetMemCheckHandler()->SetPersistentOption("ResourceSpecFile", args[i].c_str()); } diff --git a/Source/cmCoreTryCompile.cxx b/Source/cmCoreTryCompile.cxx index 910cc9d..5711cae 100644 --- a/Source/cmCoreTryCompile.cxx +++ b/Source/cmCoreTryCompile.cxx @@ -136,13 +136,19 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv, std::string copyFile; std::string copyFileError; std::string cStandard; + std::string objcStandard; std::string cxxStandard; + std::string objcxxStandard; std::string cudaStandard; std::string cStandardRequired; std::string cxxStandardRequired; + std::string objcStandardRequired; + std::string objcxxStandardRequired; std::string cudaStandardRequired; std::string cExtensions; std::string cxxExtensions; + std::string objcExtensions; + std::string objcxxExtensions; std::string cudaExtensions; std::vector<std::string> targets; std::vector<std::string> linkOptions; @@ -154,12 +160,18 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv, bool didCopyFileError = false; bool didCStandard = false; bool didCxxStandard = false; + bool didObjCStandard = false; + bool didObjCxxStandard = false; bool didCudaStandard = false; bool didCStandardRequired = false; bool didCxxStandardRequired = false; + bool didObjCStandardRequired = false; + bool didObjCxxStandardRequired = false; bool didCudaStandardRequired = false; bool didCExtensions = false; bool didCxxExtensions = false; + bool didObjCExtensions = false; + bool didObjCxxExtensions = false; bool didCudaExtensions = false; bool useSources = argv[2] == "SOURCES"; std::vector<std::string> sources; @@ -176,12 +188,18 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv, DoingCopyFileError, DoingCStandard, DoingCxxStandard, + DoingObjCStandard, + DoingObjCxxStandard, DoingCudaStandard, DoingCStandardRequired, DoingCxxStandardRequired, + DoingObjCStandardRequired, + DoingObjCxxStandardRequired, DoingCudaStandardRequired, DoingCExtensions, DoingCxxExtensions, + DoingObjCExtensions, + DoingObjCxxExtensions, DoingCudaExtensions, DoingSources, DoingCMakeInternal @@ -212,6 +230,12 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv, } else if (argv[i] == "CXX_STANDARD") { doing = DoingCxxStandard; didCxxStandard = true; + } else if (argv[i] == "OBJC_STANDARD") { + doing = DoingObjCStandard; + didObjCStandard = true; + } else if (argv[i] == "OBJCXX_STANDARD") { + doing = DoingObjCxxStandard; + didObjCxxStandard = true; } else if (argv[i] == "CUDA_STANDARD") { doing = DoingCudaStandard; didCudaStandard = true; @@ -221,6 +245,12 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv, } else if (argv[i] == "CXX_STANDARD_REQUIRED") { doing = DoingCxxStandardRequired; didCxxStandardRequired = true; + } else if (argv[i] == "OBJC_STANDARD_REQUIRED") { + doing = DoingObjCStandardRequired; + didObjCStandardRequired = true; + } else if (argv[i] == "OBJCXX_STANDARD_REQUIRED") { + doing = DoingObjCxxStandardRequired; + didObjCxxStandardRequired = true; } else if (argv[i] == "CUDA_STANDARD_REQUIRED") { doing = DoingCudaStandardRequired; didCudaStandardRequired = true; @@ -230,6 +260,12 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv, } else if (argv[i] == "CXX_EXTENSIONS") { doing = DoingCxxExtensions; didCxxExtensions = true; + } else if (argv[i] == "OBJC_EXTENSIONS") { + doing = DoingObjCExtensions; + didObjCExtensions = true; + } else if (argv[i] == "OBJCXX_EXTENSIONS") { + doing = DoingObjCxxExtensions; + didObjCxxExtensions = true; } else if (argv[i] == "CUDA_EXTENSIONS") { doing = DoingCudaExtensions; didCudaExtensions = true; @@ -285,6 +321,12 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv, } else if (doing == DoingCxxStandard) { cxxStandard = argv[i]; doing = DoingNone; + } else if (doing == DoingObjCStandard) { + objcStandard = argv[i]; + doing = DoingNone; + } else if (doing == DoingObjCxxStandard) { + objcxxStandard = argv[i]; + doing = DoingNone; } else if (doing == DoingCudaStandard) { cudaStandard = argv[i]; doing = DoingNone; @@ -294,6 +336,12 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv, } else if (doing == DoingCxxStandardRequired) { cxxStandardRequired = argv[i]; doing = DoingNone; + } else if (doing == DoingObjCStandardRequired) { + objcStandardRequired = argv[i]; + doing = DoingNone; + } else if (doing == DoingObjCxxStandardRequired) { + objcxxStandardRequired = argv[i]; + doing = DoingNone; } else if (doing == DoingCudaStandardRequired) { cudaStandardRequired = argv[i]; doing = DoingNone; @@ -303,6 +351,12 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv, } else if (doing == DoingCxxExtensions) { cxxExtensions = argv[i]; doing = DoingNone; + } else if (doing == DoingObjCExtensions) { + objcExtensions = argv[i]; + doing = DoingNone; + } else if (doing == DoingObjCxxExtensions) { + objcxxExtensions = argv[i]; + doing = DoingNone; } else if (doing == DoingCudaExtensions) { cudaExtensions = argv[i]; doing = DoingNone; @@ -754,16 +808,20 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv, fprintf(fout, ")\n"); bool const testC = testLangs.find("C") != testLangs.end(); + bool const testObjC = testLangs.find("OBJC") != testLangs.end(); bool const testCxx = testLangs.find("CXX") != testLangs.end(); + bool const testObjCxx = testLangs.find("OBJCXX") != testLangs.end(); bool const testCuda = testLangs.find("CUDA") != testLangs.end(); bool warnCMP0067 = false; bool honorStandard = true; - if (!didCStandard && !didCxxStandard && !didCudaStandard && - !didCStandardRequired && !didCxxStandardRequired && - !didCudaStandardRequired && !didCExtensions && !didCxxExtensions && - !didCudaExtensions) { + if (!didCStandard && !didCxxStandard && !didObjCStandard && + !didObjCxxStandard && !didCudaStandard && !didCStandardRequired && + !didCxxStandardRequired && !didObjCStandardRequired && + !didObjCxxStandardRequired && !didCudaStandardRequired && + !didCExtensions && !didCxxExtensions && !didObjCExtensions && + !didObjCxxExtensions && !didCudaExtensions) { switch (this->Makefile->GetPolicyStatus(cmPolicies::CMP0067)) { case cmPolicies::WARN: warnCMP0067 = this->Makefile->PolicyOptionalWarningEnabled( @@ -786,45 +844,42 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv, } if (honorStandard || warnCMP0067) { - if (testC) { - if (!didCStandard) { - cStandard = this->LookupStdVar("CMAKE_C_STANDARD", warnCMP0067); - } - if (!didCStandardRequired) { - cStandardRequired = - this->LookupStdVar("CMAKE_C_STANDARD_REQUIRED", warnCMP0067); - } - if (!didCExtensions) { - cExtensions = this->LookupStdVar("CMAKE_C_EXTENSIONS", warnCMP0067); - } - } - if (testCxx) { - if (!didCxxStandard) { - cxxStandard = this->LookupStdVar("CMAKE_CXX_STANDARD", warnCMP0067); - } - if (!didCxxStandardRequired) { - cxxStandardRequired = - this->LookupStdVar("CMAKE_CXX_STANDARD_REQUIRED", warnCMP0067); - } - if (!didCxxExtensions) { - cxxExtensions = - this->LookupStdVar("CMAKE_CXX_EXTENSIONS", warnCMP0067); - } - } - if (testCuda) { - if (!didCudaStandard) { - cudaStandard = - this->LookupStdVar("CMAKE_CUDA_STANDARD", warnCMP0067); - } - if (!didCudaStandardRequired) { - cudaStandardRequired = - this->LookupStdVar("CMAKE_CUDA_STANDARD_REQUIRED", warnCMP0067); - } - if (!didCudaExtensions) { - cudaExtensions = - this->LookupStdVar("CMAKE_CUDA_EXTENSIONS", warnCMP0067); - } - } + + auto testLanguage = + [&](bool testLang, bool didLangStandard, bool didLangStandardRequired, + bool didLangExtensions, std::string& langStandard, + std::string& langStandardRequired, std::string& langExtensions, + const std::string& lang) { + if (testLang) { + if (!didLangStandard) { + langStandard = this->LookupStdVar( + cmStrCat("CMAKE_", lang, "_STANDARD"), warnCMP0067); + } + if (!didLangStandardRequired) { + langStandardRequired = this->LookupStdVar( + cmStrCat("CMAKE_", lang, "_STANDARD_REQUIRED"), warnCMP0067); + } + if (!didLangExtensions) { + langExtensions = this->LookupStdVar( + cmStrCat("CMAKE_", lang, "_EXTENSIONS"), warnCMP0067); + } + } + }; + + testLanguage(testC, didCStandard, didCStandardRequired, didCExtensions, + cStandard, cStandardRequired, cExtensions, "C"); + testLanguage(testObjC, didObjCStandard, didObjCStandardRequired, + didObjCExtensions, objcStandard, objcStandardRequired, + objcExtensions, "OBJC"); + testLanguage(testCxx, didCxxStandard, didCxxStandardRequired, + didCxxExtensions, cxxStandard, cxxStandardRequired, + cxxExtensions, "CXX"); + testLanguage(testObjCxx, didObjCxxStandard, didObjCxxStandardRequired, + didObjCxxExtensions, objcxxStandard, objcxxStandardRequired, + objcxxExtensions, "OBJCXX"); + testLanguage(testCuda, didCudaStandard, didCudaStandardRequired, + didCudaExtensions, cudaStandard, cudaStandardRequired, + cudaExtensions, "CUDA"); } if (!this->WarnCMP0067.empty()) { @@ -841,44 +896,37 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv, this->Makefile->IssueMessage(MessageType::AUTHOR_WARNING, w.str()); } - if (testC) { - if (!cStandard.empty()) { - writeProperty(fout, targetName, "C_STANDARD", cStandard); - } - if (!cStandardRequired.empty()) { - writeProperty(fout, targetName, "C_STANDARD_REQUIRED", - cStandardRequired); - } - if (!cExtensions.empty()) { - writeProperty(fout, targetName, "C_EXTENSIONS", cExtensions); - } - } - - if (testCxx) { - if (!cxxStandard.empty()) { - writeProperty(fout, targetName, "CXX_STANDARD", cxxStandard); - } - if (!cxxStandardRequired.empty()) { - writeProperty(fout, targetName, "CXX_STANDARD_REQUIRED", - cxxStandardRequired); - } - if (!cxxExtensions.empty()) { - writeProperty(fout, targetName, "CXX_EXTENSIONS", cxxExtensions); - } - } - - if (testCuda) { - if (!cudaStandard.empty()) { - writeProperty(fout, targetName, "CUDA_STANDARD", cudaStandard); - } - if (!cudaStandardRequired.empty()) { - writeProperty(fout, targetName, "CUDA_STANDARD_REQUIRED", - cudaStandardRequired); - } - if (!cudaExtensions.empty()) { - writeProperty(fout, targetName, "CUDA_EXTENSIONS", cudaExtensions); + auto writeLanguageProperties = [&](bool testLang, + const std::string& langStandard, + const std::string& langStandardRequired, + const std::string& langExtensions, + const std::string& lang) { + if (testLang) { + if (!langStandard.empty()) { + writeProperty(fout, targetName, cmStrCat(lang, "_STANDARD"), + langStandard); + } + if (!langStandardRequired.empty()) { + writeProperty(fout, targetName, cmStrCat(lang, "_STANDARD_REQUIRED"), + langStandardRequired); + } + if (!langExtensions.empty()) { + writeProperty(fout, targetName, cmStrCat(lang, "_EXTENSIONS"), + langExtensions); + } } - } + }; + + writeLanguageProperties(testC, cStandard, cStandardRequired, cExtensions, + "C"); + writeLanguageProperties(testObjC, objcStandard, objcStandardRequired, + objcExtensions, "OBJC"); + writeLanguageProperties(testCxx, cxxStandard, cxxStandardRequired, + cxxExtensions, "CXX"); + writeLanguageProperties(testObjCxx, objcxxStandard, objcxxStandardRequired, + objcxxExtensions, "OBJCXX"); + writeLanguageProperties(testCuda, cudaStandard, cudaStandardRequired, + cudaExtensions, "CUDA"); if (!linkOptions.empty()) { std::vector<std::string> options; diff --git a/Source/cmFileAPICodemodel.cxx b/Source/cmFileAPICodemodel.cxx index 48561de..a12b3c9 100644 --- a/Source/cmFileAPICodemodel.cxx +++ b/Source/cmFileAPICodemodel.cxx @@ -875,7 +875,7 @@ CompileData Target::BuildCompileData(cmSourceFile* sf) if (!pchSource.empty() && !sf->GetProperty("SKIP_PRECOMPILE_HEADERS")) { std::string pchOptions; - if (sf->GetFullPath() == pchSource) { + if (sf->ResolveFullPath() == pchSource) { pchOptions = this->GT->GetPchCreateCompileOptions(this->Config, fd.Language); } else { diff --git a/Source/cmFindPackageCommand.cxx b/Source/cmFindPackageCommand.cxx index ea936cf..2b11b62 100644 --- a/Source/cmFindPackageCommand.cxx +++ b/Source/cmFindPackageCommand.cxx @@ -201,7 +201,13 @@ bool cmFindPackageCommand::InitialPass(std::vector<std::string> const& args) } // Check if System Package Registry should be disabled - if (this->Makefile->IsOn("CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY")) { + // The `CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY` has + // priority over the deprecated CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY + if (const char* def = this->Makefile->GetDefinition( + "CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY")) { + this->NoSystemRegistry = !cmIsOn(def); + } else if (this->Makefile->IsOn( + "CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY")) { this->NoSystemRegistry = true; } diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 949d9d9..c3ed9e8 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -3334,9 +3334,11 @@ std::vector<BT<std::string>> cmGeneratorTarget::GetPrecompileHeaders( std::string cmGeneratorTarget::GetPchHeader(const std::string& config, const std::string& language) const { - if (language != "C" && language != "CXX") { + if (language != "C" && language != "CXX" && language != "OBJC" && + language != "OBJCXX") { return std::string(); } + if (this->GetPropertyAsBool("DISABLE_PRECOMPILE_HEADERS")) { return std::string(); } @@ -3358,17 +3360,18 @@ std::string cmGeneratorTarget::GetPchHeader(const std::string& config, this->GetGlobalGenerator()->FindGeneratorTarget(pchReuseFrom); } - if (this->GetGlobalGenerator()->IsMultiConfig()) { - filename = cmStrCat( - generatorTarget->LocalGenerator->GetCurrentBinaryDirectory(), "/"); - } else { - // For GCC we need to have the header file .h[xx] - // next to the .h[xx].gch file - filename = generatorTarget->ObjectDirectory; - } + filename = cmStrCat( + generatorTarget->LocalGenerator->GetCurrentBinaryDirectory(), "/"); + + const std::map<std::string, std::string> languageToExtension = { + { "C", ".h" }, + { "CXX", ".hxx" }, + { "OBJC", ".objc.h" }, + { "OBJCXX", ".objcxx.hxx" } + }; filename = cmStrCat(filename, "CMakeFiles/", generatorTarget->GetName(), - ".dir/cmake_pch", ((language == "C") ? ".h" : ".hxx")); + ".dir/cmake_pch", languageToExtension.at(language)); const std::string filename_tmp = cmStrCat(filename, ".tmp"); if (!pchReuseFrom) { @@ -3418,7 +3421,8 @@ std::string cmGeneratorTarget::GetPchHeader(const std::string& config, std::string cmGeneratorTarget::GetPchSource(const std::string& config, const std::string& language) const { - if (language != "C" && language != "CXX") { + if (language != "C" && language != "CXX" && language != "OBJC" && + language != "OBJCXX") { return std::string(); } const auto inserted = @@ -3444,9 +3448,20 @@ std::string cmGeneratorTarget::GetPchSource(const std::string& config, // For GCC the source extension will be tranformed into .h[xx].gch if (!this->Makefile->IsOn("CMAKE_LINK_PCH")) { - filename += ((language == "C") ? ".h.c" : ".hxx.cxx"); + const std::map<std::string, std::string> languageToExtension = { + { "C", ".h.c" }, + { "CXX", ".hxx.cxx" }, + { "OBJC", ".objc.h.m" }, + { "OBJCXX", ".objcxx.hxx.mm" } + }; + + filename += languageToExtension.at(language); } else { - filename += ((language == "C") ? ".c" : ".cxx"); + const std::map<std::string, std::string> languageToExtension = { + { "C", ".c" }, { "CXX", ".cxx" }, { "OBJC", ".m" }, { "OBJCXX", ".mm" } + }; + + filename += languageToExtension.at(language); } const std::string filename_tmp = cmStrCat(filename, ".tmp"); @@ -3464,7 +3479,8 @@ std::string cmGeneratorTarget::GetPchSource(const std::string& config, std::string cmGeneratorTarget::GetPchFileObject(const std::string& config, const std::string& language) { - if (language != "C" && language != "CXX") { + if (language != "C" && language != "CXX" && language != "OBJC" && + language != "OBJCXX") { return std::string(); } const auto inserted = diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index 67f1a46..adeb065 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -776,7 +776,7 @@ public: "Xcode does not support per-config per-source " << property << ":\n" " " << expression << "\n" "specified for source:\n" - " " << this->SourceFile->GetFullPath() << "\n"; + " " << this->SourceFile->ResolveFullPath() << "\n"; /* clang-format on */ this->LocalGenerator->IssueMessage(MessageType::FATAL_ERROR, e.str()); } @@ -850,7 +850,7 @@ cmXCodeObject* cmGlobalXCodeGenerator::CreateXCodeSourceFile( lg->AppendFlags(flags, lg->GetIncludeFlags(includes, gtgt, lang, true)); cmXCodeObject* buildFile = - this->CreateXCodeSourceFileFromPath(sf->GetFullPath(), gtgt, lang, sf); + this->CreateXCodeSourceFileFromPath(sf->ResolveFullPath(), gtgt, lang, sf); cmXCodeObject* settings = this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP); settings->AddAttributeIfNotEmpty("COMPILER_FLAGS", @@ -896,7 +896,8 @@ void cmGlobalXCodeGenerator::AddXCodeProjBuildRule( std::string listfile = cmStrCat(target->GetLocalGenerator()->GetCurrentSourceDirectory(), "/CMakeLists.txt"); - cmSourceFile* srcCMakeLists = target->Makefile->GetOrCreateSource(listfile); + cmSourceFile* srcCMakeLists = target->Makefile->GetOrCreateSource( + listfile, false, cmSourceFileLocationKind::Known); if (!cmContains(sources, srcCMakeLists)) { sources.push_back(srcCMakeLists); } @@ -1029,7 +1030,7 @@ cmXCodeObject* cmGlobalXCodeGenerator::CreateXCodeFileReference( { std::string lang = this->CurrentLocalGenerator->GetSourceFileLanguage(*sf); - return this->CreateXCodeFileReferenceFromPath(sf->GetFullPath(), target, + return this->CreateXCodeFileReferenceFromPath(sf->ResolveFullPath(), target, lang, sf); } @@ -1064,7 +1065,7 @@ struct cmSourceFilePathCompare { bool operator()(cmSourceFile* l, cmSourceFile* r) { - return l->GetFullPath() < r->GetFullPath(); + return l->ResolveFullPath() < r->ResolveFullPath(); } }; @@ -1139,7 +1140,8 @@ bool cmGlobalXCodeGenerator::CreateXCodeTarget( // Add the Info.plist we are about to generate for an App Bundle. if (gtgt->GetPropertyAsBool("MACOSX_BUNDLE")) { std::string plist = this->ComputeInfoPListLocation(gtgt); - cmSourceFile* sf = gtgt->Makefile->GetOrCreateSource(plist, true); + cmSourceFile* sf = gtgt->Makefile->GetOrCreateSource( + plist, true, cmSourceFileLocationKind::Known); classes.push_back(sf); } @@ -2855,15 +2857,17 @@ bool cmGlobalXCodeGenerator::CreateGroups( std::string listfile = cmStrCat(gtgt->GetLocalGenerator()->GetCurrentSourceDirectory(), "/CMakeLists.txt"); - cmSourceFile* sf = gtgt->Makefile->GetOrCreateSource(listfile); - addSourceToGroup(sf->GetFullPath()); + cmSourceFile* sf = gtgt->Makefile->GetOrCreateSource( + listfile, false, cmSourceFileLocationKind::Known); + addSourceToGroup(sf->ResolveFullPath()); } // Add the Info.plist we are about to generate for an App Bundle. if (gtgt->GetPropertyAsBool("MACOSX_BUNDLE")) { std::string plist = this->ComputeInfoPListLocation(gtgt); - cmSourceFile* sf = gtgt->Makefile->GetOrCreateSource(plist, true); - addSourceToGroup(sf->GetFullPath()); + cmSourceFile* sf = gtgt->Makefile->GetOrCreateSource( + plist, true, cmSourceFileLocationKind::Known); + addSourceToGroup(sf->ResolveFullPath()); } } } diff --git a/Source/cmInstallTargetGenerator.cxx b/Source/cmInstallTargetGenerator.cxx index 0cd04cc..aa92fa7 100644 --- a/Source/cmInstallTargetGenerator.cxx +++ b/Source/cmInstallTargetGenerator.cxx @@ -775,7 +775,7 @@ void cmInstallTargetGenerator::AddChrpathPatchRule( if (this->Target->GetPropertyAsBool("INSTALL_REMOVE_ENVIRONMENT_RPATH")) { os << "\n" << indent << " INSTALL_REMOVE_ENVIRONMENT_RPATH)\n"; } else { - os << indent << ")\n"; + os << ")\n"; } } } diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index a2eb1b9..827f55a 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -2266,7 +2266,7 @@ void cmLocalGenerator::AddPchDependencies(cmGeneratorTarget* target) std::vector<cmSourceFile*> sources; target->GetSourceFiles(sources, buildType); - for (const std::string& lang : { "C", "CXX" }) { + for (const std::string& lang : { "C", "CXX", "OBJC", "OBJCXX" }) { auto langSources = std::count_if(sources.begin(), sources.end(), [lang](cmSourceFile* sf) { return lang == sf->GetLanguage() && @@ -2441,7 +2441,6 @@ void cmLocalGenerator::AddUnityBuild(cmGeneratorTarget* target) std::back_inserter(filtered_sources), [&](cmSourceFile* sf) { return sf->GetLanguage() == lang && !sf->GetPropertyAsBool("SKIP_UNITY_BUILD_INCLUSION") && - !sf->GetPropertyAsBool("GENERATED") && !sf->GetProperty("COMPILE_OPTIONS") && !sf->GetProperty("COMPILE_DEFINITIONS") && !sf->GetProperty("COMPILE_FLAGS") && @@ -2488,7 +2487,7 @@ void cmLocalGenerator::AddUnityBuild(cmGeneratorTarget* target) file << beforeInclude << "\n"; } - file << "#include \"" << sf->GetFullPath() << "\"\n"; + file << "#include \"" << sf->ResolveFullPath() << "\"\n"; if (afterInclude) { file << afterInclude << "\n"; @@ -3124,6 +3123,14 @@ std::string cmLocalGenerator::GetObjectFileNameWithoutTarget( const char* pchExtension = source.GetProperty("PCH_EXTENSION"); if (pchExtension) { customOutputExtension = pchExtension; + + // Make sure that for the CMakeFiles/<target>.dir/cmake_pch.h|xx.c|xx + // source file, we don't end up having + // CMakeFiles/<target>.dir/CMakeFiles/<target>.dir/cmake_pch.h|xx.pch + cmsys::RegularExpression var("(CMakeFiles/[^/]+.dir/)"); + while (var.find(objectName)) { + objectName.erase(var.start(), var.end() - var.start()); + } } // Remove the source extension if it is to be replaced. diff --git a/Source/cmSourceGroupCommand.cxx b/Source/cmSourceGroupCommand.cxx index 3a13e57..cc62952 100644 --- a/Source/cmSourceGroupCommand.cxx +++ b/Source/cmSourceGroupCommand.cxx @@ -78,10 +78,18 @@ std::vector<std::string> prepareFilesPathsForTree( for (auto const& filePath : filesPaths) { std::string fullPath = cmSystemTools::CollapseFullPath(filePath, currentSourceDir); - // If provided file path is actually not a file, silently ignore it. - if (cmSystemTools::FileExists(fullPath, /*isFile=*/true)) { - prepared.emplace_back(std::move(fullPath)); + // If provided file path is actually not a directory, silently ignore it. + if (cmSystemTools::FileIsDirectory(fullPath)) { + continue; } + + // Handle directory that doesn't exist yet. + if (!fullPath.empty() && + (fullPath.back() == '/' || fullPath.back() == '\\')) { + continue; + } + + prepared.emplace_back(std::move(fullPath)); } return prepared; diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index a50e829..c4a4220 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -1120,8 +1120,13 @@ std::string cmSystemTools::ForceToRelativePath(std::string const& local_path, assert(local_path.front() != '\"'); assert(remote_path.front() != '\"'); - // The local path should never have a trailing slash. - assert(local_path.empty() || local_path.back() != '/'); + // The local path should never have a trailing slash except if it is just the + // bare root directory + assert(local_path.empty() || local_path.back() != '/' || + local_path.size() == 1 || + (local_path.size() == 3 && local_path[1] == ':' && + ((local_path[0] >= 'A' && local_path[0] <= 'Z') || + (local_path[0] >= 'a' && local_path[0] <= 'z')))); // If the path is already relative then just return the path. if (!cmSystemTools::FileIsFullPath(remote_path)) { diff --git a/Source/ctest.cxx b/Source/ctest.cxx index 91ee598..0d65902 100644 --- a/Source/ctest.cxx +++ b/Source/ctest.cxx @@ -103,7 +103,7 @@ static const char* cmDocumentationOptions[][2] = { "times without failing in order to pass" }, { "--max-width <width>", "Set the max width for a test name to output" }, { "--interactive-debug-mode [0|1]", "Set the interactive mode to 0 or 1." }, - { "--hardware-spec-file <file>", "Set the hardware spec file to use." }, + { "--resource-spec-file <file>", "Set the resource spec file to use." }, { "--no-label-summary", "Disable timing summary information for labels." }, { "--no-subproject-summary", "Disable timing summary information for " diff --git a/Tests/CMakeLib/CMakeLists.txt b/Tests/CMakeLib/CMakeLists.txt index bc2079f..840afc1 100644 --- a/Tests/CMakeLib/CMakeLists.txt +++ b/Tests/CMakeLib/CMakeLists.txt @@ -8,9 +8,9 @@ include_directories( set(CMakeLib_TESTS testArgumentParser.cxx testCTestBinPacker.cxx - testCTestProcesses.cxx - testCTestHardwareAllocator.cxx - testCTestHardwareSpec.cxx + testCTestResourceAllocator.cxx + testCTestResourceSpec.cxx + testCTestResourceGroups.cxx testGeneratedFileStream.cxx testRST.cxx testRange.cxx @@ -32,7 +32,7 @@ add_executable(testUVProcessChainHelper testUVProcessChainHelper.cxx) set(testRST_ARGS ${CMAKE_CURRENT_SOURCE_DIR}) set(testUVProcessChain_ARGS $<TARGET_FILE:testUVProcessChainHelper>) set(testUVStreambuf_ARGS $<TARGET_FILE:cmake>) -set(testCTestHardwareSpec_ARGS ${CMAKE_CURRENT_SOURCE_DIR}) +set(testCTestResourceSpec_ARGS ${CMAKE_CURRENT_SOURCE_DIR}) if(WIN32) list(APPEND CMakeLib_TESTS diff --git a/Tests/CMakeLib/testCTestBinPacker.cxx b/Tests/CMakeLib/testCTestBinPacker.cxx index 62ea55b..6f09af2 100644 --- a/Tests/CMakeLib/testCTestBinPacker.cxx +++ b/Tests/CMakeLib/testCTestBinPacker.cxx @@ -5,12 +5,12 @@ #include <vector> #include "cmCTestBinPacker.h" -#include "cmCTestHardwareAllocator.h" +#include "cmCTestResourceAllocator.h" struct ExpectedPackResult { std::vector<int> SlotsNeeded; - std::map<std::string, cmCTestHardwareAllocator::Resource> Hardware; + std::map<std::string, cmCTestResourceAllocator::Resource> Resources; bool ExpectedReturnValue; std::vector<cmCTestBinPackerAllocation> ExpectedRoundRobinAllocations; std::vector<cmCTestBinPackerAllocation> ExpectedBlockAllocations; @@ -233,18 +233,18 @@ bool TestExpectedPackResult(const ExpectedPackResult& expected) roundRobinAllocations.push_back({ index++, n, "" }); } - bool roundRobinResult = cmAllocateCTestHardwareRoundRobin( - expected.Hardware, roundRobinAllocations); + bool roundRobinResult = cmAllocateCTestResourcesRoundRobin( + expected.Resources, roundRobinAllocations); if (roundRobinResult != expected.ExpectedReturnValue) { std::cout - << "cmAllocateCTestHardwareRoundRobin did not return expected value" + << "cmAllocateCTestResourcesRoundRobin did not return expected value" << std::endl; return false; } if (roundRobinResult && roundRobinAllocations != expected.ExpectedRoundRobinAllocations) { - std::cout << "cmAllocateCTestHardwareRoundRobin did not return expected " + std::cout << "cmAllocateCTestResourcesRoundRobin did not return expected " "allocations" << std::endl; return false; @@ -258,15 +258,15 @@ bool TestExpectedPackResult(const ExpectedPackResult& expected) } bool blockResult = - cmAllocateCTestHardwareBlock(expected.Hardware, blockAllocations); + cmAllocateCTestResourcesBlock(expected.Resources, blockAllocations); if (blockResult != expected.ExpectedReturnValue) { - std::cout << "cmAllocateCTestHardwareBlock did not return expected value" + std::cout << "cmAllocateCTestResourcesBlock did not return expected value" << std::endl; return false; } if (blockResult && blockAllocations != expected.ExpectedBlockAllocations) { - std::cout << "cmAllocateCTestHardwareBlock did not return expected" + std::cout << "cmAllocateCTestResourcesBlock did not return expected" " allocations" << std::endl; return false; diff --git a/Tests/CMakeLib/testCTestHardwareAllocator.cxx b/Tests/CMakeLib/testCTestResourceAllocator.cxx index 6f05d03..33d6b91 100644 --- a/Tests/CMakeLib/testCTestHardwareAllocator.cxx +++ b/Tests/CMakeLib/testCTestResourceAllocator.cxx @@ -3,24 +3,24 @@ #include <string> #include <vector> -#include "cmCTestHardwareAllocator.h" -#include "cmCTestHardwareSpec.h" +#include "cmCTestResourceAllocator.h" +#include "cmCTestResourceSpec.h" -static const cmCTestHardwareSpec spec{ { { +static const cmCTestResourceSpec spec{ { { /* clang-format off */ { "gpus", { { "0", 4 }, { "1", 8 }, { "2", 0 }, { "3", 8 } } }, /* clang-format on */ } } }; -bool testInitializeFromHardwareSpec() +bool testInitializeFromResourceSpec() { bool retval = true; - cmCTestHardwareAllocator allocator; - allocator.InitializeFromHardwareSpec(spec); + cmCTestResourceAllocator allocator; + allocator.InitializeFromResourceSpec(spec); static const std::map< - std::string, std::map<std::string, cmCTestHardwareAllocator::Resource>> + std::string, std::map<std::string, cmCTestResourceAllocator::Resource>> expected{ /* clang-format off */ { "gpus", { @@ -43,11 +43,11 @@ bool testAllocateResource() { bool retval = true; - cmCTestHardwareAllocator allocator; - allocator.InitializeFromHardwareSpec(spec); + cmCTestResourceAllocator allocator; + allocator.InitializeFromResourceSpec(spec); static const std::map< - std::string, std::map<std::string, cmCTestHardwareAllocator::Resource>> + std::string, std::map<std::string, cmCTestResourceAllocator::Resource>> expected1{ /* clang-format off */ { "gpus", { @@ -70,7 +70,7 @@ bool testAllocateResource() } static const std::map< - std::string, std::map<std::string, cmCTestHardwareAllocator::Resource>> + std::string, std::map<std::string, cmCTestResourceAllocator::Resource>> expected2{ /* clang-format off */ { "gpus", { @@ -93,7 +93,7 @@ bool testAllocateResource() } static const std::map< - std::string, std::map<std::string, cmCTestHardwareAllocator::Resource>> + std::string, std::map<std::string, cmCTestResourceAllocator::Resource>> expected3{ /* clang-format off */ { "gpus", { @@ -116,7 +116,7 @@ bool testAllocateResource() } static const std::map< - std::string, std::map<std::string, cmCTestHardwareAllocator::Resource>> + std::string, std::map<std::string, cmCTestResourceAllocator::Resource>> expected4{ /* clang-format off */ { "gpus", { @@ -145,7 +145,7 @@ bool testAllocateResource() } static const std::map< - std::string, std::map<std::string, cmCTestHardwareAllocator::Resource>> + std::string, std::map<std::string, cmCTestResourceAllocator::Resource>> expected5{ /* clang-format off */ { "gpus", { @@ -168,7 +168,7 @@ bool testAllocateResource() } static const std::map< - std::string, std::map<std::string, cmCTestHardwareAllocator::Resource>> + std::string, std::map<std::string, cmCTestResourceAllocator::Resource>> expected6{ /* clang-format off */ { "gpus", { @@ -191,7 +191,7 @@ bool testAllocateResource() } static const std::map< - std::string, std::map<std::string, cmCTestHardwareAllocator::Resource>> + std::string, std::map<std::string, cmCTestResourceAllocator::Resource>> expected7{ /* clang-format off */ { "gpus", { @@ -220,11 +220,11 @@ bool testDeallocateResource() { bool retval = true; - cmCTestHardwareAllocator allocator; - allocator.InitializeFromHardwareSpec(spec); + cmCTestResourceAllocator allocator; + allocator.InitializeFromResourceSpec(spec); static const std::map< - std::string, std::map<std::string, cmCTestHardwareAllocator::Resource>> + std::string, std::map<std::string, cmCTestResourceAllocator::Resource>> expected1{ /* clang-format off */ { "gpus", { @@ -253,7 +253,7 @@ bool testDeallocateResource() } static const std::map< - std::string, std::map<std::string, cmCTestHardwareAllocator::Resource>> + std::string, std::map<std::string, cmCTestResourceAllocator::Resource>> expected2{ /* clang-format off */ { "gpus", { @@ -276,7 +276,7 @@ bool testDeallocateResource() } static const std::map< - std::string, std::map<std::string, cmCTestHardwareAllocator::Resource>> + std::string, std::map<std::string, cmCTestResourceAllocator::Resource>> expected3{ /* clang-format off */ { "gpus", { @@ -299,7 +299,7 @@ bool testDeallocateResource() } static const std::map< - std::string, std::map<std::string, cmCTestHardwareAllocator::Resource>> + std::string, std::map<std::string, cmCTestResourceAllocator::Resource>> expected4{ /* clang-format off */ { "gpus", { @@ -322,7 +322,7 @@ bool testDeallocateResource() } static const std::map< - std::string, std::map<std::string, cmCTestHardwareAllocator::Resource>> + std::string, std::map<std::string, cmCTestResourceAllocator::Resource>> expected5{ /* clang-format off */ { "gpus", { @@ -345,7 +345,7 @@ bool testDeallocateResource() } static const std::map< - std::string, std::map<std::string, cmCTestHardwareAllocator::Resource>> + std::string, std::map<std::string, cmCTestResourceAllocator::Resource>> expected6{ /* clang-format off */ { "gpus", { @@ -374,23 +374,23 @@ bool testResourceFree() { bool retval = true; - const cmCTestHardwareAllocator::Resource r1{ 5, 0 }; + const cmCTestResourceAllocator::Resource r1{ 5, 0 }; if (r1.Free() != 5) { - std::cout << "cmCTestHardwareAllocator::Resource::Free() did not return " + std::cout << "cmCTestResourceAllocator::Resource::Free() did not return " "expected value for { 5, 0 }\n"; retval = false; } - const cmCTestHardwareAllocator::Resource r2{ 3, 2 }; + const cmCTestResourceAllocator::Resource r2{ 3, 2 }; if (r2.Free() != 1) { - std::cout << "cmCTestHardwareAllocator::Resource::Free() did not return " + std::cout << "cmCTestResourceAllocator::Resource::Free() did not return " "expected value for { 3, 2 }\n"; retval = false; } - const cmCTestHardwareAllocator::Resource r3{ 4, 4 }; + const cmCTestResourceAllocator::Resource r3{ 4, 4 }; if (r3.Free() != 0) { - std::cout << "cmCTestHardwareAllocator::Resource::Free() did not return " + std::cout << "cmCTestResourceAllocator::Resource::Free() did not return " "expected value for { 4, 4 }\n"; retval = false; } @@ -398,12 +398,12 @@ bool testResourceFree() return retval; } -int testCTestHardwareAllocator(int, char** const) +int testCTestResourceAllocator(int, char** const) { int retval = 0; - if (!testInitializeFromHardwareSpec()) { - std::cout << "in testInitializeFromHardwareSpec()\n"; + if (!testInitializeFromResourceSpec()) { + std::cout << "in testInitializeFromResourceSpec()\n"; retval = -1; } diff --git a/Tests/CMakeLib/testCTestProcesses.cxx b/Tests/CMakeLib/testCTestResourceGroups.cxx index acf4f67..5fd7d4a 100644 --- a/Tests/CMakeLib/testCTestProcesses.cxx +++ b/Tests/CMakeLib/testCTestResourceGroups.cxx @@ -106,24 +106,25 @@ bool TestExpectedParseResult(const ExpectedParseResult& expected) std::vector<std::vector<cmCTestTestHandler::cmCTestTestResourceRequirement>> result; bool retval; - if ((retval = cmCTestTestHandler::ParseProcessesProperty( + if ((retval = cmCTestTestHandler::ParseResourceGroupsProperty( expected.String, result)) != expected.ExpectedReturnValue) { - std::cout << "ParseProcessesProperty(\"" << expected.String + std::cout << "ParseResourceGroupsProperty(\"" << expected.String << "\") returned " << retval << ", should be " << expected.ExpectedReturnValue << std::endl; return false; } if (result != expected.ExpectedValue) { - std::cout << "ParseProcessesProperty(\"" << expected.String - << "\") did not yield expected set of processes" << std::endl; + std::cout << "ParseResourceGroupsProperty(\"" << expected.String + << "\") did not yield expected set of resource groups" + << std::endl; return false; } return true; } -int testCTestProcesses(int /*unused*/, char* /*unused*/ []) +int testCTestResourceGroups(int /*unused*/, char* /*unused*/ []) { int retval = 0; diff --git a/Tests/CMakeLib/testCTestHardwareSpec.cxx b/Tests/CMakeLib/testCTestResourceSpec.cxx index 3e3eccc..e4bc770 100644 --- a/Tests/CMakeLib/testCTestHardwareSpec.cxx +++ b/Tests/CMakeLib/testCTestResourceSpec.cxx @@ -2,16 +2,16 @@ #include <string> #include <vector> -#include "cmCTestHardwareSpec.h" +#include "cmCTestResourceSpec.h" struct ExpectedSpec { std::string Path; bool ParseResult; - cmCTestHardwareSpec Expected; + cmCTestResourceSpec Expected; }; -static const std::vector<ExpectedSpec> expectedHardwareSpecs = { +static const std::vector<ExpectedSpec> expectedResourceSpecs = { /* clang-format off */ {"spec1.json", true, {{{ {"gpus", { @@ -44,9 +44,9 @@ static const std::vector<ExpectedSpec> expectedHardwareSpecs = { }; static bool testSpec(const std::string& path, bool expectedResult, - const cmCTestHardwareSpec& expected) + const cmCTestResourceSpec& expected) { - cmCTestHardwareSpec actual; + cmCTestResourceSpec actual; bool result = actual.ReadFromJSONFile(path); if (result != expectedResult) { std::cout << "ReadFromJSONFile(\"" << path << "\") returned " << result @@ -63,7 +63,7 @@ static bool testSpec(const std::string& path, bool expectedResult, return true; } -int testCTestHardwareSpec(int argc, char** const argv) +int testCTestResourceSpec(int argc, char** const argv) { if (argc < 2) { std::cout << "Invalid arguments.\n"; @@ -71,9 +71,9 @@ int testCTestHardwareSpec(int argc, char** const argv) } int retval = 0; - for (auto const& spec : expectedHardwareSpecs) { + for (auto const& spec : expectedResourceSpecs) { std::string path = argv[1]; - path += "/testCTestHardwareSpec_data/"; + path += "/testCTestResourceSpec_data/"; path += spec.Path; if (!testSpec(path, spec.ParseResult, spec.Expected)) { retval = -1; diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec1.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec1.json index ee3d0ce..ee3d0ce 100644 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec1.json +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec1.json diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec10.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec10.json index 22105d7..22105d7 100644 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec10.json +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec10.json diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec11.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec11.json index 1e37ef5..1e37ef5 100644 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec11.json +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec11.json diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec12.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec12.json index fe51488..fe51488 100644 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec12.json +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec12.json diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec13.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec13.json index 6b7a9f4..6b7a9f4 100644 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec13.json +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec13.json diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec14.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec14.json index ce708c7..ce708c7 100644 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec14.json +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec14.json diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec15.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec15.json index 78b6990..78b6990 100644 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec15.json +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec15.json diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec16.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec16.json index 95c7d26..95c7d26 100644 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec16.json +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec16.json diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec17.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec17.json index 1b6ab4b..1b6ab4b 100644 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec17.json +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec17.json diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec18.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec18.json index 1a17df7..1a17df7 100644 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec18.json +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec18.json diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec2.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec2.json index 6175b1a..6175b1a 100644 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec2.json +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec2.json diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec3.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec3.json index 82453ec..82453ec 100644 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec3.json +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec3.json diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec4.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec4.json index 05e73d7..05e73d7 100644 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec4.json +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec4.json diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec5.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec5.json index 2c63c08..2c63c08 100644 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec5.json +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec5.json diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec6.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec6.json index 93c790d..93c790d 100644 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec6.json +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec6.json diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec7.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec7.json index 28b6a4f..28b6a4f 100644 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec7.json +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec7.json diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec8.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec8.json index 79bd224..79bd224 100644 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec8.json +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec8.json diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec9.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec9.json index 6bb1def..6bb1def 100644 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec9.json +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec9.json diff --git a/Tests/FindPostgreSQL/Test/main.c b/Tests/FindPostgreSQL/Test/main.c index 2cfeed0..a63377a 100644 --- a/Tests/FindPostgreSQL/Test/main.c +++ b/Tests/FindPostgreSQL/Test/main.c @@ -5,10 +5,19 @@ int main() { int version = PQlibVersion(); - int major = version / 10000; - int minor = version % 10000; char version_string[100]; - snprintf(version_string, sizeof(version_string), "%d.%d", major, minor); + // 9.x and older encoding. + if (version < 100000) { + int major = version / 10000; + int minor = version % 10000 / 100; + int patch = version % 100; + snprintf(version_string, sizeof(version_string), "%d.%d.%d", major, minor, + patch); + } else { + int major = version / 10000; + int minor = version % 10000; + snprintf(version_string, sizeof(version_string), "%d.%d", major, minor); + } printf("Found PostgreSQL version %s, expected version %s\n", version_string, CMAKE_EXPECTED_POSTGRESQL_VERSION); return strcmp(version_string, CMAKE_EXPECTED_POSTGRESQL_VERSION); diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index 0925c0e..6b2f117 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -313,6 +313,8 @@ function(add_RunCMake_test_try_compile) CMAKE_CXX_COMPILER_VERSION CMAKE_CXX_STANDARD_DEFAULT CMake_TEST_CUDA + CMAKE_OBJC_STANDARD_DEFAULT + CMAKE_OBJCXX_STANDARD_DEFAULT ) if(DEFINED ${var}) list(APPEND try_compile_ARGS -D${var}=${${var}}) @@ -335,7 +337,7 @@ add_RunCMake_test(no_install_prefix) add_RunCMake_test(configure_file) add_RunCMake_test(CTestTimeoutAfterMatch) -# cthwalloc links against CMakeLib and CTestLib, which means it can't be built +# ctresalloc links against CMakeLib and CTestLib, which means it can't be built # if CMake_TEST_EXTERNAL_CMAKE is activated (the compiler might be different.) # So, it has to be provided in the original build tree. if(CMake_TEST_EXTERNAL_CMAKE) @@ -343,7 +345,7 @@ if(CMake_TEST_EXTERNAL_CMAKE) if(NOT CMAKE_VERSION VERSION_LESS 3.12) set(no_package_root_path NO_PACKAGE_ROOT_PATH) endif() - find_program(cthwalloc cthwalloc PATHS ${CMake_TEST_EXTERNAL_CMAKE} + find_program(ctresalloc ctresalloc PATHS ${CMake_TEST_EXTERNAL_CMAKE} NO_DEFAULT_PATH ${no_package_root_path} NO_CMAKE_PATH @@ -352,25 +354,25 @@ if(CMake_TEST_EXTERNAL_CMAKE) NO_CMAKE_SYSTEM_PATH NO_CMAKE_FIND_ROOT_PATH ) - if(cthwalloc) - add_executable(cthwalloc IMPORTED) - set_property(TARGET cthwalloc PROPERTY IMPORTED_LOCATION ${cthwalloc}) + if(ctresalloc) + add_executable(ctresalloc IMPORTED) + set_property(TARGET ctresalloc PROPERTY IMPORTED_LOCATION ${ctresalloc}) endif() else() - add_executable(cthwalloc CTestHardwareAllocation/cthwalloc.cxx) - target_link_libraries(cthwalloc CTestLib) - target_include_directories(cthwalloc PRIVATE + add_executable(ctresalloc CTestResourceAllocation/ctresalloc.cxx) + target_link_libraries(ctresalloc CTestLib) + target_include_directories(ctresalloc PRIVATE ${CMake_BINARY_DIR}/Source ${CMake_SOURCE_DIR}/Source ${CMake_SOURCE_DIR}/Source/CTest ) - set_property(TARGET cthwalloc PROPERTY RUNTIME_OUTPUT_DIRECTORY ${CMake_BIN_DIR}) + set_property(TARGET ctresalloc PROPERTY RUNTIME_OUTPUT_DIRECTORY ${CMake_BIN_DIR}) endif() -if(TARGET cthwalloc) - add_RunCMake_test(CTestHardwareAllocation -DCTHWALLOC_COMMAND=$<TARGET_FILE:cthwalloc>) +if(TARGET ctresalloc) + add_RunCMake_test(CTestResourceAllocation -DCTRESALLOC_COMMAND=$<TARGET_FILE:ctresalloc>) else() - message(WARNING "Could not find or build cthwalloc") + message(WARNING "Could not find or build ctresalloc") endif() find_package(Qt4 QUIET) diff --git a/Tests/RunCMake/CPack/RunCMakeTest.cmake b/Tests/RunCMake/CPack/RunCMakeTest.cmake index b0b7a99..b154c79 100644 --- a/Tests/RunCMake/CPack/RunCMakeTest.cmake +++ b/Tests/RunCMake/CPack/RunCMakeTest.cmake @@ -36,9 +36,6 @@ run_cpack_test(MD5SUMS "DEB.MD5SUMS" false "MONOLITHIC;COMPONENT") run_cpack_test_subtests(CPACK_INSTALL_SCRIPTS "singular;plural;both" "ZIP" false "MONOLITHIC") run_cpack_test(DEB_PACKAGE_VERSION_BACK_COMPATIBILITY "DEB.DEB_PACKAGE_VERSION_BACK_COMPATIBILITY" false "MONOLITHIC;COMPONENT") run_cpack_test_subtests(EXTERNAL "none;good;good_multi;bad_major;bad_minor;invalid_good;invalid_bad;stage_and_package" "External" false "MONOLITHIC;COMPONENT") -if(RunCMake_GENERATOR MATCHES "Visual Studio|Xcode") - run_cpack_test(CPACK_INSTALL_CMAKE_CONFIGURATIONS "ZIP" false "MONOLITHIC") -endif() run_cpack_test_subtests( DEB_DESCRIPTION "CPACK_DEBIAN_PACKAGE_DESCRIPTION;CPACK_PACKAGE_DESCRIPTION;CPACK_PACKAGE_DESCRIPTION_FILE" diff --git a/Tests/RunCMake/CPack/tests/CPACK_INSTALL_CMAKE_CONFIGURATIONS/ExpectedFiles.cmake b/Tests/RunCMake/CPack/tests/CPACK_INSTALL_CMAKE_CONFIGURATIONS/ExpectedFiles.cmake deleted file mode 100644 index 34c7f8a..0000000 --- a/Tests/RunCMake/CPack/tests/CPACK_INSTALL_CMAKE_CONFIGURATIONS/ExpectedFiles.cmake +++ /dev/null @@ -1,3 +0,0 @@ -set(EXPECTED_FILES_COUNT "1") - -set(EXPECTED_FILE_CONTENT_1_LIST "foo;foo/debug.txt;foo/release.txt") diff --git a/Tests/RunCMake/CPack/tests/CPACK_INSTALL_CMAKE_CONFIGURATIONS/ZIP-stdout.txt b/Tests/RunCMake/CPack/tests/CPACK_INSTALL_CMAKE_CONFIGURATIONS/ZIP-stdout.txt deleted file mode 100644 index 2a3aa9e..0000000 --- a/Tests/RunCMake/CPack/tests/CPACK_INSTALL_CMAKE_CONFIGURATIONS/ZIP-stdout.txt +++ /dev/null @@ -1,3 +0,0 @@ -CPack: Install projects -CPack: - Install project: CPACK_INSTALL_CMAKE_CONFIGURATIONS-MONOLITHIC-type \[Debug\] -CPack: - Install project: CPACK_INSTALL_CMAKE_CONFIGURATIONS-MONOLITHIC-type \[Release\] diff --git a/Tests/RunCMake/CPack/tests/CPACK_INSTALL_CMAKE_CONFIGURATIONS/test.cmake b/Tests/RunCMake/CPack/tests/CPACK_INSTALL_CMAKE_CONFIGURATIONS/test.cmake deleted file mode 100644 index 4f562cf..0000000 --- a/Tests/RunCMake/CPack/tests/CPACK_INSTALL_CMAKE_CONFIGURATIONS/test.cmake +++ /dev/null @@ -1,9 +0,0 @@ -set(CMAKE_CONFIGURATION_TYPES Debug Release) - -file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/debug.txt" "debug content") -file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/release.txt" "release content") - -install(FILES "${CMAKE_CURRENT_BINARY_DIR}/debug.txt" DESTINATION "foo" CONFIGURATIONS Debug) -install(FILES "${CMAKE_CURRENT_BINARY_DIR}/release.txt" DESTINATION "foo" CONFIGURATIONS Release) - -set(CPACK_INSTALL_CMAKE_CONFIGURATIONS ${CMAKE_CONFIGURATION_TYPES}) diff --git a/Tests/RunCMake/CPackCommandLine/CMakeLists.txt b/Tests/RunCMake/CPackCommandLine/CMakeLists.txt new file mode 100644 index 0000000..2632ffa --- /dev/null +++ b/Tests/RunCMake/CPackCommandLine/CMakeLists.txt @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 3.16) +project(${RunCMake_TEST} NONE) +include(${RunCMake_TEST}.cmake) diff --git a/Tests/RunCMake/CPackCommandLine/MultiConfig-check-stdout.txt b/Tests/RunCMake/CPackCommandLine/MultiConfig-check-stdout.txt new file mode 100644 index 0000000..f2ae844 --- /dev/null +++ b/Tests/RunCMake/CPackCommandLine/MultiConfig-check-stdout.txt @@ -0,0 +1,4 @@ +MultiConfig-0\.1\.1-[^/ +]*/lib/(lib|)foo_dbg\.(a|lib) +MultiConfig-0\.1\.1-[^/ +]*/lib/(lib|)foo_rel\.(a|lib) diff --git a/Tests/RunCMake/CPackCommandLine/MultiConfig-package-stdout.txt b/Tests/RunCMake/CPackCommandLine/MultiConfig-package-stdout.txt new file mode 100644 index 0000000..4fb8181 --- /dev/null +++ b/Tests/RunCMake/CPackCommandLine/MultiConfig-package-stdout.txt @@ -0,0 +1,8 @@ +^CPack: Create package using ZIP +CPack: Install projects +CPack: - Install project: MultiConfig \[Debug\] +CPack: - Install project: MultiConfig \[Release\] +CPack: Create package +CPack: - package: [^ +]*/Tests/RunCMake/CPackCommandLine/MultiConfig-build/MultiConfig-0.1.1-[^ +]*.zip generated.$ diff --git a/Tests/RunCMake/CPackCommandLine/MultiConfig.cmake b/Tests/RunCMake/CPackCommandLine/MultiConfig.cmake new file mode 100644 index 0000000..71fd189 --- /dev/null +++ b/Tests/RunCMake/CPackCommandLine/MultiConfig.cmake @@ -0,0 +1,9 @@ +enable_language(C) + +include(CPack) + +add_library(foo foo.c) +set_property(TARGET foo PROPERTY DEBUG_POSTFIX _dbg) +set_property(TARGET foo PROPERTY RELEASE_POSTFIX _rel) + +install(TARGETS foo) diff --git a/Tests/RunCMake/CPackCommandLine/RunCMakeTest.cmake b/Tests/RunCMake/CPackCommandLine/RunCMakeTest.cmake index 991146c..53f4e4f 100644 --- a/Tests/RunCMake/CPackCommandLine/RunCMakeTest.cmake +++ b/Tests/RunCMake/CPackCommandLine/RunCMakeTest.cmake @@ -8,3 +8,26 @@ set(CPACK_PACKAGE_VERSION "1") set(RunCMake_TEST_NO_CLEAN 1) run_cmake_command(NotAGenerator ${CMAKE_CPACK_COMMAND} -G NotAGenerator) unset(RunCMake_TEST_NO_CLEAN) + +function(run_MultiConfig) + set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/MultiConfig-build") + run_cmake(MultiConfig) + set(RunCMake_TEST_NO_CLEAN 1) + run_cmake_command(MultiConfig-build-dbg ${CMAKE_COMMAND} --build . --config Debug) + run_cmake_command(MultiConfig-build-rel ${CMAKE_COMMAND} --build . --config Release) + run_cmake_command(MultiConfig-package ${CMAKE_CPACK_COMMAND} -G ZIP -C "Debug\;Release") + set(zip_glob "${RunCMake_TEST_BINARY_DIR}/MultiConfig-0.1.1-*.zip") + file(GLOB zips "${zip_glob}") + set(zip_found 0) + foreach(zip IN LISTS zips) + set(zip_found 1) + run_cmake_command(MultiConfig-check ${CMAKE_COMMAND} -E tar tf "${zip}") + endforeach() + if(NOT zip_found) + message(SEND_ERROR "No package file found at\n ${zip_glob}") + endif() +endfunction() + +if(RunCMake_GENERATOR MATCHES "Visual Studio|Xcode") + run_MultiConfig() +endif() diff --git a/Tests/RunCMake/CPackCommandLine/foo.c b/Tests/RunCMake/CPackCommandLine/foo.c new file mode 100644 index 0000000..c83d856 --- /dev/null +++ b/Tests/RunCMake/CPackCommandLine/foo.c @@ -0,0 +1,4 @@ +int foo(void) +{ + return 0; +} diff --git a/Tests/RunCMake/CTestCommandLine/RunCMakeTest.cmake b/Tests/RunCMake/CTestCommandLine/RunCMakeTest.cmake index fd2c97f..6b23162 100644 --- a/Tests/RunCMake/CTestCommandLine/RunCMakeTest.cmake +++ b/Tests/RunCMake/CTestCommandLine/RunCMakeTest.cmake @@ -258,7 +258,7 @@ function(run_ShowOnly) add_test(ShowOnly \"${CMAKE_COMMAND}\" -E echo) set_tests_properties(ShowOnly PROPERTIES WILL_FAIL true - PROCESSES \"2,threads:2,gpus:4;gpus:2,threads:4\" + RESOURCE_GROUPS \"2,threads:2,gpus:4;gpus:2,threads:4\" REQUIRED_FILES RequiredFileDoesNotExist _BACKTRACE_TRIPLES \"file1;1;add_test;file0;;\" ) diff --git a/Tests/RunCMake/CTestCommandLine/show-only_json-v1_check.py b/Tests/RunCMake/CTestCommandLine/show-only_json-v1_check.py index 6eb8624..b818650 100644 --- a/Tests/RunCMake/CTestCommandLine/show-only_json-v1_check.py +++ b/Tests/RunCMake/CTestCommandLine/show-only_json-v1_check.py @@ -80,12 +80,12 @@ def check_willfail_property(p): assert p["name"] == "WILL_FAIL" assert p["value"] == True -def check_processes_property(p): +def check_resource_groups_property(p): assert is_dict(p) assert sorted(p.keys()) == ["name", "value"] assert is_string(p["name"]) assert is_list(p["value"]) - assert p["name"] == "PROCESSES" + assert p["name"] == "RESOURCE_GROUPS" assert len(p["value"]) == 3 assert is_dict(p["value"][0]) @@ -147,7 +147,7 @@ def check_workingdir_property(p): def check_properties(p): assert is_list(p) assert len(p) == 4 - check_processes_property(p[0]) + check_resource_groups_property(p[0]) check_reqfiles_property(p[1]) check_willfail_property(p[2]) check_workingdir_property(p[3]) diff --git a/Tests/RunCMake/CTestHardwareAllocation/HardwareCommon.cmake b/Tests/RunCMake/CTestHardwareAllocation/HardwareCommon.cmake deleted file mode 100644 index 3893d40..0000000 --- a/Tests/RunCMake/CTestHardwareAllocation/HardwareCommon.cmake +++ /dev/null @@ -1,23 +0,0 @@ -function(setup_hardware_tests) - if(CTEST_HARDWARE_ALLOC_ENABLED) - add_test(NAME HardwareSetup COMMAND "${CMAKE_COMMAND}" -E remove -f "${CMAKE_BINARY_DIR}/cthwalloc.log") - endif() -endfunction() - -function(add_hardware_test name sleep_time proc) - if(CTEST_HARDWARE_ALLOC_ENABLED) - add_test(NAME "${name}" COMMAND "${CTHWALLOC_COMMAND}" write "${CMAKE_BINARY_DIR}/cthwalloc.log" "${name}" "${sleep_time}" "${proc}") - set_property(TEST "${name}" PROPERTY DEPENDS HardwareSetup) - else() - add_test(NAME "${name}" COMMAND "${CTHWALLOC_COMMAND}" write "${CMAKE_BINARY_DIR}/cthwalloc.log" "${name}" "${sleep_time}") - endif() - set_property(TEST "${name}" PROPERTY PROCESSES "${proc}") - list(APPEND HARDWARE_TESTS "${name}") - set(HARDWARE_TESTS "${HARDWARE_TESTS}" PARENT_SCOPE) -endfunction() - -function(cleanup_hardware_tests) - if(CTEST_HARDWARE_ALLOC_ENABLED) - file(WRITE "${CMAKE_BINARY_DIR}/hwtests.txt" "${HARDWARE_TESTS}") - endif() -endfunction() diff --git a/Tests/RunCMake/CTestHardwareAllocation/RunCMakeTest.cmake b/Tests/RunCMake/CTestHardwareAllocation/RunCMakeTest.cmake deleted file mode 100644 index d666922..0000000 --- a/Tests/RunCMake/CTestHardwareAllocation/RunCMakeTest.cmake +++ /dev/null @@ -1,167 +0,0 @@ -include(RunCMake) -include(RunCTest) - -############################################################################### -# Test cthwalloc itself - we want to make sure it's not just rubber-stamping -# the test results -############################################################################### - -function(cthwalloc_verify_log expected_contents) - if(NOT EXISTS "${RunCMake_TEST_BINARY_DIR}/cthwalloc.log") - string(APPEND RunCMake_TEST_FAILED "Log file was not written\n") - set(RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}" PARENT_SCOPE) - return() - endif() - file(READ "${RunCMake_TEST_BINARY_DIR}/cthwalloc.log" actual_contents) - if(NOT actual_contents STREQUAL expected_contents) - string(APPEND RunCMake_TEST_FAILED "Actual log did not match expected log\n") - set(RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}" PARENT_SCOPE) - endif() -endfunction() - -function(run_cthwalloc_write_proc name proc) - file(REMOVE "${RunCMake_BINARY_DIR}/${name}-build/cthwalloc.log") - run_cthwalloc_write_proc_nodel("${name}" "${proc}" "${ARGN}") -endfunction() - -function(run_cthwalloc_write_proc_nodel name proc) - string(REPLACE ";" "\\;" proc "${proc}") - run_cmake_command(${name} "${CMAKE_COMMAND}" -E env "${ARGN}" "${CTHWALLOC_COMMAND}" write "${RunCMake_BINARY_DIR}/${name}-build/cthwalloc.log" "${name}" 0 "${proc}") -endfunction() - -function(run_cthwalloc_write_noproc name) - run_cmake_command(${name} "${CMAKE_COMMAND}" -E env "${ARGN}" "${CTHWALLOC_COMMAND}" write "${RunCMake_BINARY_DIR}/${name}-build/cthwalloc.log" "${name}" 0) -endfunction() - -function(run_cthwalloc_verify name tests) - string(REPLACE ";" "\\;" tests "${tests}") - run_cmake_command(${name} "${CTHWALLOC_COMMAND}" verify "${RunCMake_SOURCE_DIR}/${name}.log" "${CMAKE_CURRENT_LIST_DIR}/hwspec.json" "${tests}") -endfunction() - -unset(ENV{CTEST_PROCESS_COUNT}) -set(RunCMake_TEST_NO_CLEAN 1) -file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/cthwalloc-write-proc-good1-build") -file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/cthwalloc-write-proc-good1-build") -file(WRITE "${RunCMake_BINARY_DIR}/cthwalloc-write-proc-good1-build/cthwalloc.log" -[[begin test1 -alloc widgets 0 1 -dealloc widgets 0 1 -end test1 -]]) -run_cthwalloc_write_proc_nodel(cthwalloc-write-proc-good1 "1,widgets:2,transmogrifiers:1;2,widgets:1,widgets:2" - CTEST_PROCESS_COUNT=3 - CTEST_PROCESS_0=widgets,transmogrifiers - CTEST_PROCESS_0_WIDGETS=id:0,slots:2 - CTEST_PROCESS_0_TRANSMOGRIFIERS=id:calvin,slots:1 - CTEST_PROCESS_1=widgets - "CTEST_PROCESS_1_WIDGETS=id:0,slots:1\\;id:2,slots:2" - CTEST_PROCESS_2=widgets - "CTEST_PROCESS_2_WIDGETS=id:0,slots:1\\;id:2,slots:2" - ) -set(RunCMake_TEST_NO_CLEAN 0) -run_cthwalloc_write_proc(cthwalloc-write-proc-good2 "widgets:8" - CTEST_PROCESS_COUNT=1 - CTEST_PROCESS_0=widgets - CTEST_PROCESS_0_WIDGETS=id:3,slots:8 - ) -run_cthwalloc_write_proc(cthwalloc-write-proc-nocount "widgets:8") -run_cthwalloc_write_proc(cthwalloc-write-proc-badcount "widgets:8" - CTEST_PROCESS_COUNT=2 - ) -run_cthwalloc_write_proc(cthwalloc-write-proc-nores "widgets:8" - CTEST_PROCESS_COUNT=1 - ) -run_cthwalloc_write_proc(cthwalloc-write-proc-badres "widgets:8" - CTEST_PROCESS_COUNT=1 - CTEST_PROCESS_0=widgets,transmogrifiers - ) -run_cthwalloc_write_proc(cthwalloc-write-proc-nowidgets "widgets:8" - CTEST_PROCESS_COUNT=1 - CTEST_PROCESS_0=widgets - ) -run_cthwalloc_write_proc(cthwalloc-write-proc-badwidgets1 "widgets:8" - CTEST_PROCESS_COUNT=1 - CTEST_PROCESS_0=widgets - CTEST_PROCESS_0_WIDGETS= - ) -run_cthwalloc_write_proc(cthwalloc-write-proc-badwidgets2 "widgets:8" - CTEST_PROCESS_COUNT=1 - CTEST_PROCESS_0=widgets - "CTEST_PROCESS_0_WIDGETS=id:3,slots:8\\;id:0,slots:1" - ) -run_cthwalloc_write_proc(cthwalloc-write-proc-badwidgets3 "widgets:8" - CTEST_PROCESS_COUNT=1 - CTEST_PROCESS_0=widgets - CTEST_PROCESS_0_WIDGETS=id:3,slots:7 - ) -run_cthwalloc_write_proc(cthwalloc-write-proc-badwidgets4 "widgets:8" - CTEST_PROCESS_COUNT=1 - CTEST_PROCESS_0=widgets - CTEST_PROCESS_0_WIDGETS=invalid - ) -run_cthwalloc_write_proc(cthwalloc-write-proc-badwidgets5 "widgets:2,widgets:2" - CTEST_PROCESS_COUNT=1 - CTEST_PROCESS_0=widgets - "CTEST_PROCESS_0_WIDGETS=id:0,slots:2\\;id:0,slots:1" - ) -run_cthwalloc_write_proc(cthwalloc-write-proc-badwidgets6 "widgets:2" - CTEST_PROCESS_COUNT=1 - CTEST_PROCESS_0=widgets - "CTEST_PROCESS_0_WIDGETS=id:0,slots:2\\;id:0,slots:1" - ) -run_cthwalloc_write_proc(cthwalloc-write-proc-badwidgets7 "widgets:2,widgets:2" - CTEST_PROCESS_COUNT=1 - CTEST_PROCESS_0=widgets - CTEST_PROCESS_0_WIDGETS=id:0,slots:2 - ) - -run_cthwalloc_write_noproc(cthwalloc-write-noproc-good1) -run_cthwalloc_write_noproc(cthwalloc-write-noproc-count - CTEST_PROCESS_COUNT=1 - ) - -run_cthwalloc_verify(cthwalloc-verify-good1 "test1;test2") -run_cthwalloc_verify(cthwalloc-verify-good2 "") -run_cthwalloc_verify(cthwalloc-verify-nolog "") -run_cthwalloc_verify(cthwalloc-verify-nores "") -run_cthwalloc_verify(cthwalloc-verify-noid "") -run_cthwalloc_verify(cthwalloc-verify-notenough "") -run_cthwalloc_verify(cthwalloc-verify-baddealloc "") -run_cthwalloc_verify(cthwalloc-verify-leak "") -run_cthwalloc_verify(cthwalloc-verify-badtest1 "") -run_cthwalloc_verify(cthwalloc-verify-badtest2 "test1") -run_cthwalloc_verify(cthwalloc-verify-badtest3 "test1") -run_cthwalloc_verify(cthwalloc-verify-badtest4 "test1") -run_cthwalloc_verify(cthwalloc-verify-badtest5 "test1") -run_cthwalloc_verify(cthwalloc-verify-nobegin "test1") -run_cthwalloc_verify(cthwalloc-verify-noend "test1") - -############################################################################### -# Now test the hardware allocation feature of CTest -############################################################################### - -function(run_ctest_hardware name parallel random) - run_ctest("${name}-ctest-s-hw" "-DCTEST_HARDWARE_ALLOC_ENABLED=1" "-DCTHWALLOC_COMMAND=${CTHWALLOC_COMMAND}" "-DCTEST_PARALLEL=${parallel}" "-DCTEST_RANDOM=${random}") - run_ctest("${name}-ctest-s-nohw" "-DCTEST_HARDWARE_ALLOC_ENABLED=0" "-DCTHWALLOC_COMMAND=${CTHWALLOC_COMMAND}" "-DCTEST_PARALLEL=${parallel}" "-DCTEST_RANDOM=${random}") -endfunction() - -function(verify_ctest_hardware) - file(READ "${RunCMake_TEST_BINARY_DIR}/hwtests.txt" hwtests) - execute_process(COMMAND "${CTHWALLOC_COMMAND}" verify "${RunCMake_TEST_BINARY_DIR}/cthwalloc.log" "${CMAKE_CURRENT_LIST_DIR}/hwspec.json" "${hwtests}" - OUTPUT_VARIABLE output ERROR_QUIET RESULT_VARIABLE result) - if(result) - string(APPEND RunCMake_TEST_FAILED "${output}") - set(RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}" PARENT_SCOPE) - endif() -endfunction() - -run_ctest_hardware(lotsoftests 10 1) -run_ctest_hardware(checkfree1 2 0) -run_ctest_hardware(checkfree2 1 0) -run_ctest_hardware(notenough1 1 0) -run_ctest_hardware(notenough2 1 0) -run_ctest_hardware(ensure_parallel 2 0) - -set(ENV{CTEST_PROCESS_COUNT} 2) -run_ctest_hardware(process_count 1 0) -unset(ENV{CTEST_PROCESS_COUNT}) diff --git a/Tests/RunCMake/CTestHardwareAllocation/checkfree1-ctest-s-hw-check.cmake b/Tests/RunCMake/CTestHardwareAllocation/checkfree1-ctest-s-hw-check.cmake deleted file mode 100644 index 94b1fa7..0000000 --- a/Tests/RunCMake/CTestHardwareAllocation/checkfree1-ctest-s-hw-check.cmake +++ /dev/null @@ -1 +0,0 @@ -verify_ctest_hardware() diff --git a/Tests/RunCMake/CTestHardwareAllocation/checkfree1.cmake b/Tests/RunCMake/CTestHardwareAllocation/checkfree1.cmake deleted file mode 100644 index 0e997b5..0000000 --- a/Tests/RunCMake/CTestHardwareAllocation/checkfree1.cmake +++ /dev/null @@ -1,7 +0,0 @@ -setup_hardware_tests() - -add_hardware_test(Test1 1 "widgets:8") -add_hardware_test(Test2 1 "fluxcapacitors:50;fluxcapacitors:50,widgets:8") -add_hardware_test(Test3 1 "fluxcapacitors:121") - -cleanup_hardware_tests() diff --git a/Tests/RunCMake/CTestHardwareAllocation/checkfree2-ctest-s-hw-check.cmake b/Tests/RunCMake/CTestHardwareAllocation/checkfree2-ctest-s-hw-check.cmake deleted file mode 100644 index 94b1fa7..0000000 --- a/Tests/RunCMake/CTestHardwareAllocation/checkfree2-ctest-s-hw-check.cmake +++ /dev/null @@ -1 +0,0 @@ -verify_ctest_hardware() diff --git a/Tests/RunCMake/CTestHardwareAllocation/checkfree2.cmake b/Tests/RunCMake/CTestHardwareAllocation/checkfree2.cmake deleted file mode 100644 index 3c2b666..0000000 --- a/Tests/RunCMake/CTestHardwareAllocation/checkfree2.cmake +++ /dev/null @@ -1,8 +0,0 @@ -setup_hardware_tests() - -# This test is an attack on the hardware scheduling algorithm. It has been -# carefully crafted to fool the algorithm into thinking there isn't sufficient -# hardware for it. -add_hardware_test(Test1 1 "widgets:2;4,widgets:4") - -cleanup_hardware_tests() diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-good2-check.cmake b/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-good2-check.cmake deleted file mode 100644 index ca0c6b8..0000000 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-good2-check.cmake +++ /dev/null @@ -1,6 +0,0 @@ -cthwalloc_verify_log( -[[begin cthwalloc-write-proc-good2 -alloc widgets 3 8 -dealloc widgets 3 8 -end cthwalloc-write-proc-good2 -]]) diff --git a/Tests/RunCMake/CTestHardwareAllocation/lotsoftests-ctest-s-hw-check.cmake b/Tests/RunCMake/CTestHardwareAllocation/lotsoftests-ctest-s-hw-check.cmake deleted file mode 100644 index 94b1fa7..0000000 --- a/Tests/RunCMake/CTestHardwareAllocation/lotsoftests-ctest-s-hw-check.cmake +++ /dev/null @@ -1 +0,0 @@ -verify_ctest_hardware() diff --git a/Tests/RunCMake/CTestHardwareAllocation/lotsoftests.cmake b/Tests/RunCMake/CTestHardwareAllocation/lotsoftests.cmake deleted file mode 100644 index c684434..0000000 --- a/Tests/RunCMake/CTestHardwareAllocation/lotsoftests.cmake +++ /dev/null @@ -1,16 +0,0 @@ -setup_hardware_tests() - -add_hardware_test(Test1 2 "widgets:8;2,widgets:2") -add_hardware_test(Test2 5 "fluxcapacitors:40") -add_hardware_test(Test3 1 "10,widgets:1,fluxcapacitors:2") -add_hardware_test(Test4 4 "fluxcapacitors:121") - -foreach(i RANGE 5 50) - add_hardware_test(Test${i} 1 "2,widgets:1") -endforeach() - -foreach(i RANGE 51 100) - add_hardware_test(Test${i} 1 "2,transmogrifiers:2") -endforeach() - -cleanup_hardware_tests() diff --git a/Tests/RunCMake/CTestHardwareAllocation/notenough1-ctest-s-hw-check.cmake b/Tests/RunCMake/CTestHardwareAllocation/notenough1-ctest-s-hw-check.cmake deleted file mode 100644 index 9c730be..0000000 --- a/Tests/RunCMake/CTestHardwareAllocation/notenough1-ctest-s-hw-check.cmake +++ /dev/null @@ -1,3 +0,0 @@ -if(EXISTS "${RunCMake_TEST_BINARY_DIR}/cthwalloc.log") - set(RunCMake_TEST_FAILED "cthwalloc.log should not exist") -endif() diff --git a/Tests/RunCMake/CTestHardwareAllocation/notenough1-ctest-s-hw-stderr.txt b/Tests/RunCMake/CTestHardwareAllocation/notenough1-ctest-s-hw-stderr.txt deleted file mode 100644 index d465cd3..0000000 --- a/Tests/RunCMake/CTestHardwareAllocation/notenough1-ctest-s-hw-stderr.txt +++ /dev/null @@ -1,4 +0,0 @@ -^Insufficient hardware -CMake Error at [^ -]*/Tests/RunCMake/CTestHardwareAllocation/notenough1-ctest-s-hw/test\.cmake:[0-9]+ \(message\): - Tests did not pass$ diff --git a/Tests/RunCMake/CTestHardwareAllocation/notenough1.cmake b/Tests/RunCMake/CTestHardwareAllocation/notenough1.cmake deleted file mode 100644 index 3e1f620..0000000 --- a/Tests/RunCMake/CTestHardwareAllocation/notenough1.cmake +++ /dev/null @@ -1,5 +0,0 @@ -setup_hardware_tests() - -add_hardware_test(Test1 1 "fluxcapacitors:200") - -cleanup_hardware_tests() diff --git a/Tests/RunCMake/CTestHardwareAllocation/notenough2-ctest-s-hw-check.cmake b/Tests/RunCMake/CTestHardwareAllocation/notenough2-ctest-s-hw-check.cmake deleted file mode 100644 index 9c730be..0000000 --- a/Tests/RunCMake/CTestHardwareAllocation/notenough2-ctest-s-hw-check.cmake +++ /dev/null @@ -1,3 +0,0 @@ -if(EXISTS "${RunCMake_TEST_BINARY_DIR}/cthwalloc.log") - set(RunCMake_TEST_FAILED "cthwalloc.log should not exist") -endif() diff --git a/Tests/RunCMake/CTestHardwareAllocation/notenough2-ctest-s-hw-stderr.txt b/Tests/RunCMake/CTestHardwareAllocation/notenough2-ctest-s-hw-stderr.txt deleted file mode 100644 index 912f0fb..0000000 --- a/Tests/RunCMake/CTestHardwareAllocation/notenough2-ctest-s-hw-stderr.txt +++ /dev/null @@ -1,4 +0,0 @@ -^Insufficient hardware -CMake Error at [^ -]*/Tests/RunCMake/CTestHardwareAllocation/notenough2-ctest-s-hw/test\.cmake:[0-9]+ \(message\): - Tests did not pass$ diff --git a/Tests/RunCMake/CTestHardwareAllocation/notenough2.cmake b/Tests/RunCMake/CTestHardwareAllocation/notenough2.cmake deleted file mode 100644 index 8205c95..0000000 --- a/Tests/RunCMake/CTestHardwareAllocation/notenough2.cmake +++ /dev/null @@ -1,5 +0,0 @@ -setup_hardware_tests() - -add_hardware_test(Test1 1 "terminators:2") - -cleanup_hardware_tests() diff --git a/Tests/RunCMake/CTestHardwareAllocation/process_count-ctest-s-hw-check.cmake b/Tests/RunCMake/CTestHardwareAllocation/process_count-ctest-s-hw-check.cmake deleted file mode 100644 index 94b1fa7..0000000 --- a/Tests/RunCMake/CTestHardwareAllocation/process_count-ctest-s-hw-check.cmake +++ /dev/null @@ -1 +0,0 @@ -verify_ctest_hardware() diff --git a/Tests/RunCMake/CTestHardwareAllocation/process_count.cmake b/Tests/RunCMake/CTestHardwareAllocation/process_count.cmake deleted file mode 100644 index c969648..0000000 --- a/Tests/RunCMake/CTestHardwareAllocation/process_count.cmake +++ /dev/null @@ -1,5 +0,0 @@ -setup_hardware_tests() - -add_hardware_test(Test1 1 "widgets:1") - -cleanup_hardware_tests() diff --git a/Tests/RunCMake/CTestHardwareAllocation/CMakeLists.txt.in b/Tests/RunCMake/CTestResourceAllocation/CMakeLists.txt.in index d6cff63..9984421 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/CMakeLists.txt.in +++ b/Tests/RunCMake/CTestResourceAllocation/CMakeLists.txt.in @@ -4,6 +4,6 @@ if(CASE_NAME MATCHES "^(.*)-ctest-s") set(projname "${CMAKE_MATCH_1}") project(${projname} NONE) include(CTest) - include("@RunCMake_SOURCE_DIR@/HardwareCommon.cmake") + include("@RunCMake_SOURCE_DIR@/ResourceCommon.cmake") include("@RunCMake_SOURCE_DIR@/${projname}.cmake") endif() diff --git a/Tests/RunCMake/CTestResourceAllocation/ResourceCommon.cmake b/Tests/RunCMake/CTestResourceAllocation/ResourceCommon.cmake new file mode 100644 index 0000000..7d63299 --- /dev/null +++ b/Tests/RunCMake/CTestResourceAllocation/ResourceCommon.cmake @@ -0,0 +1,23 @@ +function(setup_resource_tests) + if(CTEST_RESOURCE_ALLOC_ENABLED) + add_test(NAME ResourceSetup COMMAND "${CMAKE_COMMAND}" -E remove -f "${CMAKE_BINARY_DIR}/ctresalloc.log") + endif() +endfunction() + +function(add_resource_test name sleep_time proc) + if(CTEST_RESOURCE_ALLOC_ENABLED) + add_test(NAME "${name}" COMMAND "${CTRESALLOC_COMMAND}" write "${CMAKE_BINARY_DIR}/ctresalloc.log" "${name}" "${sleep_time}" "${proc}") + set_property(TEST "${name}" PROPERTY DEPENDS ResourceSetup) + else() + add_test(NAME "${name}" COMMAND "${CTRESALLOC_COMMAND}" write "${CMAKE_BINARY_DIR}/ctresalloc.log" "${name}" "${sleep_time}") + endif() + set_property(TEST "${name}" PROPERTY RESOURCE_GROUPS "${proc}") + list(APPEND RESOURCE_TESTS "${name}") + set(RESOURCE_TESTS "${RESOURCE_TESTS}" PARENT_SCOPE) +endfunction() + +function(cleanup_resource_tests) + if(CTEST_RESOURCE_ALLOC_ENABLED) + file(WRITE "${CMAKE_BINARY_DIR}/restests.txt" "${RESOURCE_TESTS}") + endif() +endfunction() diff --git a/Tests/RunCMake/CTestResourceAllocation/RunCMakeTest.cmake b/Tests/RunCMake/CTestResourceAllocation/RunCMakeTest.cmake new file mode 100644 index 0000000..d52a63e --- /dev/null +++ b/Tests/RunCMake/CTestResourceAllocation/RunCMakeTest.cmake @@ -0,0 +1,167 @@ +include(RunCMake) +include(RunCTest) + +############################################################################### +# Test ctresalloc itself - we want to make sure it's not just rubber-stamping +# the test results +############################################################################### + +function(ctresalloc_verify_log expected_contents) + if(NOT EXISTS "${RunCMake_TEST_BINARY_DIR}/ctresalloc.log") + string(APPEND RunCMake_TEST_FAILED "Log file was not written\n") + set(RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}" PARENT_SCOPE) + return() + endif() + file(READ "${RunCMake_TEST_BINARY_DIR}/ctresalloc.log" actual_contents) + if(NOT actual_contents STREQUAL expected_contents) + string(APPEND RunCMake_TEST_FAILED "Actual log did not match expected log\n") + set(RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}" PARENT_SCOPE) + endif() +endfunction() + +function(run_ctresalloc_write_proc name proc) + file(REMOVE "${RunCMake_BINARY_DIR}/${name}-build/ctresalloc.log") + run_ctresalloc_write_proc_nodel("${name}" "${proc}" "${ARGN}") +endfunction() + +function(run_ctresalloc_write_proc_nodel name proc) + string(REPLACE ";" "\\;" proc "${proc}") + run_cmake_command(${name} "${CMAKE_COMMAND}" -E env "${ARGN}" "${CTRESALLOC_COMMAND}" write "${RunCMake_BINARY_DIR}/${name}-build/ctresalloc.log" "${name}" 0 "${proc}") +endfunction() + +function(run_ctresalloc_write_noproc name) + run_cmake_command(${name} "${CMAKE_COMMAND}" -E env "${ARGN}" "${CTRESALLOC_COMMAND}" write "${RunCMake_BINARY_DIR}/${name}-build/ctresalloc.log" "${name}" 0) +endfunction() + +function(run_ctresalloc_verify name tests) + string(REPLACE ";" "\\;" tests "${tests}") + run_cmake_command(${name} "${CTRESALLOC_COMMAND}" verify "${RunCMake_SOURCE_DIR}/${name}.log" "${CMAKE_CURRENT_LIST_DIR}/resspec.json" "${tests}") +endfunction() + +unset(ENV{CTEST_RESOURCE_GROUP_COUNT}) +set(RunCMake_TEST_NO_CLEAN 1) +file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/ctresalloc-write-proc-good1-build") +file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/ctresalloc-write-proc-good1-build") +file(WRITE "${RunCMake_BINARY_DIR}/ctresalloc-write-proc-good1-build/ctresalloc.log" +[[begin test1 +alloc widgets 0 1 +dealloc widgets 0 1 +end test1 +]]) +run_ctresalloc_write_proc_nodel(ctresalloc-write-proc-good1 "1,widgets:2,transmogrifiers:1;2,widgets:1,widgets:2" + CTEST_RESOURCE_GROUP_COUNT=3 + CTEST_RESOURCE_GROUP_0=widgets,transmogrifiers + CTEST_RESOURCE_GROUP_0_WIDGETS=id:0,slots:2 + CTEST_RESOURCE_GROUP_0_TRANSMOGRIFIERS=id:calvin,slots:1 + CTEST_RESOURCE_GROUP_1=widgets + "CTEST_RESOURCE_GROUP_1_WIDGETS=id:0,slots:1\\;id:2,slots:2" + CTEST_RESOURCE_GROUP_2=widgets + "CTEST_RESOURCE_GROUP_2_WIDGETS=id:0,slots:1\\;id:2,slots:2" + ) +set(RunCMake_TEST_NO_CLEAN 0) +run_ctresalloc_write_proc(ctresalloc-write-proc-good2 "widgets:8" + CTEST_RESOURCE_GROUP_COUNT=1 + CTEST_RESOURCE_GROUP_0=widgets + CTEST_RESOURCE_GROUP_0_WIDGETS=id:3,slots:8 + ) +run_ctresalloc_write_proc(ctresalloc-write-proc-nocount "widgets:8") +run_ctresalloc_write_proc(ctresalloc-write-proc-badcount "widgets:8" + CTEST_RESOURCE_GROUP_COUNT=2 + ) +run_ctresalloc_write_proc(ctresalloc-write-proc-nores "widgets:8" + CTEST_RESOURCE_GROUP_COUNT=1 + ) +run_ctresalloc_write_proc(ctresalloc-write-proc-badres "widgets:8" + CTEST_RESOURCE_GROUP_COUNT=1 + CTEST_RESOURCE_GROUP_0=widgets,transmogrifiers + ) +run_ctresalloc_write_proc(ctresalloc-write-proc-nowidgets "widgets:8" + CTEST_RESOURCE_GROUP_COUNT=1 + CTEST_RESOURCE_GROUP_0=widgets + ) +run_ctresalloc_write_proc(ctresalloc-write-proc-badwidgets1 "widgets:8" + CTEST_RESOURCE_GROUP_COUNT=1 + CTEST_RESOURCE_GROUP_0=widgets + CTEST_RESOURCE_GROUP_0_WIDGETS= + ) +run_ctresalloc_write_proc(ctresalloc-write-proc-badwidgets2 "widgets:8" + CTEST_RESOURCE_GROUP_COUNT=1 + CTEST_RESOURCE_GROUP_0=widgets + "CTEST_RESOURCE_GROUP_0_WIDGETS=id:3,slots:8\\;id:0,slots:1" + ) +run_ctresalloc_write_proc(ctresalloc-write-proc-badwidgets3 "widgets:8" + CTEST_RESOURCE_GROUP_COUNT=1 + CTEST_RESOURCE_GROUP_0=widgets + CTEST_RESOURCE_GROUP_0_WIDGETS=id:3,slots:7 + ) +run_ctresalloc_write_proc(ctresalloc-write-proc-badwidgets4 "widgets:8" + CTEST_RESOURCE_GROUP_COUNT=1 + CTEST_RESOURCE_GROUP_0=widgets + CTEST_RESOURCE_GROUP_0_WIDGETS=invalid + ) +run_ctresalloc_write_proc(ctresalloc-write-proc-badwidgets5 "widgets:2,widgets:2" + CTEST_RESOURCE_GROUP_COUNT=1 + CTEST_RESOURCE_GROUP_0=widgets + "CTEST_RESOURCE_GROUP_0_WIDGETS=id:0,slots:2\\;id:0,slots:1" + ) +run_ctresalloc_write_proc(ctresalloc-write-proc-badwidgets6 "widgets:2" + CTEST_RESOURCE_GROUP_COUNT=1 + CTEST_RESOURCE_GROUP_0=widgets + "CTEST_RESOURCE_GROUP_0_WIDGETS=id:0,slots:2\\;id:0,slots:1" + ) +run_ctresalloc_write_proc(ctresalloc-write-proc-badwidgets7 "widgets:2,widgets:2" + CTEST_RESOURCE_GROUP_COUNT=1 + CTEST_RESOURCE_GROUP_0=widgets + CTEST_RESOURCE_GROUP_0_WIDGETS=id:0,slots:2 + ) + +run_ctresalloc_write_noproc(ctresalloc-write-noproc-good1) +run_ctresalloc_write_noproc(ctresalloc-write-noproc-count + CTEST_RESOURCE_GROUP_COUNT=1 + ) + +run_ctresalloc_verify(ctresalloc-verify-good1 "test1;test2") +run_ctresalloc_verify(ctresalloc-verify-good2 "") +run_ctresalloc_verify(ctresalloc-verify-nolog "") +run_ctresalloc_verify(ctresalloc-verify-nores "") +run_ctresalloc_verify(ctresalloc-verify-noid "") +run_ctresalloc_verify(ctresalloc-verify-notenough "") +run_ctresalloc_verify(ctresalloc-verify-baddealloc "") +run_ctresalloc_verify(ctresalloc-verify-leak "") +run_ctresalloc_verify(ctresalloc-verify-badtest1 "") +run_ctresalloc_verify(ctresalloc-verify-badtest2 "test1") +run_ctresalloc_verify(ctresalloc-verify-badtest3 "test1") +run_ctresalloc_verify(ctresalloc-verify-badtest4 "test1") +run_ctresalloc_verify(ctresalloc-verify-badtest5 "test1") +run_ctresalloc_verify(ctresalloc-verify-nobegin "test1") +run_ctresalloc_verify(ctresalloc-verify-noend "test1") + +############################################################################### +# Now test the resource allocation feature of CTest +############################################################################### + +function(run_ctest_resource name parallel random) + run_ctest("${name}-ctest-s-res" "-DCTEST_RESOURCE_ALLOC_ENABLED=1" "-DCTRESALLOC_COMMAND=${CTRESALLOC_COMMAND}" "-DCTEST_PARALLEL=${parallel}" "-DCTEST_RANDOM=${random}") + run_ctest("${name}-ctest-s-nores" "-DCTEST_RESOURCE_ALLOC_ENABLED=0" "-DCTRESALLOC_COMMAND=${CTRESALLOC_COMMAND}" "-DCTEST_PARALLEL=${parallel}" "-DCTEST_RANDOM=${random}") +endfunction() + +function(verify_ctest_resources) + file(READ "${RunCMake_TEST_BINARY_DIR}/restests.txt" restests) + execute_process(COMMAND "${CTRESALLOC_COMMAND}" verify "${RunCMake_TEST_BINARY_DIR}/ctresalloc.log" "${CMAKE_CURRENT_LIST_DIR}/resspec.json" "${restests}" + OUTPUT_VARIABLE output ERROR_QUIET RESULT_VARIABLE result) + if(result) + string(APPEND RunCMake_TEST_FAILED "${output}") + set(RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}" PARENT_SCOPE) + endif() +endfunction() + +run_ctest_resource(lotsoftests 10 1) +run_ctest_resource(checkfree1 2 0) +run_ctest_resource(checkfree2 1 0) +run_ctest_resource(notenough1 1 0) +run_ctest_resource(notenough2 1 0) +run_ctest_resource(ensure_parallel 2 0) + +set(ENV{CTEST_RESOURCE_GROUP_COUNT} 2) +run_ctest_resource(process_count 1 0) +unset(ENV{CTEST_RESOURCE_GROUP_COUNT}) diff --git a/Tests/RunCMake/CTestResourceAllocation/checkfree1-ctest-s-res-check.cmake b/Tests/RunCMake/CTestResourceAllocation/checkfree1-ctest-s-res-check.cmake new file mode 100644 index 0000000..ceda72e --- /dev/null +++ b/Tests/RunCMake/CTestResourceAllocation/checkfree1-ctest-s-res-check.cmake @@ -0,0 +1 @@ +verify_ctest_resources() diff --git a/Tests/RunCMake/CTestResourceAllocation/checkfree1.cmake b/Tests/RunCMake/CTestResourceAllocation/checkfree1.cmake new file mode 100644 index 0000000..45cbf20 --- /dev/null +++ b/Tests/RunCMake/CTestResourceAllocation/checkfree1.cmake @@ -0,0 +1,7 @@ +setup_resource_tests() + +add_resource_test(Test1 1 "widgets:8") +add_resource_test(Test2 1 "fluxcapacitors:50;fluxcapacitors:50,widgets:8") +add_resource_test(Test3 1 "fluxcapacitors:121") + +cleanup_resource_tests() diff --git a/Tests/RunCMake/CTestResourceAllocation/checkfree2-ctest-s-res-check.cmake b/Tests/RunCMake/CTestResourceAllocation/checkfree2-ctest-s-res-check.cmake new file mode 100644 index 0000000..ceda72e --- /dev/null +++ b/Tests/RunCMake/CTestResourceAllocation/checkfree2-ctest-s-res-check.cmake @@ -0,0 +1 @@ +verify_ctest_resources() diff --git a/Tests/RunCMake/CTestResourceAllocation/checkfree2.cmake b/Tests/RunCMake/CTestResourceAllocation/checkfree2.cmake new file mode 100644 index 0000000..03b737c --- /dev/null +++ b/Tests/RunCMake/CTestResourceAllocation/checkfree2.cmake @@ -0,0 +1,8 @@ +setup_resource_tests() + +# This test is an attack on the resource scheduling algorithm. It has been +# carefully crafted to fool the algorithm into thinking there aren't sufficient +# resources for it. +add_resource_test(Test1 1 "widgets:2;4,widgets:4") + +cleanup_resource_tests() diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-nowidgets-result.txt b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-baddealloc-result.txt index d00491f..d00491f 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-nowidgets-result.txt +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-baddealloc-result.txt diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-baddealloc.log b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-baddealloc.log index abd6bad..abd6bad 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-baddealloc.log +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-baddealloc.log diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-nores-result.txt b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-badtest1-result.txt index d00491f..d00491f 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-nores-result.txt +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-badtest1-result.txt diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-noend.log b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-badtest1.log index 605104b..605104b 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-noend.log +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-badtest1.log diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-nocount-result.txt b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-badtest2-result.txt index d00491f..d00491f 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-nocount-result.txt +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-badtest2-result.txt diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-badtest2.log b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-badtest2.log index 1ff1b0d..1ff1b0d 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-badtest2.log +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-badtest2.log diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-badwidgets7-result.txt b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-badtest3-result.txt index d00491f..d00491f 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-badwidgets7-result.txt +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-badtest3-result.txt diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-badtest3.log b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-badtest3.log index 1925e6a..1925e6a 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-badtest3.log +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-badtest3.log diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-badwidgets6-result.txt b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-badtest4-result.txt index d00491f..d00491f 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-badwidgets6-result.txt +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-badtest4-result.txt diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-badtest4.log b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-badtest4.log index 3fe7da1..3fe7da1 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-badtest4.log +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-badtest4.log diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-badwidgets5-result.txt b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-badtest5-result.txt index d00491f..d00491f 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-badwidgets5-result.txt +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-badtest5-result.txt diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-badtest5.log b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-badtest5.log index 3a2e7e3..3a2e7e3 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-badtest5.log +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-badtest5.log diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-good1.log b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-good1.log index 2cca0c3..2cca0c3 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-good1.log +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-good1.log diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-nobegin.log b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-good2.log index e69de29..e69de29 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-nobegin.log +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-good2.log diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-badwidgets4-result.txt b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-leak-result.txt index d00491f..d00491f 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-badwidgets4-result.txt +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-leak-result.txt diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-leak.log b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-leak.log index b900d86..b900d86 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-leak.log +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-leak.log diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-badwidgets3-result.txt b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-nobegin-result.txt index d00491f..d00491f 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-badwidgets3-result.txt +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-nobegin-result.txt diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-good2.log b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-nobegin.log index e69de29..e69de29 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-good2.log +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-nobegin.log diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-badwidgets2-result.txt b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-noend-result.txt index d00491f..d00491f 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-badwidgets2-result.txt +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-noend-result.txt diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-badtest1.log b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-noend.log index 605104b..605104b 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-badtest1.log +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-noend.log diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-badwidgets1-result.txt b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-noid-result.txt index d00491f..d00491f 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-badwidgets1-result.txt +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-noid-result.txt diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-noid.log b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-noid.log index c718975..c718975 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-noid.log +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-noid.log diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-badres-result.txt b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-nolog-result.txt index d00491f..d00491f 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-badres-result.txt +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-nolog-result.txt diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-badcount-result.txt b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-nores-result.txt index d00491f..d00491f 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-badcount-result.txt +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-nores-result.txt diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-nores.log b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-nores.log index a18202b..a18202b 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-nores.log +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-nores.log diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-noproc-count-result.txt b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-notenough-result.txt index d00491f..d00491f 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-noproc-count-result.txt +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-notenough-result.txt diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-notenough.log b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-notenough.log index ac78d5a..ac78d5a 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-notenough.log +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-verify-notenough.log diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-notenough-result.txt b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-noproc-count-result.txt index d00491f..d00491f 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-notenough-result.txt +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-noproc-count-result.txt diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-nores-result.txt b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-badcount-result.txt index d00491f..d00491f 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-nores-result.txt +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-badcount-result.txt diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-nolog-result.txt b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-badres-result.txt index d00491f..d00491f 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-nolog-result.txt +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-badres-result.txt diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-noid-result.txt b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-badwidgets1-result.txt index d00491f..d00491f 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-noid-result.txt +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-badwidgets1-result.txt diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-noend-result.txt b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-badwidgets2-result.txt index d00491f..d00491f 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-noend-result.txt +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-badwidgets2-result.txt diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-nobegin-result.txt b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-badwidgets3-result.txt index d00491f..d00491f 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-nobegin-result.txt +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-badwidgets3-result.txt diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-leak-result.txt b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-badwidgets4-result.txt index d00491f..d00491f 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-leak-result.txt +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-badwidgets4-result.txt diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-badtest5-result.txt b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-badwidgets5-result.txt index d00491f..d00491f 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-badtest5-result.txt +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-badwidgets5-result.txt diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-badtest4-result.txt b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-badwidgets6-result.txt index d00491f..d00491f 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-badtest4-result.txt +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-badwidgets6-result.txt diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-badtest3-result.txt b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-badwidgets7-result.txt index d00491f..d00491f 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-badtest3-result.txt +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-badwidgets7-result.txt diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-good1-check.cmake b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-good1-check.cmake index 949d2d7..40144c8 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-write-proc-good1-check.cmake +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-good1-check.cmake @@ -1,9 +1,9 @@ -cthwalloc_verify_log( +ctresalloc_verify_log( [[begin test1 alloc widgets 0 1 dealloc widgets 0 1 end test1 -begin cthwalloc-write-proc-good1 +begin ctresalloc-write-proc-good1 alloc transmogrifiers calvin 1 alloc widgets 0 2 alloc widgets 0 1 @@ -16,5 +16,5 @@ dealloc widgets 0 1 dealloc widgets 2 2 dealloc widgets 0 1 dealloc widgets 2 2 -end cthwalloc-write-proc-good1 +end ctresalloc-write-proc-good1 ]]) diff --git a/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-good2-check.cmake b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-good2-check.cmake new file mode 100644 index 0000000..4545466 --- /dev/null +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-good2-check.cmake @@ -0,0 +1,6 @@ +ctresalloc_verify_log( +[[begin ctresalloc-write-proc-good2 +alloc widgets 3 8 +dealloc widgets 3 8 +end ctresalloc-write-proc-good2 +]]) diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-badtest2-result.txt b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-nocount-result.txt index d00491f..d00491f 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-badtest2-result.txt +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-nocount-result.txt diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-badtest1-result.txt b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-nores-result.txt index d00491f..d00491f 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-badtest1-result.txt +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-nores-result.txt diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-baddealloc-result.txt b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-nowidgets-result.txt index d00491f..d00491f 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc-verify-baddealloc-result.txt +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc-write-proc-nowidgets-result.txt diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc.cxx b/Tests/RunCMake/CTestResourceAllocation/ctresalloc.cxx index eee2c7f..27644af 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc.cxx +++ b/Tests/RunCMake/CTestResourceAllocation/ctresalloc.cxx @@ -13,9 +13,9 @@ #include "cmsys/Encoding.hxx" #include "cmsys/FStream.hxx" -#include "cmCTestHardwareAllocator.h" -#include "cmCTestHardwareSpec.h" #include "cmCTestMultiProcessHandler.h" +#include "cmCTestResourceAllocator.h" +#include "cmCTestResourceSpec.h" #include "cmCTestTestHandler.h" #include "cmFileLock.h" #include "cmFileLockResult.h" @@ -23,15 +23,15 @@ #include "cmSystemTools.h" /* - * This helper program is used to verify that the CTest hardware allocation + * This helper program is used to verify that the CTest resource allocation * feature is working correctly. It consists of two stages: * - * 1) write - This stage receives the PROCESSES property of the test and - * compares it with the values passed in the CTEST_PROCESS_* environment - * variables. If it received all of the resources it expected, then it - * writes this information to a log file, which will be read in the verify - * stage. - * 2) verify - This stage compares the log file with the hardware spec file to + * 1) write - This stage receives the RESOURCE_GROUPS property of the test and + * compares it with the values passed in the CTEST_RESOURCE_GROUP_* + * environment variables. If it received all of the resources it expected, + * then it writes this information to a log file, which will be read in + * the verify stage. + * 2) verify - This stage compares the log file with the resource spec file to * make sure that no resources were over-subscribed, deallocated without * being allocated, or allocated without being deallocated. */ @@ -46,7 +46,7 @@ static int usageWrite(const char* argv0) { std::cout << "Usage: " << argv0 << " write <log-file> <test-name> <sleep-time-secs>" - " [<processes-property>]" + " [<resource-groups-property>]" << std::endl; return 1; } @@ -54,7 +54,7 @@ static int usageWrite(const char* argv0) static int usageVerify(const char* argv0) { std::cout << "Usage: " << argv0 - << " verify <log-file> <hardware-spec-file> [<test-names>]" + << " verify <log-file> <resource-spec-file> [<test-names>]" << std::endl; return 1; } @@ -68,31 +68,33 @@ static int doWrite(int argc, char const* const* argv) std::string testName = argv[3]; unsigned int sleepTime = std::atoi(argv[4]); std::vector<std::map< - std::string, std::vector<cmCTestMultiProcessHandler::HardwareAllocation>>> - hardware; + std::string, std::vector<cmCTestMultiProcessHandler::ResourceAllocation>>> + resources; if (argc == 6) { - // Parse processes property - std::string processesProperty = argv[5]; + // Parse RESOURCE_GROUPS property + std::string resourceGroupsProperty = argv[5]; std::vector< std::vector<cmCTestTestHandler::cmCTestTestResourceRequirement>> - processes; - bool result = - cmCTestTestHandler::ParseProcessesProperty(processesProperty, processes); + resourceGroups; + bool result = cmCTestTestHandler::ParseResourceGroupsProperty( + resourceGroupsProperty, resourceGroups); (void)result; assert(result); - // Verify process count - const char* processCountEnv = cmSystemTools::GetEnv("CTEST_PROCESS_COUNT"); - if (!processCountEnv) { - std::cout << "CTEST_PROCESS_COUNT should be defined" << std::endl; + // Verify group count + const char* resourceGroupCountEnv = + cmSystemTools::GetEnv("CTEST_RESOURCE_GROUP_COUNT"); + if (!resourceGroupCountEnv) { + std::cout << "CTEST_RESOURCE_GROUP_COUNT should be defined" << std::endl; return 1; } - int processCount = std::atoi(processCountEnv); - if (processes.size() != std::size_t(processCount)) { - std::cout << "CTEST_PROCESS_COUNT does not match expected processes" - << std::endl - << "Expected: " << processes.size() << std::endl - << "Actual: " << processCount << std::endl; + int resourceGroupCount = std::atoi(resourceGroupCountEnv); + if (resourceGroups.size() != std::size_t(resourceGroupCount)) { + std::cout + << "CTEST_RESOURCE_GROUP_COUNT does not match expected resource groups" + << std::endl + << "Expected: " << resourceGroups.size() << std::endl + << "Actual: " << resourceGroupCount << std::endl; return 1; } @@ -110,15 +112,15 @@ static int doWrite(int argc, char const* const* argv) std::size_t i = 0; cmsys::ofstream fout(logFile.c_str(), std::ios::app); fout << "begin " << testName << std::endl; - for (auto& process : processes) { + for (auto& resourceGroup : resourceGroups) { try { // Build and verify set of expected resources std::set<std::string> expectedResources; - for (auto const& it : process) { + for (auto const& it : resourceGroup) { expectedResources.insert(it.ResourceType); } - std::string prefix = "CTEST_PROCESS_"; + std::string prefix = "CTEST_RESOURCE_GROUP_"; prefix += std::to_string(i); const char* actualResourcesCStr = cmSystemTools::GetEnv(prefix); if (!actualResourcesCStr) { @@ -144,10 +146,10 @@ static int doWrite(int argc, char const* const* argv) // Verify that we got what we asked for and write it to the log prefix += '_'; std::map<std::string, - std::vector<cmCTestMultiProcessHandler::HardwareAllocation>> - hwEntry; + std::vector<cmCTestMultiProcessHandler::ResourceAllocation>> + resEntry; for (auto const& type : actualResources) { - auto it = process.begin(); + auto it = resourceGroup.begin(); std::string varName = prefix; varName += cmSystemTools::UpperCase(type); @@ -161,7 +163,7 @@ static int doWrite(int argc, char const* const* argv) for (auto const& r : received) { while (it->ResourceType != type || it->UnitsNeeded == 0) { ++it; - if (it == process.end()) { + if (it == resourceGroup.end()) { std::cout << varName << " did not list expected resources" << std::endl; return 1; @@ -192,13 +194,13 @@ static int doWrite(int argc, char const* const* argv) fout << "alloc " << type << " " << id << " " << amount << std::endl; - hwEntry[type].push_back({ id, amount }); + resEntry[type].push_back({ id, amount }); } bool ended = false; while (it->ResourceType != type || it->UnitsNeeded == 0) { ++it; - if (it == process.end()) { + if (it == resourceGroup.end()) { ended = true; break; } @@ -210,7 +212,7 @@ static int doWrite(int argc, char const* const* argv) return 1; } } - hardware.push_back(hwEntry); + resources.push_back(resEntry); ++i; } catch (...) { @@ -225,8 +227,9 @@ static int doWrite(int argc, char const* const* argv) return 1; } } else { - if (cmSystemTools::GetEnv("CTEST_PROCESS_COUNT")) { - std::cout << "CTEST_PROCESS_COUNT should not be defined" << std::endl; + if (cmSystemTools::GetEnv("CTEST_RESOURCE_GROUP_COUNT")) { + std::cout << "CTEST_RESOURCE_GROUP_COUNT should not be defined" + << std::endl; return 1; } } @@ -246,8 +249,8 @@ static int doWrite(int argc, char const* const* argv) return 1; } cmsys::ofstream fout(logFile.c_str(), std::ios::app); - for (auto const& process : hardware) { - for (auto const& it : process) { + for (auto const& group : resources) { + for (auto const& it : group) { for (auto const& it2 : it.second) { fout << "dealloc " << it.first << " " << it2.Id << " " << it2.Slots << std::endl; @@ -273,7 +276,7 @@ static int doVerify(int argc, char const* const* argv) return usageVerify(argv[0]); } std::string logFile = argv[2]; - std::string hwFile = argv[3]; + std::string resFile = argv[3]; std::string testNames; if (argc == 5) { testNames = argv[4]; @@ -281,14 +284,14 @@ static int doVerify(int argc, char const* const* argv) auto testNameList = cmExpandedList(testNames, false); std::set<std::string> testNameSet(testNameList.begin(), testNameList.end()); - cmCTestHardwareSpec spec; - if (!spec.ReadFromJSONFile(hwFile)) { - std::cout << "Could not read hardware spec " << hwFile << std::endl; + cmCTestResourceSpec spec; + if (!spec.ReadFromJSONFile(resFile)) { + std::cout << "Could not read resource spec " << resFile << std::endl; return 1; } - cmCTestHardwareAllocator allocator; - allocator.InitializeFromHardwareSpec(spec); + cmCTestResourceAllocator allocator; + allocator.InitializeFromResourceSpec(spec); cmsys::ifstream fin(logFile.c_str(), std::ios::in); if (!fin) { diff --git a/Tests/RunCMake/CTestHardwareAllocation/ensure_parallel-ctest-s-hw-check.cmake b/Tests/RunCMake/CTestResourceAllocation/ensure_parallel-ctest-s-res-check.cmake index e5f6828..d842a76 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/ensure_parallel-ctest-s-hw-check.cmake +++ b/Tests/RunCMake/CTestResourceAllocation/ensure_parallel-ctest-s-res-check.cmake @@ -1,4 +1,4 @@ -verify_ctest_hardware() +verify_ctest_resources() set(expected_contents [[ begin Test1 @@ -10,7 +10,7 @@ end Test1 dealloc transmogrifiers hobbes 2 end Test2 ]]) -file(READ "${RunCMake_TEST_BINARY_DIR}/cthwalloc.log" actual_contents) +file(READ "${RunCMake_TEST_BINARY_DIR}/ctresalloc.log" actual_contents) if(NOT actual_contents STREQUAL expected_contents) - string(APPEND RunCMake_TEST_FAILED "cthwalloc.log contents did not match expected\n") + string(APPEND RunCMake_TEST_FAILED "ctresalloc.log contents did not match expected\n") endif() diff --git a/Tests/RunCMake/CTestHardwareAllocation/ensure_parallel.cmake b/Tests/RunCMake/CTestResourceAllocation/ensure_parallel.cmake index 1dafb8f..562d05a 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/ensure_parallel.cmake +++ b/Tests/RunCMake/CTestResourceAllocation/ensure_parallel.cmake @@ -1,11 +1,11 @@ -setup_hardware_tests() +setup_resource_tests() -add_hardware_test(Test1 4 "transmogrifiers:2") +add_resource_test(Test1 4 "transmogrifiers:2") # Mitigate possible race conditions to ensure that the events are logged in the # exact order we want add_test(NAME Test2Sleep COMMAND "${CMAKE_COMMAND}" -E sleep 2) -add_hardware_test(Test2 4 "transmogrifiers:2") +add_resource_test(Test2 4 "transmogrifiers:2") set_property(TEST Test2 APPEND PROPERTY DEPENDS Test2Sleep) -cleanup_hardware_tests() +cleanup_resource_tests() diff --git a/Tests/RunCMake/CTestResourceAllocation/lotsoftests-ctest-s-res-check.cmake b/Tests/RunCMake/CTestResourceAllocation/lotsoftests-ctest-s-res-check.cmake new file mode 100644 index 0000000..ceda72e --- /dev/null +++ b/Tests/RunCMake/CTestResourceAllocation/lotsoftests-ctest-s-res-check.cmake @@ -0,0 +1 @@ +verify_ctest_resources() diff --git a/Tests/RunCMake/CTestResourceAllocation/lotsoftests.cmake b/Tests/RunCMake/CTestResourceAllocation/lotsoftests.cmake new file mode 100644 index 0000000..4c0a7a5 --- /dev/null +++ b/Tests/RunCMake/CTestResourceAllocation/lotsoftests.cmake @@ -0,0 +1,16 @@ +setup_resource_tests() + +add_resource_test(Test1 2 "widgets:8;2,widgets:2") +add_resource_test(Test2 5 "fluxcapacitors:40") +add_resource_test(Test3 1 "10,widgets:1,fluxcapacitors:2") +add_resource_test(Test4 4 "fluxcapacitors:121") + +foreach(i RANGE 5 50) + add_resource_test(Test${i} 1 "2,widgets:1") +endforeach() + +foreach(i RANGE 51 100) + add_resource_test(Test${i} 1 "2,transmogrifiers:2") +endforeach() + +cleanup_resource_tests() diff --git a/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-check.cmake b/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-check.cmake new file mode 100644 index 0000000..321e9a2 --- /dev/null +++ b/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-check.cmake @@ -0,0 +1,3 @@ +if(EXISTS "${RunCMake_TEST_BINARY_DIR}/ctresalloc.log") + set(RunCMake_TEST_FAILED "ctresalloc.log should not exist") +endif() diff --git a/Tests/RunCMake/CTestHardwareAllocation/notenough2-ctest-s-hw-result.txt b/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-result.txt index b57e2de..b57e2de 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/notenough2-ctest-s-hw-result.txt +++ b/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-result.txt diff --git a/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-stderr.txt b/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-stderr.txt new file mode 100644 index 0000000..41df5af --- /dev/null +++ b/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res-stderr.txt @@ -0,0 +1,4 @@ +^Insufficient resources +CMake Error at [^ +]*/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res/test\.cmake:[0-9]+ \(message\): + Tests did not pass$ diff --git a/Tests/RunCMake/CTestResourceAllocation/notenough1.cmake b/Tests/RunCMake/CTestResourceAllocation/notenough1.cmake new file mode 100644 index 0000000..2908812 --- /dev/null +++ b/Tests/RunCMake/CTestResourceAllocation/notenough1.cmake @@ -0,0 +1,5 @@ +setup_resource_tests() + +add_resource_test(Test1 1 "fluxcapacitors:200") + +cleanup_resource_tests() diff --git a/Tests/RunCMake/CTestResourceAllocation/notenough2-ctest-s-res-check.cmake b/Tests/RunCMake/CTestResourceAllocation/notenough2-ctest-s-res-check.cmake new file mode 100644 index 0000000..321e9a2 --- /dev/null +++ b/Tests/RunCMake/CTestResourceAllocation/notenough2-ctest-s-res-check.cmake @@ -0,0 +1,3 @@ +if(EXISTS "${RunCMake_TEST_BINARY_DIR}/ctresalloc.log") + set(RunCMake_TEST_FAILED "ctresalloc.log should not exist") +endif() diff --git a/Tests/RunCMake/CTestHardwareAllocation/notenough1-ctest-s-hw-result.txt b/Tests/RunCMake/CTestResourceAllocation/notenough2-ctest-s-res-result.txt index b57e2de..b57e2de 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/notenough1-ctest-s-hw-result.txt +++ b/Tests/RunCMake/CTestResourceAllocation/notenough2-ctest-s-res-result.txt diff --git a/Tests/RunCMake/CTestResourceAllocation/notenough2-ctest-s-res-stderr.txt b/Tests/RunCMake/CTestResourceAllocation/notenough2-ctest-s-res-stderr.txt new file mode 100644 index 0000000..6c2f554 --- /dev/null +++ b/Tests/RunCMake/CTestResourceAllocation/notenough2-ctest-s-res-stderr.txt @@ -0,0 +1,4 @@ +^Insufficient resources +CMake Error at [^ +]*/Tests/RunCMake/CTestResourceAllocation/notenough2-ctest-s-res/test\.cmake:[0-9]+ \(message\): + Tests did not pass$ diff --git a/Tests/RunCMake/CTestResourceAllocation/notenough2.cmake b/Tests/RunCMake/CTestResourceAllocation/notenough2.cmake new file mode 100644 index 0000000..d7600c8 --- /dev/null +++ b/Tests/RunCMake/CTestResourceAllocation/notenough2.cmake @@ -0,0 +1,5 @@ +setup_resource_tests() + +add_resource_test(Test1 1 "terminators:2") + +cleanup_resource_tests() diff --git a/Tests/RunCMake/CTestResourceAllocation/process_count-ctest-s-res-check.cmake b/Tests/RunCMake/CTestResourceAllocation/process_count-ctest-s-res-check.cmake new file mode 100644 index 0000000..ceda72e --- /dev/null +++ b/Tests/RunCMake/CTestResourceAllocation/process_count-ctest-s-res-check.cmake @@ -0,0 +1 @@ +verify_ctest_resources() diff --git a/Tests/RunCMake/CTestResourceAllocation/process_count.cmake b/Tests/RunCMake/CTestResourceAllocation/process_count.cmake new file mode 100644 index 0000000..1457f89 --- /dev/null +++ b/Tests/RunCMake/CTestResourceAllocation/process_count.cmake @@ -0,0 +1,5 @@ +setup_resource_tests() + +add_resource_test(Test1 1 "widgets:1") + +cleanup_resource_tests() diff --git a/Tests/RunCMake/CTestHardwareAllocation/hwspec.json b/Tests/RunCMake/CTestResourceAllocation/resspec.json index c67fcca..c67fcca 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/hwspec.json +++ b/Tests/RunCMake/CTestResourceAllocation/resspec.json diff --git a/Tests/RunCMake/CTestHardwareAllocation/test.cmake.in b/Tests/RunCMake/CTestResourceAllocation/test.cmake.in index 5ba3587..4b426f1 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/test.cmake.in +++ b/Tests/RunCMake/CTestResourceAllocation/test.cmake.in @@ -10,14 +10,14 @@ set(CTEST_NIGHTLY_START_TIME "01:00:00 UTC") ctest_start(Experimental QUIET) ctest_configure(OPTIONS - "-DCTEST_HARDWARE_ALLOC_ENABLED=${CTEST_HARDWARE_ALLOC_ENABLED};-DCTHWALLOC_COMMAND=${CTHWALLOC_COMMAND}" + "-DCTEST_RESOURCE_ALLOC_ENABLED=${CTEST_RESOURCE_ALLOC_ENABLED};-DCTRESALLOC_COMMAND=${CTRESALLOC_COMMAND}" ) ctest_build() -if(CTEST_HARDWARE_ALLOC_ENABLED) - set(hwspec HARDWARE_SPEC_FILE "@RunCMake_SOURCE_DIR@/hwspec.json") +if(CTEST_RESOURCE_ALLOC_ENABLED) + set(resspec RESOURCE_SPEC_FILE "@RunCMake_SOURCE_DIR@/resspec.json") endif() -ctest_test(${hwspec} RETURN_VALUE retval PARALLEL_LEVEL ${CTEST_PARALLEL} SCHEDULE_RANDOM ${CTEST_RANDOM}) +ctest_test(${resspec} RETURN_VALUE retval PARALLEL_LEVEL ${CTEST_PARALLEL} SCHEDULE_RANDOM ${CTEST_RANDOM}) if(retval) message(FATAL_ERROR "Tests did not pass") endif() diff --git a/Tests/RunCMake/PrecompileHeaders/DisabledPch-check.cmake b/Tests/RunCMake/PrecompileHeaders/DisabledPch-check.cmake index 8cf0fc9..494bcf7 100644 --- a/Tests/RunCMake/PrecompileHeaders/DisabledPch-check.cmake +++ b/Tests/RunCMake/PrecompileHeaders/DisabledPch-check.cmake @@ -1,10 +1,5 @@ -if (NOT RunCMake_GENERATOR_IS_MULTI_CONFIG) - set(foo_pch_header "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/foo.dir/CMakeFiles/foo.dir/cmake_pch.h") - set(foobar_pch_header "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/foobar.dir/CMakeFiles/foobar.dir/cmake_pch.h") -else() - set(foo_pch_header "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/foo.dir/cmake_pch.h") - set(foobar_pch_header "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/foobar.dir/cmake_pch.h") -endif() +set(foo_pch_header "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/foo.dir/cmake_pch.h") +set(foobar_pch_header "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/foobar.dir/cmake_pch.h") if (NOT EXISTS ${foo_pch_header}) set(RunCMake_TEST_FAILED "Generated foo pch header ${foo_pch_header} does not exist") diff --git a/Tests/RunCMake/PrecompileHeaders/PchInterface-check.cmake b/Tests/RunCMake/PrecompileHeaders/PchInterface-check.cmake index caeb22b..4e62b81 100644 --- a/Tests/RunCMake/PrecompileHeaders/PchInterface-check.cmake +++ b/Tests/RunCMake/PrecompileHeaders/PchInterface-check.cmake @@ -1,10 +1,5 @@ -if (NOT RunCMake_GENERATOR_IS_MULTI_CONFIG) - set(foo_pch_header "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/foo.dir/CMakeFiles/foo.dir/cmake_pch.h") - set(foobar_pch_header "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/foobar.dir/CMakeFiles/foobar.dir/cmake_pch.h") -else() - set(foo_pch_header "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/foo.dir/cmake_pch.h") - set(foobar_pch_header "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/foobar.dir/cmake_pch.h") -endif() +set(foo_pch_header "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/foo.dir/cmake_pch.h") +set(foobar_pch_header "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/foobar.dir/cmake_pch.h") if (NOT EXISTS ${foo_pch_header}) set(RunCMake_TEST_FAILED "Generated foo pch header ${foo_pch_header} does not exist") diff --git a/Tests/RunCMake/PrecompileHeaders/PchMultilanguage-check.cmake b/Tests/RunCMake/PrecompileHeaders/PchMultilanguage-check.cmake index e0b753a..cc01ecb 100644 --- a/Tests/RunCMake/PrecompileHeaders/PchMultilanguage-check.cmake +++ b/Tests/RunCMake/PrecompileHeaders/PchMultilanguage-check.cmake @@ -1,10 +1,5 @@ -if (NOT RunCMake_GENERATOR_IS_MULTI_CONFIG) - set(foobar_pch_h_header "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/foobar.dir/CMakeFiles/foobar.dir/cmake_pch.h") - set(foobar_pch_hxx_header "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/foobar.dir/CMakeFiles/foobar.dir/cmake_pch.hxx") -else() - set(foobar_pch_h_header "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/foobar.dir/cmake_pch.h") - set(foobar_pch_hxx_header "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/foobar.dir/cmake_pch.hxx") -endif() +set(foobar_pch_h_header "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/foobar.dir/cmake_pch.h") +set(foobar_pch_hxx_header "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/foobar.dir/cmake_pch.hxx") if (NOT EXISTS ${foobar_pch_h_header}) set(RunCMake_TEST_FAILED "Generated foobar C pch header ${foobar_pch_h_header} does not exist") diff --git a/Tests/RunCMake/PrecompileHeaders/PchPrologueEpilogue-check.cmake b/Tests/RunCMake/PrecompileHeaders/PchPrologueEpilogue-check.cmake index ba220f3..9018664 100644 --- a/Tests/RunCMake/PrecompileHeaders/PchPrologueEpilogue-check.cmake +++ b/Tests/RunCMake/PrecompileHeaders/PchPrologueEpilogue-check.cmake @@ -1,8 +1,4 @@ -if (NOT RunCMake_GENERATOR_IS_MULTI_CONFIG) - set(main_pch_header "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/main.dir/CMakeFiles/main.dir/cmake_pch.hxx") -else() - set(main_pch_header "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/main.dir/cmake_pch.hxx") -endif() +set(main_pch_header "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/main.dir/cmake_pch.hxx") file(STRINGS ${main_pch_header} main_pch_header_strings) string(REGEX MATCH "#pragma warning\\(push, 0\\).*#include.*pch.h.*#pragma warning\\(pop\\)" matched_code ${main_pch_header_strings}) diff --git a/Tests/RunCMake/UnityBuild/unitybuild_skip-check.cmake b/Tests/RunCMake/UnityBuild/unitybuild_skip-check.cmake index fdd45bc..61419d8 100644 --- a/Tests/RunCMake/UnityBuild/unitybuild_skip-check.cmake +++ b/Tests/RunCMake/UnityBuild/unitybuild_skip-check.cmake @@ -1,9 +1,9 @@ set(unitybuild_c "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/tgt.dir/Unity/unity_0.c") file(STRINGS ${unitybuild_c} unitybuild_c_strings) -string(REGEX MATCH "\\/s[1-6].c" matched_files_1_6 ${unitybuild_c_strings}) -if(matched_files_1_6) - set(RunCMake_TEST_FAILED "Generated unity contains s1.c -> s6.c which should have been skipped") +string(REGEX MATCH "\\/s[2-6].c" matched_files_2_6 ${unitybuild_c_strings}) +if(matched_files_2_6) + set(RunCMake_TEST_FAILED "Generated unity contains s2.c -> s6.c which should have been skipped") return() endif() diff --git a/Tests/RunCMake/UnityBuild/unitybuild_skip.cmake b/Tests/RunCMake/UnityBuild/unitybuild_skip.cmake index 74524ad..eef8ccc 100644 --- a/Tests/RunCMake/UnityBuild/unitybuild_skip.cmake +++ b/Tests/RunCMake/UnityBuild/unitybuild_skip.cmake @@ -1,7 +1,7 @@ project(unitybuild_skip C) set(srcs "") -foreach(s RANGE 1 8) +foreach(s RANGE 2 8) set(src "${CMAKE_CURRENT_BINARY_DIR}/s${s}.c") file(WRITE "${src}" "int s${s}(void) { return 0; }\n") list(APPEND srcs "${src}") @@ -11,9 +11,6 @@ add_library(tgt SHARED ${srcs}) set_target_properties(tgt PROPERTIES UNITY_BUILD ON) -set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/s1.c - PROPERTIES GENERATED ON) - set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/s2.c PROPERTIES SKIP_UNITY_BUILD_INCLUSION ON) diff --git a/Tests/RunCMake/VS10Project/SourceGroupTreeCMakeLists-check.cmake b/Tests/RunCMake/VS10Project/SourceGroupTreeCMakeLists-check.cmake index 655120a..ee0c412 100644 --- a/Tests/RunCMake/VS10Project/SourceGroupTreeCMakeLists-check.cmake +++ b/Tests/RunCMake/VS10Project/SourceGroupTreeCMakeLists-check.cmake @@ -13,6 +13,7 @@ include(${RunCMake_TEST_SOURCE_DIR}/SourceGroupHelpers.cmake) set(SOURCE_GROUPS_TO_FIND "Dir" "Dir\\DirNested" + "Generated" "SourcesPrefix" "SourcesPrefix\\PrefixedNested" ) diff --git a/Tests/RunCMake/VS10Project/SourceGroupTreeCMakeLists.cmake b/Tests/RunCMake/VS10Project/SourceGroupTreeCMakeLists.cmake index 83c87a9..7655e60 100644 --- a/Tests/RunCMake/VS10Project/SourceGroupTreeCMakeLists.cmake +++ b/Tests/RunCMake/VS10Project/SourceGroupTreeCMakeLists.cmake @@ -1,16 +1,45 @@ set(CMAKE_CONFIGURATION_TYPES Debug) +# Test regular tree grouping. set(SRC_FILES ${CMAKE_CURRENT_SOURCE_DIR}/Dir/foo.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Dir/DirNested/foo_nested.cpp ) +source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SRC_FILES}) + + +# Test files that are not present at configuration time. +set(GENERATED_SRC_FILES + ${CMAKE_CURRENT_BINARY_DIR}/Generated/generated.cpp +) + +file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/Generated) + +if(WIN32) + add_custom_command(OUTPUT ${GENERATED_SRC_FILES} + COMMAND echo. 2>${CMAKE_CURRENT_BINARY_DIR}\\Generated\\generated.cpp + ) +else() + add_custom_command(OUTPUT ${GENERATED_SRC_FILES} + COMMAND touch ${CMAKE_CURRENT_BINARY_DIR}/Generated/generated.cpp + ) +endif() + +source_group(TREE ${CMAKE_CURRENT_BINARY_DIR} FILES ${GENERATED_SRC_FILES}) + + +# Test prefixed tree grouping. set(PREFIXED_SRC_FILES ${CMAKE_CURRENT_SOURCE_DIR}/Prefixed/bar.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Prefixed/PrefixedNested/bar_nested.cpp ) -add_custom_target(SourceGroupTree SOURCES ${SRC_FILES} ${PREFIXED_SRC_FILES}) +add_custom_target(SourceGroupTree + SOURCES + ${SRC_FILES} + ${GENERATED_SRC_FILES} + ${PREFIXED_SRC_FILES} +) -source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SRC_FILES}) source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR}/Prefixed PREFIX SourcesPrefix FILES ${PREFIXED_SRC_FILES}) diff --git a/Tests/RunCMake/XcodeProject/ImplicitCMakeLists-check.cmake b/Tests/RunCMake/XcodeProject/ImplicitCMakeLists-check.cmake new file mode 100644 index 0000000..c6bbc1b --- /dev/null +++ b/Tests/RunCMake/XcodeProject/ImplicitCMakeLists-check.cmake @@ -0,0 +1,20 @@ +set(xcProjectFile "${RunCMake_TEST_BINARY_DIR}/ImplicitCMakeLists.xcodeproj/project.pbxproj") +if(NOT EXISTS "${xcProjectFile}") + set(RunCMake_TEST_FAILED "Project file ${xcProjectFile} does not exist.") + return() +endif() + +set(foundCMakeLists 0) +file(STRINGS "${xcProjectFile}" lines) +foreach(line IN LISTS lines) + if(line MATCHES "PBXFileReference.*CMakeLists.txt") + if(foundCMakeLists) + set(RunCMake_TEST_FAILED "CMakeLists.txt referenced multiple times") + return() + endif() + set(foundCMakeLists 1) + endif() +endforeach() +if(NOT foundCMakeLists) + set(RunCMake_TEST_FAILED "CMakeLists.txt not referenced") +endif() diff --git a/Tests/RunCMake/XcodeProject/ImplicitCMakeLists.cmake b/Tests/RunCMake/XcodeProject/ImplicitCMakeLists.cmake new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/Tests/RunCMake/XcodeProject/ImplicitCMakeLists.cmake diff --git a/Tests/RunCMake/XcodeProject/RunCMakeTest.cmake b/Tests/RunCMake/XcodeProject/RunCMakeTest.cmake index 1dfa8b2..9e82841 100644 --- a/Tests/RunCMake/XcodeProject/RunCMakeTest.cmake +++ b/Tests/RunCMake/XcodeProject/RunCMakeTest.cmake @@ -1,6 +1,7 @@ include(RunCMake) run_cmake(ExplicitCMakeLists) +run_cmake(ImplicitCMakeLists) run_cmake(XcodeFileType) run_cmake(XcodeAttributeLocation) diff --git a/Tests/RunCMake/message/RunCMakeTest.cmake b/Tests/RunCMake/message/RunCMakeTest.cmake index 9198a25..681839d 100644 --- a/Tests/RunCMake/message/RunCMakeTest.cmake +++ b/Tests/RunCMake/message/RunCMakeTest.cmake @@ -5,6 +5,15 @@ run_cmake(nomessage) run_cmake(message-internal-warning) run_cmake(nomessage-internal-warning) run_cmake(warnmessage) + +# Have to explicitly give the command for the working dir to be honoured +set(RunCMake_TEST_COMMAND_WORKING_DIRECTORY /) +run_cmake_command( + warnmessage-rootdir + ${CMAKE_COMMAND} -P ${RunCMake_SOURCE_DIR}/warnmessage-rootdir.cmake + ) +unset(RunCMake_TEST_COMMAND_WORKING_DIRECTORY) + # message command sets fatal occurred flag, so check each type of error # separately diff --git a/Tests/RunCMake/message/warnmessage-rootdir-stderr.txt b/Tests/RunCMake/message/warnmessage-rootdir-stderr.txt new file mode 100644 index 0000000..19d9398 --- /dev/null +++ b/Tests/RunCMake/message/warnmessage-rootdir-stderr.txt @@ -0,0 +1 @@ +We expect to see this warning message diff --git a/Tests/RunCMake/message/warnmessage-rootdir.cmake b/Tests/RunCMake/message/warnmessage-rootdir.cmake new file mode 100644 index 0000000..f82efb9 --- /dev/null +++ b/Tests/RunCMake/message/warnmessage-rootdir.cmake @@ -0,0 +1,5 @@ +cmake_minimum_required(VERSION 3.15) + +# Generating the backtrace for this warning message used to trigger a +# spurious assertion when the current directory is the root directory +message(WARNING "We expect to see this warning message") diff --git a/Tests/RunCMake/try_compile/ObjCStandard-result.txt b/Tests/RunCMake/try_compile/ObjCStandard-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/try_compile/ObjCStandard-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/try_compile/ObjCStandard-stderr.txt b/Tests/RunCMake/try_compile/ObjCStandard-stderr.txt new file mode 100644 index 0000000..f1b4df9 --- /dev/null +++ b/Tests/RunCMake/try_compile/ObjCStandard-stderr.txt @@ -0,0 +1,7 @@ +^CMake Error at .*/Tests/RunCMake/try_compile/ObjCStandard-build/CMakeFiles/CMakeTmp/CMakeLists.txt:[0-9]+ \(add_executable\): + OBJC_STANDARD is set to invalid value '3' ++ +CMake Error at ObjCStandard.cmake:[0-9]+ \(try_compile\): + Failed to generate test project build system. +Call Stack \(most recent call first\): + CMakeLists.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/try_compile/ObjCStandard.cmake b/Tests/RunCMake/try_compile/ObjCStandard.cmake new file mode 100644 index 0000000..b2066f9 --- /dev/null +++ b/Tests/RunCMake/try_compile/ObjCStandard.cmake @@ -0,0 +1,7 @@ +enable_language(OBJC) +try_compile(result ${CMAKE_CURRENT_BINARY_DIR} + 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-result.txt b/Tests/RunCMake/try_compile/ObjCxxStandard-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/try_compile/ObjCxxStandard-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/try_compile/ObjCxxStandard-stderr.txt b/Tests/RunCMake/try_compile/ObjCxxStandard-stderr.txt new file mode 100644 index 0000000..a2f91b4 --- /dev/null +++ b/Tests/RunCMake/try_compile/ObjCxxStandard-stderr.txt @@ -0,0 +1,7 @@ +^CMake Error at .*/Tests/RunCMake/try_compile/ObjCxxStandard-build/CMakeFiles/CMakeTmp/CMakeLists.txt:[0-9]+ \(add_executable\): + OBJCXX_STANDARD is set to invalid value '3' ++ +CMake Error at ObjCxxStandard.cmake:[0-9]+ \(try_compile\): + Failed to generate test project build system. +Call Stack \(most recent call first\): + CMakeLists.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/try_compile/ObjCxxStandard.cmake b/Tests/RunCMake/try_compile/ObjCxxStandard.cmake new file mode 100644 index 0000000..1221805 --- /dev/null +++ b/Tests/RunCMake/try_compile/ObjCxxStandard.cmake @@ -0,0 +1,7 @@ +enable_language(OBJCXX) +try_compile(result ${CMAKE_CURRENT_BINARY_DIR} + 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/RunCMakeTest.cmake b/Tests/RunCMake/try_compile/RunCMakeTest.cmake index 77fb7a0..91f014e 100644 --- a/Tests/RunCMake/try_compile/RunCMakeTest.cmake +++ b/Tests/RunCMake/try_compile/RunCMakeTest.cmake @@ -37,11 +37,17 @@ if(CMAKE_C_STANDARD_DEFAULT) 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) if(CMAKE_HOST_WIN32) run_cmake(CudaStandardNoDefault) diff --git a/Tests/RunCMake/try_compile/src.m b/Tests/RunCMake/try_compile/src.m new file mode 100644 index 0000000..f8b643a --- /dev/null +++ b/Tests/RunCMake/try_compile/src.m @@ -0,0 +1,4 @@ +int main() +{ + return 0; +} diff --git a/Tests/RunCMake/try_compile/src.mm b/Tests/RunCMake/try_compile/src.mm new file mode 100644 index 0000000..f8b643a --- /dev/null +++ b/Tests/RunCMake/try_compile/src.mm @@ -0,0 +1,4 @@ +int main() +{ + return 0; +} diff --git a/Tests/TryCompile/CMakeLists.txt b/Tests/TryCompile/CMakeLists.txt index 498e556..9ec9b70 100644 --- a/Tests/TryCompile/CMakeLists.txt +++ b/Tests/TryCompile/CMakeLists.txt @@ -365,6 +365,25 @@ 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}${CMAKE_FILES_DIRECTORY}/CMakeTmp + ${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}${CMAKE_FILES_DIRECTORY}/CMakeTmp + ${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/fail.m b/Tests/TryCompile/fail.m new file mode 100644 index 0000000..b915ebe --- /dev/null +++ b/Tests/TryCompile/fail.m @@ -0,0 +1 @@ +asdflkjasdlj diff --git a/Tests/TryCompile/pass.m b/Tests/TryCompile/pass.m new file mode 100644 index 0000000..f8b643a --- /dev/null +++ b/Tests/TryCompile/pass.m @@ -0,0 +1,4 @@ +int main() +{ + return 0; +} diff --git a/Utilities/Scripts/regenerate-lexers.bash b/Utilities/Scripts/regenerate-lexers.bash index 2bd58fe..1b61b70 100755 --- a/Utilities/Scripts/regenerate-lexers.bash +++ b/Utilities/Scripts/regenerate-lexers.bash @@ -11,7 +11,7 @@ pushd "${BASH_SOURCE%/*}/../../Source/LexerParser" > /dev/null for lexer in \ CommandArgument \ - CTestProcesses \ + CTestResourceGroups \ DependsJava \ Expr \ Fortran |