# Options option(BUILD_SHARED_LIBS "Build shared libs" ON) option(BUILD_DFT "libsleefdft will be built." ON) option(BUILD_GNUABI_LIBS "libsleefgnuabi will be built." ON) option(BUILD_TESTS "Tests will be built." ON) option(SLEEF_TEST_ALL_IUT "Perform tests on implementations with all vector extensions" OFF) option(SLEEF_SHOW_CONFIG "Show SLEEF configuration status messages." ON) option(SLEEF_SHOW_ERROR_LOG "Show cmake error log." OFF) # See doc/build-with-cmake.md for instructions on how to build Sleef. cmake_minimum_required(VERSION 3.4.3) # Set to NEW when updating cmake_minimum_required to VERSION >= 3.7.2 if(${CMAKE_VERSION} VERSION_GREATER "3.7.1") cmake_policy(SET CMP0066 OLD) endif() enable_testing() set(SLEEF_VERSION_MAJOR 3) set(SLEEF_VERSION_MINOR 3) set(SLEEF_SOVERSION ${SLEEF_VERSION_MAJOR}) project(SLEEF VERSION ${SLEEF_VERSION_MAJOR}.${SLEEF_VERSION_MINOR} LANGUAGES C) # Sanity check for in-source builds which we do not want to happen if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) message(FATAL_ERROR "SLEEF does not allow in-source builds. You can refer to doc/build-with-cmake.md for instructions on how provide a \ separate build directory. Note: Please remove autogenerated file \ `CMakeCache.txt` and directory `CMakeFiles` in the current directory.") endif() # Set output directories for the library files set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) foreach(CONFIG ${CMAKE_CONFIGURATION_TYPES}) string(TOUPPER ${CONFIG} CONFIG) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${CONFIG} ${PROJECT_BINARY_DIR}/lib) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${CONFIG} ${PROJECT_BINARY_DIR}/lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${CONFIG} ${PROJECT_BINARY_DIR}/bin) endforeach(CONFIG CMAKE_CONFIGURATION_TYPES) # Path for finding cmake modules set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules) set(SLEEF_SCRIPT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Scripts CACHE PATH "Path for finding sleef specific cmake scripts") # sleef-config.h.in passes cmake settings to the source code include(Configure.cmake) configure_file( ${PROJECT_SOURCE_DIR}/sleef-config.h.in ${PROJECT_BINARY_DIR}/include/sleef-config.h @ONLY) # We like to have a documented index of all targets in the project. The # variables listed below carry the names of the targets defined throughout # the project. # Generates object file (shared library) `libsleef` # Defined in src/libm/CMakeLists.txt via command add_library set(TARGET_LIBSLEEF "sleef") set(TARGET_LIBSLEEFGNUABI "sleefgnuabi") # Generates the sleef.h headers and all the rename headers # Defined in src/libm/CMakeLists.txt via custom commands and a custom target set(TARGET_HEADERS "headers") # Generates executable files for running the test suite # Defined in src/libm-tester/CMakeLists.txt via command add_executable set(TARGET_TESTER "tester") set(TARGET_IUT "iut") set(TARGET_IUTSSE2 "iutsse2") set(TARGET_IUTSSE4 "iutsse4") set(TARGET_IUTAVX "iutavx") set(TARGET_IUTFMA4 "iutfma4") set(TARGET_IUTAVX2 "iutavx2") set(TARGET_IUTAVX2128 "iutavx2128") set(TARGET_IUTAVX512F "iutavx512f") set(TARGET_IUTADVSIMD "iutadvsimd") set(TARGET_IUTNEON32 "iutneon32") set(TARGET_IUTSVE "iutsve") set(TARGET_IUTVSX "iutvsx") # The target to generate LLVM bitcode only, available when SLEEF_ENABLE_LLVM_BITCODE is passed to cmake set(TARGET_LLVM_BITCODE "llvm-bitcode") # Generates the helper executable file mkrename needed to write the sleef header set(TARGET_MKRENAME "mkrename") set(TARGET_MKRENAME_GNUABI "mkrename_gnuabi") set(TARGET_MKMASKED_GNUABI "mkmasked_gnuabi") # Generates the helper executable file mkdisp needed to write the sleef header set(TARGET_MKDISP "mkdisp") set(TARGET_MKALIAS "mkalias") # Generates static library common # Defined in src/common/CMakeLists.txt via command add_library set(TARGET_LIBCOMMON_OBJ "common") set(TARGET_LIBARRAYMAP_OBJ "arraymap") # Function used to add an executable that is executed on host function(add_host_executable TARGETNAME) if (NOT CMAKE_CROSSCOMPILING) add_executable(${TARGETNAME} ${ARGN}) else() add_executable(${TARGETNAME} IMPORTED) set_property(TARGET ${TARGETNAME} PROPERTY IMPORTED_LOCATION ${NATIVE_BUILD_DIR}/bin/${TARGETNAME}) endif() endfunction() # Generates object file (shared library) `libsleefdft` # Defined in src/dft/CMakeLists.txt via command add_library set(TARGET_LIBDFT "sleefdft") # Check subdirectories add_subdirectory("src") # Extra messages at configuration time. By default is active, it can be # turned off by invoking cmake with "-DSLEEF_SHOW_CONFIG=OFF". if(SLEEF_SHOW_CONFIG) message(STATUS "Configuring build for \ ${PROJECT_NAME}-v${SLEEF_VERSION_MAJOR}.${SLEEF_VERSION_MINOR}") message(" Target system: ${CMAKE_SYSTEM}") message(" Target processor: ${CMAKE_SYSTEM_PROCESSOR}") message(" Host system: ${CMAKE_HOST_SYSTEM}") message(" Host processor: ${CMAKE_HOST_SYSTEM_PROCESSOR}") message(" Detected C compiler: ${CMAKE_C_COMPILER_ID} @ ${CMAKE_C_COMPILER}") if(CMAKE_CROSSCOMPILING) message(" Crosscompiling SLEEF.") message(" Native build dir: ${NATIVE_BUILD_DIR}") endif(CMAKE_CROSSCOMPILING) message(STATUS "Using option `${SLEEF_C_FLAGS}` to compile libsleef") message(STATUS "Building shared libs : " ${BUILD_SHARED_LIBS}) message(STATUS "MPFR : " ${LIB_MPFR}) if (MPFR_INCLUDE_DIR) message(STATUS "MPFR header file in " ${MPFR_INCLUDE_DIR}) endif() message(STATUS "GMP : " ${LIBGMP}) message(STATUS "RT : " ${LIBRT}) message(STATUS "FFTW3 : " ${LIBFFTW3}) message(STATUS "SDE : " ${SDE_COMMAND}) message(STATUS "RUNNING_ON_TRAVIS : " ${RUNNING_ON_TRAVIS}) message(STATUS "COMPILER_SUPPORTS_OPENMP : " ${COMPILER_SUPPORTS_OPENMP}) if(ENABLE_GNUABI) message(STATUS "A version of SLEEF compatible with libm and libmvec in GNU libc will be produced (${TARGET_LIBSLEEFGNUABI}.so)") endif() if (COMPILER_SUPPORTS_SVE) message(STATUS "Building SLEEF with VLA SVE support") if (ARMIE_COMMAND) message(STATUS "Arm Instruction Emulator found at ${ARMIE_COMMAND}") message(STATUS "SVE testing is done with ${SVE_VECTOR_BITS}-bits vectors.") endif() endif() endif(SLEEF_SHOW_CONFIG) if (MSVC) message("") message("*** Note: Parallel build is not supported on Microsoft Visual Studio") endif()