diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml new file mode 100644 index 000000000..24604bc6e --- /dev/null +++ b/.github/workflows/cmake.yml @@ -0,0 +1,39 @@ +name: CMake + +on: + push: + branches-ignore: + - 'ci/**' + - '!ci/gha**' + - 'dependabot/**' + pull_request: + branches: + - 'master' + +concurrency: + group: cmake-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + test-install: + name: CMake - ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [macos-latest, ubuntu-latest, ubuntu-24.04-arm, windows-latest, windows-11-arm] + + steps: + - uses: actions/checkout@v6 + + - uses: ilammy/msvc-dev-cmd@v1 + + - name: Configure SIMDe + run: cmake -G Ninja -S . -B build + + - name: Build SIMDe + run: cmake --build build + + - name: Test SIMDe Package + run: ctest --test-dir build --output-on-failure --verbose + diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000..ec28c7b27 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,78 @@ +cmake_minimum_required(VERSION 3.22) + +project( + simde + DESCRIPTION + "Implementations of SIMD instruction sets for systems which don't natively support them." + HOMEPAGE_URL "https://github.com/simd-everywhere/simde" + LANGUAGES C CXX + VERSION 0.8.4 +) + +# Options +option(SIMDE_TEST_CMAKE_PACKAGING "Test cmake packaging" ${PROJECT_IS_TOP_LEVEL}) + +# The main simde library +add_library(simde INTERFACE) +add_library(simde::simde ALIAS simde) + +target_compile_features(simde INTERFACE c_std_99) + +target_include_directories( + simde + INTERFACE + $ + $ +) + +if(SIMDE_TEST_CMAKE_PACKAGING) + include(CTest) + enable_testing() + add_subdirectory(test/cmake-packaging) +endif() + +include(GNUInstallDirs) + +# Install headers +install(DIRECTORY simde DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) + +# Export targets +install(TARGETS simde EXPORT simde-targets) + +# Package Configuration +include(CMakePackageConfigHelpers) + +write_basic_package_version_file( + ${CMAKE_CURRENT_BINARY_DIR}/simde-config-version.cmake + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion +) + +file( + WRITE + ${CMAKE_CURRENT_BINARY_DIR}/simde-config.cmake.in + "@PACKAGE_INIT@\n" + "include(\"\${CMAKE_CURRENT_LIST_DIR}/simde-config-targets.cmake\")\n" +) + +configure_package_config_file( + ${CMAKE_CURRENT_BINARY_DIR}/simde-config.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/simde-config.cmake + INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/simde + NO_SET_AND_CHECK_MACRO + NO_CHECK_REQUIRED_COMPONENTS_MACRO +) + +install( + FILES + ${CMAKE_CURRENT_BINARY_DIR}/simde-config.cmake + ${CMAKE_CURRENT_BINARY_DIR}/simde-config-version.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/simde +) + +install( + EXPORT simde-targets + FILE simde-config-targets.cmake + NAMESPACE simde:: + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/simde +) diff --git a/docker/Dockerfile b/docker/Dockerfile index 70d91b77b..346eef4ca 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -27,7 +27,7 @@ RUN \ apt-get upgrade -y && \ apt-get install -yq --no-install-recommends \ git build-essential vim \ - ccache cmake ninja-build \ + ccache ninja-build \ '^clang-[0-9\.]+$' \ '^llvm-[0-9\.]+$' \ '^g(cc|\+\+)-[0-9\.]+$' \ diff --git a/docker/Dockerfile.ubuntu b/docker/Dockerfile.ubuntu index 14ab4b200..b23acbf18 100644 --- a/docker/Dockerfile.ubuntu +++ b/docker/Dockerfile.ubuntu @@ -19,7 +19,7 @@ RUN \ apt-get upgrade -y && \ apt-get install -yq --no-install-recommends \ git build-essential vim \ - ccache cmake ninja-build \ + ccache ninja-build \ '^clang-[0-9\.]+$' \ '^llvm-[0-9\.]+$' \ '^g(cc|\+\+)-[0-9\.]+$' \ diff --git a/docker/Dockerfile.ubuntu_bionic b/docker/Dockerfile.ubuntu_bionic index fc0666760..489fc90ca 100644 --- a/docker/Dockerfile.ubuntu_bionic +++ b/docker/Dockerfile.ubuntu_bionic @@ -19,7 +19,7 @@ RUN \ apt-get upgrade -y && \ apt-get install -yq --no-install-recommends \ git build-essential vim \ - ccache cmake ninja-build \ + ccache ninja-build \ '^clang-[0-9\.]+$' \ '^llvm-[0-9\.]+$' \ '^g(cc|\+\+)-[0-9\.]+$' \ diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt deleted file mode 100644 index b1b5394b2..000000000 --- a/test/CMakeLists.txt +++ /dev/null @@ -1,204 +0,0 @@ -cmake_minimum_required(VERSION 3.0) - -project(simde-tests) - -set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) -include (ExtraWarningFlags) - -enable_testing() - -option(BUILD_CPP_TESTS "Build C++ tests" ON) - -if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/munit/munit.c") - find_program(GIT git) - if(GIT) - execute_process(COMMAND ${GIT} submodule update --init --recursive) - else() - message (FATAL_ERROR "It looks like you don't have submodules checked out. Please run `git submodule update --init --recursive'") - endif() -endif() - -if(CMAKE_BUILD_TYPE STREQUAL "") - set(CMAKE_BUILD_TYPE "Debug") -elseif(CMAKE_BUILD_TYPE STREQUAL "Coverage") - set(orig_req_libs "${CMAKE_REQUIRED_LIBRARIES}") - set(CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES};--coverage") - check_c_compiler_flag("--coverage" CFLAG___coverage) - set(CMAKE_REQUIRED_LIBRARIES "${orig_req_libs}") - - if(CFLAG___coverage) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --coverage") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_C_FLAGS} --coverage") - add_definitions("-DSIMDE_NO_INLINE") - else() - set(CMAKE_BUILD_TYPE "Debug") - endif() -endif() - -add_library(munit STATIC munit/munit.c) - -include(CheckSymbolExists) -check_symbol_exists(clock_gettime "time.h" CLOCK_GETTIME_RES) -if(CLOCK_GETTIME_RES) - set(CLOCK_GETTIME_EXISTS yes) -else() - set(orig_req_libs "${CMAKE_REQUIRED_LIBRARIES}") - set(CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES};rt") - - check_symbol_exists(clock_gettime "time.h" CLOCK_GETTIME_LIBRT_RES) - if(CLOCK_GETTIME_LIBRT_RES) - set(CLOCK_GETTIME_EXISTS yes) - set(CLOCK_GETTIME_LIBRARY "rt") - endif() - - set(CMAKE_REQUIRED_LIBRARIES "${orig_req_libs}") - unset(orig_req_libs) -endif() - -check_symbol_exists(fegetround "fenv.h" FEGETROUND_EXISTS) -if(NOT FEGETROUND_EXISTS) - unset(FEGETROUND_EXISTS CACHE) - list(APPEND CMAKE_REQUIRED_LIBRARIES m) - check_symbol_exists(fegetround "fenv.h" FEGETROUND_EXISTS) - if(FEGETROUND_EXISTS) - set(NEED_LIBM True) - else() - message(FATAL_ERROR "Unable to find fegetround") - endif() -endif(NOT FEGETROUND_EXISTS) - -set_property(TARGET munit PROPERTY C_STANDARD "99") -if("${CLOCK_GETTIME_EXISTS}") - target_compile_definitions(munit PRIVATE "MUNIT_ALLOW_CLOCK_GETTIME") - target_link_libraries(munit "${CLOCK_GETTIME_LIBRARY}") -endif() - -if("${OPENMP_SIMD_FLAGS}" STREQUAL "") - foreach(omp_simd_flag "-fopenmp-simd" "-qopenmp-simd") - string (REGEX REPLACE "[^a-zA-Z0-9]+" "_" omp_simd_flag_name "CFLAG_${omp_simd_flag}") - check_c_compiler_flag("${omp_simd_flag}" "${omp_simd_flag_name}") - - if(${omp_simd_flag_name}) - set(OPENMP_SIMD_FLAGS "-DSIMDE_ENABLE_OPENMP ${omp_simd_flag}") - break() - endif() - endforeach() -endif() - -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OPENMP_SIMD_FLAGS}") - -if("${CMAKE_C_COMPILER_ID}" STREQUAL "Intel") - add_definitions(-DSIMDE_FAST_MATH) -endif() - -include_directories("${CMAKE_CURRENT_BINARY_DIR}") - -function(generate_declare_suites OUTFILE SOURCES) - file(WRITE "${OUTFILE}" "") - foreach(SOURCE ${SOURCES}) - get_filename_component(SUITE ${SOURCE} NAME_WLE) - string(REPLACE "." "_" SUITE "${SUITE}") - # message(FATAL_ERROR "${SUITE}") - file(APPEND "${OUTFILE}" "SIMDE_TEST_DECLARE_SUITE(${SUITE})\n") - endforeach(SOURCE ${SOURCES}) -endfunction(generate_declare_suites) - -aux_source_directory("arm/neon" ARM_NEON_SOURCES_C) -list(REMOVE_ITEM ARM_NEON_SOURCES_C "arm/neon/run-tests.c") -list(REMOVE_ITEM ARM_NEON_SOURCES_C "arm/neon/skel.c") -list(REMOVE_ITEM ARM_NEON_SOURCES_C "arm/neon/skel-single.c") -list(REMOVE_ITEM ARM_NEON_SOURCES_C "arm/neon/skel-triple.c") -generate_declare_suites("${CMAKE_CURRENT_BINARY_DIR}/test/arm/neon/declare-suites.h" "${ARM_NEON_SOURCES_C}") - -aux_source_directory("arm/sve" ARM_SVE_SOURCES_C) -list(REMOVE_ITEM ARM_SVE_SOURCES_C "arm/sve/run-tests.c") -generate_declare_suites("${CMAKE_CURRENT_BINARY_DIR}/test/arm/sve/declare-suites.h" "${ARM_SVE_SOURCES_C}") - -aux_source_directory("x86/avx512" X86_AVX512_SOURCES_C) -list(REMOVE_ITEM X86_AVX512_SOURCES_C "x86/avx512/run-tests.c") -list(REMOVE_ITEM X86_AVX512_SOURCES_C "x86/avx512/skel.c") -generate_declare_suites("${CMAKE_CURRENT_BINARY_DIR}/test/x86/avx512/declare-suites.h" "${X86_AVX512_SOURCES_C}") - -aux_source_directory("x86" X86_SOURCES_C) -list(REMOVE_ITEM X86_SOURCES_C "x86/skel.c") -list(REMOVE_ITEM X86_SOURCES_C "x86/run-tests.c") -generate_declare_suites("${CMAKE_CURRENT_BINARY_DIR}/test/x86/declare-suites.h" "${X86_SOURCES_C}") - -aux_source_directory("wasm/simd128" WASM_SIMD128_SOURCES_C) -list(REMOVE_ITEM WASM_SIMD128_SOURCES_C "wasm/simd128/run-tests.c") -generate_declare_suites("${CMAKE_CURRENT_BINARY_DIR}/test/wasm/simd128/declare-suites.h" "${WASM_SIMD128_SOURCES_C}") - -aux_source_directory("wasm/relaxed-simd" WASM_RELAXED_SIMD_SOURCES_C) -list(REMOVE_ITEM WASM_RELAXED_SIMD_SOURCES_C "wasm/relaxed-simd/run-tests.c") -generate_declare_suites("${CMAKE_CURRENT_BINARY_DIR}/test/wasm/relaxed-simd/declare-suites.h" "${WASM_RELAXED_SIMD_SOURCES_C}") - -aux_source_directory("mips/msa" MIPS_MSA_SOURCES_C) -list(REMOVE_ITEM MIPS_MSA_SOURCES_C "mips/msa/run-tests.c") -generate_declare_suites("${CMAKE_CURRENT_BINARY_DIR}/test/mips/msa/declare-suites.h" "${MIPS_MSA_SOURCES_C}") - -set(TEST_SOURCES_C - ${X86_SOURCES_C} - ${X86_AVX512_SOURCES_C} - ${ARM_NEON_SOURCES_C} - ${ARM_SVE_SOURCES_C} - ${WASM_SIMD128_SOURCES_C} - ${WASM_RELAXED_SIMD_SOURCES_C} - ${MIPS_MSA_SOURCES_C}) - -set(TEST_RUNNER_SOURCES - run-tests.c - x86/run-tests.c - x86/avx512/run-tests.c - arm/run-tests.c - arm/neon/run-tests.c - arm/sve/run-tests.c - wasm/run-tests.c - wasm/simd128/run-tests.c - wasm/relaxed-simd/run-tests.c - mips/run-tests.c - mips/msa/run-tests.c) -add_executable(run-tests ${TEST_RUNNER_SOURCES}) -set_property(TARGET run-tests PROPERTY C_STANDARD "99") -target_add_compiler_flags(run-tests "-Wno-psabi") - -target_link_libraries(run-tests munit) -target_add_compiler_flags (munit "-w") -if(NEED_LIBM) - target_link_libraries(run-tests m) -endif(NEED_LIBM) - -set(TEST_SOURCES_CPP) -if(BUILD_CPP_TESTS) - foreach(csource ${TEST_SOURCES_C}) - configure_file("${csource}" "${CMAKE_CURRENT_BINARY_DIR}/${csource}pp") - list(APPEND TEST_SOURCES_CPP "${CMAKE_CURRENT_BINARY_DIR}/${csource}pp") - - get_filename_component(DIR "${csource}" DIRECTORY) - set_property(SOURCE "${CMAKE_CURRENT_BINARY_DIR}/${csource}pp" APPEND PROPERTY COMPILE_FLAGS " -I${CMAKE_CURRENT_SOURCE_DIR}/${DIR}") - endforeach() - - add_definitions(-DSIMDE_BUILD_CPP_TESTS) -endif(BUILD_CPP_TESTS) - -add_definitions(-DSIMDE_CONSTRAINED_COMPILATION) - -foreach(native native emul) - add_library(simde-test-${native} STATIC ${TEST_SOURCES_C} ${TEST_SOURCES_CPP}) - - target_include_directories(simde-test-${native} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/..") - set_property(TARGET simde-test-${native} PROPERTY C_STANDARD "99") - - target_link_libraries(run-tests simde-test-${native}) - target_add_compiler_flags(simde-test-${native} "-Wno-psabi") -endforeach(native native emul) -target_compile_definitions(simde-test-emul PRIVATE SIMDE_NO_NATIVE) - -foreach(src ${TEST_SOURCES_C}) - string(REGEX REPLACE "^(.+)\\.c$" "/\\1" TEST_NAME "${src}") - add_test(NAME "${TEST_NAME}" COMMAND $ "${TEST_NAME}") -endforeach(src ${TEST_SOURCES_C}) - -message(WARNING - "CMake support is deprecated; please use Meson instead. CMake is only present " - "for compilers which Meson doesn't yet support (e.g., xlc) and platforms where " - "difficult to run an up-to-date copy of Meson (e.g., Ubuntu 12.04).") diff --git a/test/cmake-packaging/CMakeLists.txt b/test/cmake-packaging/CMakeLists.txt new file mode 100644 index 000000000..f1e66b258 --- /dev/null +++ b/test/cmake-packaging/CMakeLists.txt @@ -0,0 +1,27 @@ +add_test( + NAME simde-cmake-install + COMMAND ${CMAKE_CTEST_COMMAND} + --build-and-test "${PROJECT_SOURCE_DIR}" + "${PROJECT_BINARY_DIR}/build" + --build-generator ${CMAKE_GENERATOR} + --build-target install + --build-options "-DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR}/install" +) + +add_test( + NAME simde-cmake-find-package + COMMAND ${CMAKE_CTEST_COMMAND} + --build-and-test "${CMAKE_CURRENT_SOURCE_DIR}/cmake-find-package" + "${PROJECT_BINARY_DIR}/cmake-find-package/build" + --build-generator "${CMAKE_GENERATOR}" + --build-options "-DCMAKE_PREFIX_PATH=${PROJECT_BINARY_DIR}/install" +) +set_tests_properties(simde-cmake-find-package PROPERTIES DEPENDS simde-cmake-install) + +add_test( + NAME simde-cmake-fetchcontent + COMMAND ${CMAKE_CTEST_COMMAND} + --build-and-test "${CMAKE_CURRENT_SOURCE_DIR}/cmake-fetchcontent" + "${PROJECT_BINARY_DIR}/cmake-fetchcontent/build" + --build-generator "${CMAKE_GENERATOR}" +) diff --git a/test/cmake-packaging/cmake-fetchcontent/CMakeLists.txt b/test/cmake-packaging/cmake-fetchcontent/CMakeLists.txt new file mode 100644 index 000000000..e3fb554d4 --- /dev/null +++ b/test/cmake-packaging/cmake-fetchcontent/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.22) +project(simde-fetchcontent-consumer LANGUAGES C CXX) + +include(FetchContent) +FetchContent_Declare(simde SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../) +FetchContent_MakeAvailable(simde) + +add_executable(consumer-fc-c main.c) +target_link_libraries(consumer-fc-c PRIVATE simde::simde) + +add_executable(consumer-fc-cpp main.cpp) +target_link_libraries(consumer-fc-cpp PRIVATE simde::simde) + +enable_testing() +add_test(NAME consumer-fc-c COMMAND consumer-fc-c) +add_test(NAME consumer-fc-cpp COMMAND consumer-fc-cpp) diff --git a/test/cmake-packaging/cmake-fetchcontent/main.c b/test/cmake-packaging/cmake-fetchcontent/main.c new file mode 100644 index 000000000..09b9f8b57 --- /dev/null +++ b/test/cmake-packaging/cmake-fetchcontent/main.c @@ -0,0 +1,9 @@ +#include +#include + +int main(void) { + simde__m128 a = simde_mm_set_ps(1.0f, 2.0f, 3.0f, 4.0f); + (void)a; + printf("SIMDe cmake FetchContent test works!\n"); + return 0; +} diff --git a/test/cmake-packaging/cmake-fetchcontent/main.cpp b/test/cmake-packaging/cmake-fetchcontent/main.cpp new file mode 100644 index 000000000..5436fb65c --- /dev/null +++ b/test/cmake-packaging/cmake-fetchcontent/main.cpp @@ -0,0 +1,9 @@ +#include +#include + +int main() { + simde__m128 a = simde_mm_set_ps(1.0f, 2.0f, 3.0f, 4.0f); + (void)a; + std::cout << "SIMDe cmake install test works (C++)!" << std::endl; + return 0; +} diff --git a/test/cmake-packaging/cmake-find-package/CMakeLists.txt b/test/cmake-packaging/cmake-find-package/CMakeLists.txt new file mode 100644 index 000000000..7084fac6f --- /dev/null +++ b/test/cmake-packaging/cmake-find-package/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 3.22) +project(simde-consumer LANGUAGES C CXX) + +find_package(simde CONFIG REQUIRED) +message(STATUS "simde version: ${simde_VERSION}") + +add_executable(consumer-c main.c) +target_link_libraries(consumer-c PRIVATE simde::simde) + +add_executable(consumer-cpp main.cpp) +target_link_libraries(consumer-cpp PRIVATE simde::simde) + +enable_testing() +add_test(NAME consumer-c COMMAND consumer-c) +add_test(NAME consumer-cpp COMMAND consumer-cpp) diff --git a/test/cmake-packaging/cmake-find-package/main.c b/test/cmake-packaging/cmake-find-package/main.c new file mode 100644 index 000000000..805542a74 --- /dev/null +++ b/test/cmake-packaging/cmake-find-package/main.c @@ -0,0 +1,9 @@ +#include +#include + +int main(void) { + simde__m128 a = simde_mm_set_ps(1.0f, 2.0f, 3.0f, 4.0f); + (void)a; + printf("SIMDe cmake install test works!\n"); + return 0; +} diff --git a/test/cmake-packaging/cmake-find-package/main.cpp b/test/cmake-packaging/cmake-find-package/main.cpp new file mode 100644 index 000000000..5436fb65c --- /dev/null +++ b/test/cmake-packaging/cmake-find-package/main.cpp @@ -0,0 +1,9 @@ +#include +#include + +int main() { + simde__m128 a = simde_mm_set_ps(1.0f, 2.0f, 3.0f, 4.0f); + (void)a; + std::cout << "SIMDe cmake install test works (C++)!" << std::endl; + return 0; +} diff --git a/test/cmake/AddCompilerFlags.cmake b/test/cmake/AddCompilerFlags.cmake deleted file mode 100644 index 3a94161d9..000000000 --- a/test/cmake/AddCompilerFlags.cmake +++ /dev/null @@ -1,171 +0,0 @@ -# This module provides a convenient way to add C/C++ compiler flags if -# the compiler supports them. - -include (CheckCCompilerFlag) -include (CheckCXXCompilerFlag) - -cmake_policy(SET CMP0054 NEW) - -# Depending on the settings, some compilers will accept unknown flags. -# We try to disable this behavior by also passing these flags when we -# check if a flag is supported. -set (ADD_COMPILER_FLAGS_PREPEND "") - -if (CMAKE_C_COMPILER_ID STREQUAL "GNU") - set (ADD_COMPILER_FLAGS_PREPEND "-Wall -Wextra -Werror") -elseif (CMAKE_C_COMPILER_ID STREQUAL "Clang") - set (ADD_COMPILER_FLAGS_PREPEND "-Werror=unknown-warning-option") -endif () - -## -# Set a variable to different flags, depending on which compiler is in -# use. -# -# Example: -# set_compiler_specific_flags(VARIABLE varname MSVC /wd666 INTEL /wd1729) -# -# This will set varname to /wd666 if the compiler is MSVC, and /wd1729 -# if it is Intel. -# -# Possible compilers: -# - GCC: GNU C Compiler -# - GCCISH: A compiler that (tries to) be GCC-compatible on the CLI -# (i.e., anything but MSVC). -# - CLANG: clang -# - MSVC: Microsoft Visual C++ compiler -# - INTEL: Intel C Compiler -# - PGI: PGI C Compiler -# -# Note: the compiler is determined based on the value of the -# CMAKE_C_COMPILER_ID variable, not CMAKE_CXX_COMPILER_ID. -## -function (set_compiler_specific_flags) - set (oneValueArgs VARIABLE) - set (multiValueArgs GCC GCCISH INTEL CLANG MSVC PGI) - cmake_parse_arguments(COMPILER_SPECIFIC_FLAGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - unset (options) - unset (oneValueArgs) - unset (multiValueArgs) - - set (compiler_flags) - - if (CMAKE_C_COMPILER_ID STREQUAL "GNU") - list (APPEND compiler_flags ${COMPILER_SPECIFIC_FLAGS_GCC}) - elseif(CMAKE_C_COMPILER_ID STREQUAL "Clang") - list (APPEND compiler_flags ${COMPILER_SPECIFIC_FLAGS_CLANG}) - elseif(CMAKE_C_COMPILER_ID STREQUAL "Intel") - list (APPEND compiler_flags ${COMPILER_SPECIFIC_FLAGS_INTEL}) - elseif(CMAKE_C_COMPILER_ID STREQUAL "MSVC") - list (APPEND compiler_flags ${COMPILER_SPECIFIC_FLAGS_MSVC}) - elseif(CMAKE_C_COMPILER_ID STREQUAL "PGI") - list (APPEND compiler_flags ${COMPILER_SPECIFIC_FLAGS_PGI}) - endif() - - set(GCCISH_COMPILERS GNU Clang Intel) - list(FIND GCCISH_COMPILERS "${CMAKE_C_COMPILER_ID}" IS_GCCISH) - if (IS_GCCISH GREATER -1) - list (APPEND compiler_flags ${COMPILER_SPECIFIC_FLAGS_GCCISH}) - endif () - - set (${COMPILER_SPECIFIC_FLAGS_VARIABLE} "${compiler_flags}" PARENT_SCOPE) -endfunction () - -function (source_file_add_compiler_flags_unchecked file) - set (flags ${ARGV}) - list (REMOVE_AT flags 0) - get_source_file_property (sources ${file} SOURCES) - - foreach (flag ${flags}) - get_source_file_property (existing ${file} COMPILE_FLAGS) - if ("${existing}" STREQUAL "NOTFOUND") - set_source_files_properties (${file} - PROPERTIES COMPILE_FLAGS "${flag}") - else () - set_source_files_properties (${file} - PROPERTIES COMPILE_FLAGS "${existing} ${flag}") - endif () - endforeach (flag) -endfunction () - -function (source_file_add_compiler_flags file) - set (flags ${ARGV}) - list (REMOVE_AT flags 0) - get_source_file_property (sources ${file} SOURCES) - - foreach (flag ${flags}) - if (CMAKE_C_COMPILER_ID STREQUAL "GNU") - # Because https://gcc.gnu.org/wiki/FAQ#wnowarning - string (REGEX REPLACE "\\-Wno\\-(.+)" "-W\\1" flag_to_test "${flag}") - else () - set (flag_to_test ${flag}) - endif () - - if (file MATCHES "\\.c$") - string (REGEX REPLACE "[^a-zA-Z0-9]+" "_" test_name "CFLAG_${flag_to_test}") - CHECK_C_COMPILER_FLAG ("${ADD_COMPILER_FLAGS_PREPEND} ${flag_to_test}" ${test_name}) - elseif (file MATCHES "\\.(cpp|cc|cxx)$") - string (REGEX REPLACE "[^a-zA-Z0-9]+" "_" test_name "CXXFLAG_${flag_to_test}") - CHECK_CXX_COMPILER_FLAG ("${ADD_COMPILER_FLAGS_PREPEND} ${flag_to_test}" ${test_name}) - endif () - - if (${test_name}) - source_file_add_compiler_flags_unchecked (${file} ${flag}) - endif () - - unset (test_name) - unset (flag_to_test) - endforeach (flag) - - unset (flags) -endfunction () - -function (target_add_compiler_flags target) - set (flags ${ARGV}) - list (REMOVE_AT flags 0) - get_target_property (sources ${target} SOURCES) - - foreach (source ${sources}) - source_file_add_compiler_flags (${source} ${flags}) - endforeach (source) - - unset (flags) - unset (sources) -endfunction (target_add_compiler_flags) - -# global_add_compiler_flags (flag1 [flag2 [flag3 ...]]): -# -# This just adds the requested compiler flags to -# CMAKE_C/CXX_FLAGS variable if they work with the compiler. -function (global_add_compiler_flags) - set (flags ${ARGV}) - - foreach (flag ${flags}) - if ("GNU" STREQUAL "${CMAKE_C_COMPILER_ID}") - # Because https://gcc.gnu.org/wiki/FAQ#wnowarning - string (REGEX REPLACE "\\-Wno\\-(.+)" "-W\\1" flag_to_test "${flag}") - else () - set (flag_to_test "${flag}") - endif () - - string (REGEX REPLACE "[^a-zA-Z0-9]+" "_" c_test_name "CFLAG_${flag_to_test}") - CHECK_C_COMPILER_FLAG ("${ADD_COMPILER_FLAGS_PREPEND} ${flag_to_test}" ${c_test_name}) - if (${c_test_name}) - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}") - endif () - unset (c_test_name) - - string (REGEX REPLACE "[^a-zA-Z0-9]+" "_" cxx_test_name "CFLAG_${flag_to_test}") - CHECK_CXX_COMPILER_FLAG ("${ADD_COMPILER_FLAGS_PREPEND} ${flag_to_test}" ${cxx_test_name}) - if (${cxx_test_name}) - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") - endif () - unset (cxx_test_name) - - unset (flag_to_test) - endforeach (flag) - - unset (flags) - - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" PARENT_SCOPE) - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" PARENT_SCOPE) -endfunction (global_add_compiler_flags) diff --git a/test/cmake/ExtraWarningFlags.cmake b/test/cmake/ExtraWarningFlags.cmake deleted file mode 100644 index c7418490f..000000000 --- a/test/cmake/ExtraWarningFlags.cmake +++ /dev/null @@ -1,68 +0,0 @@ -# This is basically supposed to be the CMake equivalent of -# https://git.gnome.org/browse/gnome-common/tree/macros2/gnome-compiler-flags.m4 - -include (AddCompilerFlags) - -if (MSVC) - set (EXTRA_WARNING_FLAGS - /W4 - /analyze) -else () - set (EXTRA_WARNING_FLAGS - -Wall - -Wcast-align - -Wclobbered - -Wempty-body - -Werror=format=2 - -Werror=format-security - -Werror=implicit-function-declaration - -Werror=init-self - -Werror=missing-include-dirs - -Werror=missing-prototypes - -Werror=pointer-arith - -Wextra - -Wformat-nonliteral - -Wformat-security - -Wignored-qualifiers - -Winit-self - -Winvalid-pch - -Wlogical-op - -Wmissing-declarations - -Wmissing-format-attribute - -Wmissing-include-dirs - -Wmissing-noreturn - -Wmissing-parameter-type - -Wmissing-prototypes - -Wnested-externs - -Wno-missing-field-initializers - -Wno-strict-aliasing - -Wno-uninitialized - -Wno-unused-parameter - -Wold-style-definition - -Woverride-init - -Wpacked - -Wpointer-arith - -Wredundant-decls - -Wreturn-type - -Wshadow - -Wsign-compare - -Wstrict-prototypes - -Wswitch-enum - -Wsync-nand - -Wtype-limits - -Wundef - -Wuninitialized - -WUnsafe-loop-optimizations - -Wwrite-strings - -Wsuggest-attribute=format) -endif () - -mark_as_advanced (EXTRA_WARNING_FLAGS) - -function (target_add_extra_warning_flags target) - target_add_compiler_flags (${target} ${EXTRA_WARNING_FLAGS}) -endfunction (target_add_extra_warning_flags) - -function (source_file_add_extra_warning_flags file) - source_file_add_compiler_flags (${file} ${EXTRA_WARNING_FLAGS}) -endfunction (source_file_add_extra_warning_flags)