From 0b246f19b75e9b372b4feb6ccf14ed1413dfd161 Mon Sep 17 00:00:00 2001 From: Yen-Chen Chen <yen-chen.chen@kit.edu> Date: Mon, 13 May 2024 07:03:03 +0000 Subject: [PATCH] Add CMake format and linter (icon-libraries/libfortran-support!89) ## What is the new feature Add a formatter for CMake files. And CI task for CMake formatting is also added. ## How is it implemented We use the opensource tool https://github.com/cheshirekow/cmake_format for formatting. Approved-by: Jonas Jucker <jonas.jucker@env.ethz.ch> Merged-by: Jonas Jucker <jonas.jucker@env.ethz.ch> Changelog: feature --- .cmake-format.py | 49 +++++++++++++++++++ .gitlab-ci.yml | 21 +++++++-- CMakeLists.txt | 94 +++++++++++++++++-------------------- cmake/check_macro.cmake | 38 +++++++-------- cmake/gtest_helper.cmake | 26 +++++++--- cmake/list_sources.cmake | 31 ++++++++---- src/CMakeLists.txt | 89 ++++++++++++++++------------------- test/c/CMakeLists.txt | 79 ++++++++++++++++--------------- test/fortran/CMakeLists.txt | 12 ++--- 9 files changed, 257 insertions(+), 182 deletions(-) create mode 100644 .cmake-format.py diff --git a/.cmake-format.py b/.cmake-format.py new file mode 100644 index 0000000..d10da97 --- /dev/null +++ b/.cmake-format.py @@ -0,0 +1,49 @@ +# ICON +# +# --------------------------------------------------------------- +# Copyright (C) 2004-2024, DWD, MPI-M, DKRZ, KIT, ETH, MeteoSwiss +# Contact information: icon-model.org +# +# See AUTHORS.TXT for a list of authors +# See LICENSES/ for license information +# SPDX-License-Identifier: CC0-1.0 +# --------------------------------------------------------------- + +with section("parse"): + additional_commands = { + "check_macro_defined": { + "pargs": 2, + "flags": ["QUIET"], + "kwargs": { + "LANG": 1 + } + }, + "add_icon_c_test": { + "pargs": 2 + }, + "list_sources": { + "pargs": 1, + "flags": ["EXCLUDE_GENERATED"], + "kwargs": { + "DIRECTORY": 1, + "INCLUDE_REGEX": 1 + } + }, + "FortUTF_Find_Tests": {} + } + +with section("format"): + line_width = 80 + autosort = True + keyword_case = 'upper' + +with section("markup"): + first_comment_is_literal = True + +with section("lint"): + disabled_codes = ['C0301'] + function_pattern = '[0-9a-z_]+' + macro_pattern = '[0-9a-z_]+' + local_var_pattern = '[a-zA-Z][0-9a-zA-z_]+' + private_var_pattern = '[a-z][a-z0-9_]+' + public_var_pattern = '[A-Z][0-9a-zA-Z_]+' diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e9e6df2..8531ca1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -42,7 +42,7 @@ nag: - ctest --output-on-failure tags: - levante-fake, hpc, dkrz - needs: ["Check Typo", "Check OpenACC Style", "Check Style", "Check License"] + needs: ["Check Typo", "Check OpenACC Style", "Check Style", "Check CMake Style", "Check License"] gcc11: stage: build_and_test @@ -57,7 +57,7 @@ gcc11: - ctest --output-on-failure tags: - levante-fake, hpc, dkrz - needs: ["Check Typo", "Check OpenACC Style", "Check Style", "Check License"] + needs: ["Check Typo", "Check OpenACC Style", "Check Style", "Check CMake Style", "Check License"] intel22: stage: build_and_test @@ -72,7 +72,7 @@ intel22: - ctest --output-on-failure tags: - levante-fake, hpc, dkrz - needs: ["Check Typo", "Check OpenACC Style", "Check Style", "Check License"] + needs: ["Check Typo", "Check OpenACC Style", "Check Style", "Check CMake Style", "Check License"] nvhpc: stage: build_and_test @@ -87,7 +87,7 @@ nvhpc: - ctest --output-on-failure tags: - levante-fake, hpc, dkrz - needs: ["Check Typo", "Check OpenACC Style", "Check Style", "Check License"] + needs: ["Check Typo", "Check OpenACC Style", "Check Style", "Check CMake Style", "Check License"] OpenACC: stage: build_OpenACC @@ -179,6 +179,19 @@ Check Style: when: on_failure needs: [] +Check CMake Style: + stage: lint + before_script: + #install the formatting tool + - pip install cmake-format + script: + # check style for CMake files. + - cmake-lint CMakeLists.txt src/CMakeLists.txt test/CMakeLists.txt test/c/CMakeLists.txt test/fortran/CMakeLists.txt cmake/check_macro.cmake cmake/gtest_helper.cmake cmake/list_sources.cmake + tags: + # choose runner + - sphinx + needs: [] + Check License: stage: lint before_script: diff --git a/CMakeLists.txt b/CMakeLists.txt index 1d088f0..67f6a8f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,7 +11,10 @@ cmake_minimum_required(VERSION 3.18) -project(fortran-support VERSION 0.1.0 LANGUAGES Fortran C) +project( + fortran-support + VERSION 0.1.0 + LANGUAGES Fortran C) option(BUILD_SHARED_LIBS "Build shared libraries" ON) option(BUILD_TESTING "Build tests" ON) @@ -22,9 +25,14 @@ option(FS_ENABLE_OPENACC "Build with OpenACC support" OFF) option(FS_ENABLE_MIXED_PRECISION "Use mixed precision" OFF) if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING - "Choose the type of build, options are: Debug Release RelWithDebInfo" FORCE) - message(STATUS "Setting build type to '${CMAKE_BUILD_TYPE}' as none was specified") + set(CMAKE_BUILD_TYPE + "RelWithDebInfo" + CACHE + STRING + "Choose the type of build, options are: Debug Release RelWithDebInfo" + FORCE) + message( + STATUS "Setting build type to '${CMAKE_BUILD_TYPE}' as none was specified") endif(NOT CMAKE_BUILD_TYPE) include(GNUInstallDirs) @@ -37,38 +45,27 @@ if(BUILD_TESTING) add_subdirectory(test) endif() -export( - EXPORT "${PROJECT_NAME}-targets" - FILE "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-targets.cmake" -) +export(EXPORT "${PROJECT_NAME}-targets" + FILE "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-targets.cmake") include(CMakePackageConfigHelpers) configure_package_config_file( "${PROJECT_SOURCE_DIR}/cmake/config.cmake.in" "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake" INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake" - NO_SET_AND_CHECK_MACRO - NO_CHECK_REQUIRED_COMPONENTS_MACRO -) + NO_SET_AND_CHECK_MACRO NO_CHECK_REQUIRED_COMPONENTS_MACRO) write_basic_package_version_file( "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake" VERSION "${${PROJECT_NAME}_VERSION_MAJOR}.${${PROJECT_NAME}_VERSION_MINOR}" - COMPATIBILITY AnyNewerVersion -) - -install( - EXPORT "${PROJECT_NAME}-targets" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/cmake" -) - -install( - FILES - "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake" - "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake" - DESTINATION - "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/cmake" -) + COMPATIBILITY AnyNewerVersion) + +install(EXPORT "${PROJECT_NAME}-targets" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/cmake") + +install(FILES "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake" + "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/cmake") include("${PROJECT_SOURCE_DIR}/cmake/list_sources.cmake") @@ -92,35 +89,28 @@ if("${CMAKE_PROJECT_NAME}" STREQUAL "${PROJECT_NAME}") set(c_format_sources "${format_sources}") list(FILTER c_format_sources INCLUDE REGEX "\.(c|h|cpp|hpp)$") - add_custom_target(format-c - COMMAND - clang-format - --style=file - -i - ${c_format_sources} - ) + add_custom_target( + format-c + COMMAND clang-format --style=file -i ${c_format_sources} + COMMENT "Format C codes") # Collect Fortran source files: set(fortran_format_sources "${format_sources}") list(FILTER fortran_format_sources INCLUDE REGEX "\.(f|F|f90|F90)$") - add_custom_target(format-fortran - COMMAND - # We do not use a config file but specify the formatting arguments on the - # command line because the feature requires an extra Python package and - # does not work for certain arguments even in the latest release - # (e.g., see https://github.com/pseewald/fprettify/issues/94): - fprettify - --case 2 2 2 1 - --indent 2 - --whitespace 2 - --strip-comments - ${fortran_format_sources} - ) - - add_custom_target(format - DEPENDS - format-c - format-fortran - ) + add_custom_target( + format-fortran + COMMAND # We do not use a config file but specify the formatting arguments + # on the command line because the feature requires an extra Python + # package and does not work for certain arguments even in the latest + # release (e.g., see + # https://github.com/pseewald/fprettify/issues/94): + fprettify --case 2 2 2 1 --indent 2 --whitespace 2 --strip-comments + ${fortran_format_sources} + COMMENT "Format Fortran codes") + + add_custom_target( + format + DEPENDS format-c format-fortran + COMMENT "Format codes") endif() diff --git a/cmake/check_macro.cmake b/cmake/check_macro.cmake index b9d9f1d..7495b85 100644 --- a/cmake/check_macro.cmake +++ b/cmake/check_macro.cmake @@ -9,29 +9,27 @@ # SPDX-License-Identifier: BSD-3-Clause # --------------------------------------------------------------- +# cmake-format: off # check_macro_defined(<output> # <macro> # [LANG] <lang> # [QUIET]) +# cmake-format: on # ----------------------------------------------------------------------------- -# Sets <output> to ON or OFF depending on whether <macro> is already defined -# via CMAKE_${lang}_FLAGS or not. However, this only works when <lang> is Fortran +# Sets <output> to ON or OFF depending on whether <macro> is already defined via +# CMAKE_${lang}_FLAGS or not. However, this only works when <lang> is Fortran # and fails otherwise. # # <lang> can be set using LANG. <lang> is set as Fortran by default. # function(check_macro_defined output macro) - cmake_parse_arguments(PARSE_ARGV 1 ARG - "QUIET" - "LANG" - "" - ) + cmake_parse_arguments(PARSE_ARGV 1 ARG "QUIET" "LANG" "") - if(NOT ARG_LANG) + if(NOT ARG_LANG) set(ARG_LANG "Fortran") endif() - + if(NOT ARG_LANG STREQUAL "Fortran") message(FATAL_ERROR "check_macro_defined supports only LANG Fortran") endif() @@ -41,7 +39,8 @@ function(check_macro_defined output macro) endif() # Write a simple Fortran program that checks for ${macro} - set(check_source_code " + set(check_source_code + " program main implicit none #ifdef ${macro} @@ -56,16 +55,15 @@ function(check_macro_defined output macro) b = 2 end ") - + # Write the Fortran code to a file - file(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.F90" "${check_source_code}") - + file(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.F90" + "${check_source_code}") + # Try to compile the program - try_compile(result - "${CMAKE_BINARY_DIR}" - "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.F90" - ) - + try_compile(result "${CMAKE_BINARY_DIR}" + "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.F90") + if(NOT ARG_QUIET) if(${result}) message(CHECK_PASS "yes") @@ -74,6 +72,8 @@ function(check_macro_defined output macro) endif() endif() - set(${output} ${result} PARENT_SCOPE) + set(${output} + ${result} + PARENT_SCOPE) endfunction() diff --git a/cmake/gtest_helper.cmake b/cmake/gtest_helper.cmake index 5a78c7f..7daae6e 100644 --- a/cmake/gtest_helper.cmake +++ b/cmake/gtest_helper.cmake @@ -9,10 +9,24 @@ # SPDX-License-Identifier: BSD-3-Clause # --------------------------------------------------------------- -macro(add_icon_c_test test_name file_names) - add_executable("CTest_${test_name}" ${file_names}) - target_link_libraries("CTest_${test_name}" PRIVATE fortran-support::fortran-support GTest::gtest_main stdc++fs) - add_test(NAME "CTest_${test_name}" COMMAND "CTest_${test_name}") - set_property(TEST "CTest_${test_name}" PROPERTY LABELS C) - set_target_properties("CTest_${test_name}" PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON) +# cmake-format: off +# add_icon_c_test(<test> +# <source>) +# cmake-format: on +# ----------------------------------------------------------------------------- +# Compiles a test executable with the name <test> using the source code +# <source>. The googletest and fortran-support libraries will be linked +# automatically. +# +# The C++ standard is set to C++17. +# +macro(add_icon_c_test test_name file_name) + add_executable("CTest_${test_name}" ${file_name}) + target_link_libraries( + "CTest_${test_name}" PRIVATE fortran-support::fortran-support + GTest::gtest_main stdc++fs) + add_test(NAME "CTest_${test_name}" COMMAND "CTest_${test_name}") + set_property(TEST "CTest_${test_name}" PROPERTY LABELS C) + set_target_properties("CTest_${test_name}" + PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON) endmacro() diff --git a/cmake/list_sources.cmake b/cmake/list_sources.cmake index 3ba5e32..dd08537 100644 --- a/cmake/list_sources.cmake +++ b/cmake/list_sources.cmake @@ -9,10 +9,12 @@ # SPDX-License-Identifier: BSD-3-Clause # --------------------------------------------------------------- +# cmake-format: off # list_sources(<var> # [DIRECTORY <dir>] # [INCLUDE_REGEX <include_regex>] # [EXCLUDE_GENERATED]) +# cmake-format: on # ------------------------------------------------------------------------------ # Sets <var> to a list of absolute paths to the source files of all targets in # all subdirectories of <dir> (defaults to the current source directory). The @@ -25,18 +27,22 @@ # are excluded from the result. # function(list_sources var) - cmake_parse_arguments(PARSE_ARGV 1 ARG - "EXCLUDE_GENERATED" - "DIRECTORY;INCLUDE_REGEX" - "" - ) + cmake_parse_arguments(PARSE_ARGV 1 ARG "EXCLUDE_GENERATED" + "DIRECTORY;INCLUDE_REGEX" "") if(ARG_EXCLUDE_GENERATED AND "${CMAKE_VERSION}" VERSION_LESS "3.18") - message(AUTHOR_WARNING - "The generated source files can be automatically excluded only with CMake 3.18 or newer.") + message( + AUTHOR_WARNING + "The generated source files can be automatically excluded only with CMake 3.18 or newer." + ) set(ARG_EXCLUDE_GENERATED FALSE) endif() + # list_sources_recurse(<var> <dir>) + # ---------------------------------------------------------------------------- + # This is a local function that finds the sources recursively. Do not use this + # function directly. Use list_sources instead. + # function(list_sources_recurse var dir) get_directory_property(dir_path DIRECTORY ${dir} SOURCE_DIR) get_directory_property(targets DIRECTORY ${dir} BUILDSYSTEM_TARGETS) @@ -54,7 +60,8 @@ function(list_sources var) if(sources) foreach(source ${sources}) if(${ARG_EXCLUDE_GENERATED}) - get_source_file_property(source_generated ${source} DIRECTORY ${dir} GENERATED) + get_source_file_property(source_generated ${source} DIRECTORY + ${dir} GENERATED) if(source_generated) continue() endif() @@ -69,7 +76,9 @@ function(list_sources var) list_sources_recurse(subdir_sources ${subdir} ${ARG_EXCLUDE_GENERATED}) list(APPEND result ${subdir_sources}) endforeach() - set(${var} ${result} PARENT_SCOPE) + set(${var} + ${result} + PARENT_SCOPE) endfunction() if(NOT ARG_DIRECTORY) @@ -83,5 +92,7 @@ function(list_sources var) endif() list(REMOVE_DUPLICATES result) - set(${var} ${result} PARENT_SCOPE) + set(${var} + ${result} + PARENT_SCOPE) endfunction() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a142711..8b65d6e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -15,16 +15,17 @@ check_include_files("link.h" HAVE_LINK_H) check_include_files("unwind.h" HAVE_UNWIND_H) check_include_files("sys/resource.h" HAVE_GETRUSAGE) -configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/config.h.in - ${CMAKE_CURRENT_BINARY_DIR}/config.h) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in + ${CMAKE_CURRENT_BINARY_DIR}/config.h) -if (FS_ENABLE_OMP) +if(FS_ENABLE_OMP) find_package(OpenMP QUIET) set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${OpenMP_Fortran_FLAGS}") -endif () +endif() -add_library(fortran-support +add_library( + fortran-support + ${CMAKE_CURRENT_BINARY_DIR}/config.h mo_exception.F90 mo_expression.F90 mo_fortran_tools.F90 @@ -60,72 +61,64 @@ add_library(fortran-support util_string_parse.c util_sysinfo.c util_system.c - util_timer.c - ${CMAKE_CURRENT_BINARY_DIR}/config.h -) + util_timer.c) add_library(${PROJECT_NAME}::fortran-support ALIAS fortran-support) set(Fortran_MODULE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/mod") -set_target_properties(fortran-support - PROPERTIES - Fortran_PREPROCESS ON - Fortran_MODULE_DIRECTORY "${Fortran_MODULE_DIRECTORY}" - C_STANDARD 99 - C_STANDARD_REQUIRED ON - EXPORT_NAME ${PROJECT_NAME}::fortran-support -) +set_target_properties( + fortran-support + PROPERTIES Fortran_PREPROCESS ON + Fortran_MODULE_DIRECTORY "${Fortran_MODULE_DIRECTORY}" + C_STANDARD 99 + C_STANDARD_REQUIRED ON + EXPORT_NAME ${PROJECT_NAME}::fortran-support) -if (FS_ENABLE_MIXED_PRECISION) +if(FS_ENABLE_MIXED_PRECISION) target_compile_definitions(fortran-support PRIVATE __MIXED_PRECISION) -endif () +endif() include("${PROJECT_SOURCE_DIR}/cmake/check_macro.cmake") check_macro_defined(HAS_OPENACC_MACRO _OPENACC QUIET) -if (FS_ENABLE_OPENACC) +if(FS_ENABLE_OPENACC) # If _OPENACC is defined, assume that the required compiler flags are already # provided, e.g. in CMAKE_Fortran_FLAGS: - if (NOT HAS_OPENACC_MACRO) + if(NOT HAS_OPENACC_MACRO) # On LUMI, we only have OpenACC_Fortran, but no OpenACC_C find_package(OpenACC QUIET) - if (NOT OpenACC_Fortran_FOUND) - message(FATAL_ERROR - "Could NOT find OpenACC_Fortran.") - endif () + if(NOT OpenACC_Fortran_FOUND) + message(FATAL_ERROR "Could NOT find OpenACC_Fortran.") + endif() target_compile_options(fortran-support PRIVATE ${OpenACC_Fortran_OPTIONS}) # This make sures that unit tests (FortUTF) compiles without the need of # passing OpenACC compile option. target_link_libraries(fortran-support PRIVATE OpenACC::OpenACC_Fortran) - endif () -else () + endif() +else() if(HAS_OPENACC_MACRO) - message(FATAL_ERROR - "The OpenACC support is disabled but the _OPENACC macro is defined") - endif () -endif () + message( + FATAL_ERROR + "The OpenACC support is disabled but the _OPENACC macro is defined") + endif() +endif() -target_include_directories(fortran-support +target_include_directories( + fortran-support PUBLIC -# Path to the Fortran modules: + # Path to the Fortran modules: $<BUILD_INTERFACE:$<$<COMPILE_LANGUAGE:Fortran>:${Fortran_MODULE_DIRECTORY}>> $<INSTALL_INTERFACE:$<$<COMPILE_LANGUAGE:Fortran>:${CMAKE_INSTALL_INCLUDEDIR}>> INTERFACE -# Path to the internal C/C++ headers (for testing): -# Requires CMake 3.15+ for multiple compile languages https://cmake.org/cmake/help/latest/manual/cmake-generator-expressions.7.html + # Path to the internal C/C++ headers (for testing): Requires CMake 3.15+ for + # multiple compile languages + # https://cmake.org/cmake/help/latest/manual/cmake-generator-expressions.7.html $<BUILD_INTERFACE:$<$<COMPILE_LANGUAGE:C,CXX>:${CMAKE_CURRENT_SOURCE_DIR}>> PRIVATE -# Path to config.h (for C and C++ only): -# Requires CMake 3.15+ for multiple compile languages https://cmake.org/cmake/help/latest/manual/cmake-generator-expressions.7.html - $<BUILD_INTERFACE:$<$<COMPILE_LANGUAGE:C,CXX>:${CMAKE_CURRENT_BINARY_DIR}>> -) + # Path to config.h (for C and C++ only): Requires CMake 3.15+ for multiple + # compile languages + # https://cmake.org/cmake/help/latest/manual/cmake-generator-expressions.7.html + $<BUILD_INTERFACE:$<$<COMPILE_LANGUAGE:C,CXX>:${CMAKE_CURRENT_BINARY_DIR}>>) -install( - TARGETS fortran-support - EXPORT "${PROJECT_NAME}-targets" -) +install(TARGETS fortran-support EXPORT "${PROJECT_NAME}-targets") -install( - DIRECTORY - "${Fortran_MODULE_DIRECTORY}/" - TYPE INCLUDE -) +install(DIRECTORY "${Fortran_MODULE_DIRECTORY}/" TYPE INCLUDE) diff --git a/test/c/CMakeLists.txt b/test/c/CMakeLists.txt index 4c178c2..4b6fc82 100644 --- a/test/c/CMakeLists.txt +++ b/test/c/CMakeLists.txt @@ -14,58 +14,63 @@ enable_language(CXX) find_package(GTest 1.13) if(NOT GTest_FOUND) message(CHECK_START "Fetching external GTest") - if ("${CMAKE_VERSION}" VERSION_GREATER_EQUAL "3.24") + if("${CMAKE_VERSION}" VERSION_GREATER_EQUAL "3.24") cmake_policy(SET CMP0135 NEW) endif() include(FetchContent) - FetchContent_Declare(googletest + FetchContent_Declare( + googletest URL https://github.com/google/googletest/archive/refs/tags/v1.13.0.tar.gz - URL_HASH MD5=95b29f0038ec84a611df951d74d99897 - ) - set(INSTALL_GTEST OFF CACHE BOOL "Disable installation of googletest") - set(BUILD_GMOCK OFF CACHE BOOL "Do not build the googlemock subproject") + URL_HASH MD5=95b29f0038ec84a611df951d74d99897) + set(INSTALL_GTEST + OFF + CACHE BOOL "Disable installation of googletest") + set(BUILD_GMOCK + OFF + CACHE BOOL "Do not build the googlemock subproject") FetchContent_MakeAvailable(googletest) # GTest puts its build artifacts to ${CMAKE_BINARY_DIR} instead of # ${CMAKE_CURRENT_BINARY_DIR}. Therefore, we have to make it behave: - set_target_properties(gtest_main gtest - PROPERTIES - RUNTIME_OUTPUT_DIRECTORY "${googletest_BINARY_DIR}/bin" - LIBRARY_OUTPUT_DIRECTORY "${googletest_BINARY_DIR}/lib" - ARCHIVE_OUTPUT_DIRECTORY "${googletest_BINARY_DIR}/lib" - PDB_OUTPUT_DIRECTORY "${googletest_BINARY_DIR}/bin" - COMPILE_PDB_OUTPUT_DIRECTORY "${googletest_BINARY_DIR}/lib" - ) + set_target_properties( + gtest_main gtest + PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${googletest_BINARY_DIR}/bin" + LIBRARY_OUTPUT_DIRECTORY "${googletest_BINARY_DIR}/lib" + ARCHIVE_OUTPUT_DIRECTORY "${googletest_BINARY_DIR}/lib" + PDB_OUTPUT_DIRECTORY "${googletest_BINARY_DIR}/bin" + COMPILE_PDB_OUTPUT_DIRECTORY "${googletest_BINARY_DIR}/lib") message(CHECK_PASS "done") endif() include("${PROJECT_SOURCE_DIR}/cmake/gtest_helper.cmake") -if (FS_ENABLE_BACKTRACE_TEST) +if(FS_ENABLE_BACKTRACE_TEST) add_icon_c_test(UtilBacktraceTest ctest_util_backtrace.cpp) endif() -file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/test.namelist" - "&info_nml\n" - " file_name = 'test.namelist'\n" - " keywords = 'unit test','C language','nml_annotate'\n" - "/\n" - "&test_nml\n" - " numbers = 0,1,2,3\n" - " floating_points = -7.1,1.0,3.7,8.9\n" - " booleans = .TRUE., .FALSE., .true.\n" - " chars = 'unit', 'test'\n" - "/\n") -file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/result.namelist" - "\n" - "NAMELIST info_nml\n" - " file_name 'test.namelist'\n" - " keywords 'unit test', 'C language', 'nml_annotate'\n" - "\n" - "NAMELIST test_nml\n" - " numbers 0, 1, 2, 3\n" - " floating_points -7.1, 1.0, 3.7, 8.9\n" - " booleans .TRUE., .FALSE., .true.\n" - " chars 'unit', 'test'\n") +file( + WRITE "${CMAKE_CURRENT_BINARY_DIR}/test.namelist" + "&info_nml\n" + " file_name = 'test.namelist'\n" + " keywords = 'unit test','C language','nml_annotate'\n" + "/\n" + "&test_nml\n" + " numbers = 0,1,2,3\n" + " floating_points = -7.1,1.0,3.7,8.9\n" + " booleans = .TRUE., .FALSE., .true.\n" + " chars = 'unit', 'test'\n" + "/\n") +file( + WRITE "${CMAKE_CURRENT_BINARY_DIR}/result.namelist" + "\n" + "NAMELIST info_nml\n" + " file_name 'test.namelist'\n" + " keywords 'unit test', 'C language', 'nml_annotate'\n" + "\n" + "NAMELIST test_nml\n" + " numbers 0, 1, 2, 3\n" + " floating_points -7.1, 1.0, 3.7, 8.9\n" + " booleans .TRUE., .FALSE., .true.\n" + " chars 'unit', 'test'\n") add_icon_c_test(UtilNmlAnnotateTest ctest_nml_annotate.cpp) add_icon_c_test(UtilArithmeticExprTest ctest_util_arithmetic_expr.cpp) add_icon_c_test(UtilHashTest ctest_util_hash.cpp) diff --git a/test/fortran/CMakeLists.txt b/test/fortran/CMakeLists.txt index 2a60b65..5381535 100644 --- a/test/fortran/CMakeLists.txt +++ b/test/fortran/CMakeLists.txt @@ -10,14 +10,14 @@ # --------------------------------------------------------------- message(CHECK_START "Fetching external FortUTF") -if ("${CMAKE_VERSION}" VERSION_GREATER_EQUAL "3.24") +if("${CMAKE_VERSION}" VERSION_GREATER_EQUAL "3.24") cmake_policy(SET CMP0135 NEW) endif() include(FetchContent) -FetchContent_Declare(fortutf +FetchContent_Declare( + fortutf URL https://github.com/artemis-beta/FortUTF/archive/bf749de0f710e0dd7f6d00a4f5104d78fefb94e9.tar.gz - URL_HASH MD5=1246c176d0f543acf040facc26d24d54 -) + URL_HASH MD5=1246c176d0f543acf040facc26d24d54) FetchContent_MakeAvailable(fortutf) message(CHECK_PASS "done") @@ -28,9 +28,9 @@ set(FORTUTF_PROJECT_SRC_FILES helpers.f90) include("${fortutf_SOURCE_DIR}/cmake/fortutf.cmake") # We have to prevent FortUTF from generating invalid Fortran code: -set(project_name ${PROJECT_NAME}) +set(name_holder ${PROJECT_NAME}) string(REPLACE "-" "_" PROJECT_NAME ${PROJECT_NAME}) FortUTF_Find_Tests() -set(PROJECT_NAME ${project_name}) +set(PROJECT_NAME ${name_holder}) add_test(NAME FortUTF_UnitTest COMMAND fortran_support_Tests) set_property(TEST FortUTF_UnitTest PROPERTY LABELS Fortran) -- GitLab