cmake_minimum_required(VERSION 3.12) project(BLAS C) set(BLAS_MAJOR_VERSION 0) set(BLAS_MINOR_VERSION 1) set(BLAS_PATCH_VERSION 0) set( BLAS_VERSION ${BLAS_MAJOR_VERSION}.${BLAS_MINOR_VERSION}.${BLAS_PATCH_VERSION} ) set(CMAKE_C_STANDARD 99) set(CMAKE_C_STANDARD_REQUIRED True) # Add the CMake directory for custom CMake modules set(CMAKE_MODULE_PATH "${BLAS_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH}) # Export all symbols on Windows when building shared libraries SET(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE) # Set a default build type if none was specified if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) message(STATUS "Setting build type to 'Release' as none was specified.") set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE) # Set the possible values of build type for cmake-gui set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo" "Coverage") endif() # Coverage set(_is_coverage_build 0) set(_msg "Checking if build type is 'Coverage'") message(STATUS "${_msg}") if(NOT CMAKE_CONFIGURATION_TYPES) string(TOLOWER ${CMAKE_BUILD_TYPE} _build_type_lc) if(${_build_type_lc} STREQUAL "coverage") set(_is_coverage_build 1) endif() endif() message(STATUS "${_msg}: ${_is_coverage_build}") if(_is_coverage_build) message(STATUS "Adding coverage") find_package(codecov) endif() # By default static library option(BUILD_SHARED_LIBS "Build shared libraries" OFF) # By default build index32 library option(BUILD_INDEX64 "Build Index-64 API libraries" OFF) if(BUILD_INDEX64) set(BLASLIB "blas64") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWeirdNEC -DLAPACK_ILP64 -DHAVE_LAPACK_CONFIG_H") set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fdefault-integer-8") else() set(BLASLIB "blas") endif() # -------------------------------------------------- set(BLAS_INSTALL_EXPORT_NAME ${BLASLIB}-targets) macro(blas_install_library lib) install(TARGETS ${lib} EXPORT ${BLAS_INSTALL_EXPORT_NAME} ARCHIVE DESTINATION lib COMPONENT Development LIBRARY DESTINATION lib COMPONENT RuntimeLibraries RUNTIME DESTINATION lib COMPONENT RuntimeLibraries ) endmacro() set(PKG_CONFIG_DIR lib/pkgconfig) # -------------------------------------------------- # Precision to build # By default all precisions are generated option(BUILD_SINGLE "Build single precision real" ON) option(BUILD_DOUBLE "Build double precision real" ON) option(BUILD_COMPLEX "Build single precision complex" ON) option(BUILD_COMPLEX16 "Build double precision complex" ON) message(STATUS "Build single precision real: ${BUILD_SINGLE}") message(STATUS "Build double precision real: ${BUILD_DOUBLE}") message(STATUS "Build single precision complex: ${BUILD_COMPLEX}") message(STATUS "Build double precision complex: ${BUILD_COMPLEX16}") include_directories(src/) if(NOT (BUILD_SINGLE OR BUILD_DOUBLE OR BUILD_COMPLEX OR BUILD_COMPLEX16)) message(FATAL_ERROR "Nothing to build, no precision selected. Please enable at least one of these: BUILD_SINGLE, BUILD_DOUBLE, BUILD_COMPLEX, BUILD_COMPLEX16.") endif() include(GNUInstallDirs) # Updated OSX RPATH settings # In response to CMake 3.0 generating warnings regarding policy CMP0042, # the OSX RPATH settings have been updated per recommendations found # in the CMake Wiki: # http://www.cmake.org/Wiki/CMake_RPATH_handling#Mac_OS_X_and_the_RPATH set(CMAKE_MACOSX_RPATH ON) set(CMAKE_SKIP_BUILD_RPATH FALSE) set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES ${CMAKE_INSTALL_FULL_LIBDIR} isSystemDir) if("${isSystemDir}" STREQUAL "-1") set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_FULL_LIBDIR}) set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) endif() include(PreventInSourceBuilds) include(PreventInBuildInstalls) # -------------------------------------------------- # Check for any necessary platform specific compiler flags include(CheckLAPACKCompilerFlags) CheckLAPACKCompilerFlags("-recursive" _recursiveFlag) CheckLAPACKCompilerFlags("-frecursive" _frecursiveFlag) CheckLAPACKCompilerFlags("-Mrecursive" _MrecursiveFlag) # Add recursive flag if(_recursiveFlag) string(REGEX MATCH "-recursive" output_test "${CMAKE_Fortran_FLAGS}") if(NOT output_test) set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -recursive" CACHE STRING "Recursive flag must be set" FORCE) endif() elseif(_frecursiveFlag) string(REGEX MATCH "-frecursive" output_test "${CMAKE_Fortran_FLAGS}") if(NOT output_test) set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -frecursive" CACHE STRING "Recursive flag must be set" FORCE) endif() elseif(_MrecursiveFlag) string(REGEX MATCH "-Mrecursive" output_test "${CMAKE_Fortran_FLAGS}") if(NOT output_test) set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -Mrecursive" CACHE STRING "Recursive flag must be set" FORCE) endif() endif() set(BLAS_LIBRARIES ${BLASLIB}) add_subdirectory(src) # -------------------------------------------------- # Testing option(BUILD_TESTING "Build tests" ${_is_coverage_build}) include(CTest) message(STATUS "Build tests: ${BUILD_TESTING}") if(BUILD_TESTING) add_subdirectory(TESTING) endif() configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/blas.pc.in ${CMAKE_CURRENT_BINARY_DIR}/${BLASLIB}.pc @ONLY) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${BLASLIB}.pc DESTINATION ${PKG_CONFIG_DIR} COMPONENT Development )