119 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			CMake
		
	
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			CMake
		
	
	
	
	
	
| # Copyright (c) 2021-2025 Barcelona Supercomputing Center (BSC)
 | |
| # SPDX-License-Identifier: GPL-3.0-or-later
 | |
| 
 | |
| cmake_minimum_required(VERSION 3.20)
 | |
| 
 | |
| project(OVNI LANGUAGES C VERSION 1.11.0)
 | |
| 
 | |
| list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/")
 | |
| 
 | |
| add_compile_options(-Wall -Wextra -Wformat
 | |
|   -Wmissing-prototypes -Wstrict-prototypes
 | |
|   -Wconversion -Wsign-conversion
 | |
|   -Wold-style-definition -pedantic
 | |
|   -Werror
 | |
| )
 | |
| 
 | |
| set(CMAKE_C_VISIBILITY_PRESET hidden)
 | |
| 
 | |
| set(CMAKE_C_STANDARD 11)
 | |
| set(CMAKE_C_STANDARD_REQUIRED TRUE)
 | |
| set(CMAKE_C_EXTENSIONS FALSE)
 | |
| 
 | |
| option(ENABLE_DEBUG_LOG "Enable debug messages (very verbose)")
 | |
| option(ENABLE_ALL_TESTS "Forces the execution of all tests")
 | |
| set(OVNI_GIT_COMMIT "unknown" CACHE STRING "Set the git commit")
 | |
| 
 | |
| if("${OVNI_GIT_COMMIT}" STREQUAL "unknown")
 | |
|   message(WARNING "OVNI_GIT_COMMIT is unknown, please specify the git commit")
 | |
| endif()
 | |
| 
 | |
| if(ENABLE_DEBUG_LOG)
 | |
|   add_definitions(-DENABLE_DEBUG)
 | |
| endif()
 | |
| 
 | |
| add_definitions(-D_POSIX_C_SOURCE=200809L)
 | |
| 
 | |
| if(NOT CMAKE_BUILD_TYPE)
 | |
|   set(CMAKE_BUILD_TYPE "Release" CACHE STRING
 | |
|     "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel Asan UBsan." FORCE)
 | |
| endif(NOT CMAKE_BUILD_TYPE)
 | |
| 
 | |
| include(GNUInstallDirs)
 | |
| set(OVNI_CONFIG_RELDIR "${CMAKE_INSTALL_DATADIR}/ovni")
 | |
| set(OVNI_CONFIG_DIR "${CMAKE_INSTALL_PREFIX}/${OVNI_CONFIG_RELDIR}")
 | |
| 
 | |
| include(CheckIPOSupported)
 | |
| check_ipo_supported(RESULT ipo_available OUTPUT error LANGUAGES C)
 | |
| 
 | |
| # Enable IPO by default, if available
 | |
| if(NOT DEFINED CMAKE_INTERPROCEDURAL_OPTIMIZATION)
 | |
|   if(ipo_available)
 | |
|     set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
 | |
|   else()
 | |
|     message(WARNING "IPO is not supported, disabling")
 | |
|   endif()
 | |
| endif()
 | |
| 
 | |
| if(NOT CMAKE_INTERPROCEDURAL_OPTIMIZATION)
 | |
|   message(WARNING "IPO is not enabled, expect performance penalty")
 | |
| endif()
 | |
| 
 | |
| # Extra build type for AddressSanitizer (Asan)
 | |
| set(CMAKE_C_FLAGS_ASAN "${CMAKE_C_FLAGS_DEBUG} \
 | |
|   -fsanitize=address \
 | |
|   -fno-optimize-sibling-calls \
 | |
|   -fsanitize-address-use-after-scope \
 | |
|   -fno-omit-frame-pointer"
 | |
|   CACHE STRING "Flags used by the C compiler during AddressSanitizer builds." FORCE)
 | |
| 
 | |
| set(CMAKE_C_FLAGS_UBSAN "${CMAKE_C_FLAGS_DEBUG} \
 | |
|   -fsanitize=undefined \
 | |
|   -fno-sanitize-recover=all"
 | |
|   CACHE STRING "Flags used by the C compiler during UndefinedBehaviorSanitizer builds." FORCE)
 | |
| 
 | |
| find_program(IWYU NAMES include-what-you-use iwyu)
 | |
| 
 | |
| if(IWYU)
 | |
|   set(IWYU_CMD ${IWYU} -Xiwyu --no_comments)
 | |
|   set(CMAKE_C_INCLUDE_WHAT_YOU_USE ${IWYU_CMD})
 | |
|   message(STATUS "IWYU found")
 | |
| else()
 | |
|   message(STATUS "IWYU not found, skipping")
 | |
| endif()
 | |
| 
 | |
| # Required for clock_gettime() in glibc <= 2.17
 | |
| include(CheckLibraryExists)
 | |
| check_library_exists(c clock_gettime "" HAVE_CLOCK_GETTIME)
 | |
| 
 | |
| if (NOT HAVE_CLOCK_GETTIME)
 | |
|   check_library_exists(rt clock_gettime "time.h" HAVE_CLOCK_GETTIME_RT)
 | |
|   if (HAVE_CLOCK_GETTIME_RT)
 | |
|     set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lrt")
 | |
|     set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES} -lrt")
 | |
|   else()
 | |
|     message(FATAL_ERROR "cannot find clock_gettime()")
 | |
|   endif()
 | |
| endif()
 | |
| 
 | |
| # Check packages and features once
 | |
| find_package(Nanos6)
 | |
| find_package(Nodes)
 | |
| find_package(Nosv)
 | |
| find_package(Libompv)
 | |
| include(CheckPerfParanoid)
 | |
| include(CheckOmpSs2Compiler)
 | |
| 
 | |
| add_subdirectory(include)
 | |
| add_subdirectory(src)
 | |
| 
 | |
| include(CTest)
 | |
| if(BUILD_TESTING)
 | |
|   add_subdirectory(test)
 | |
| endif()
 | |
| 
 | |
| install(DIRECTORY cfg/ DESTINATION "${OVNI_CONFIG_RELDIR}")
 | |
| 
 | |
| include(FeatureSummary)
 | |
| feature_summary(WHAT ALL)
 |