1 # CMake find module to search for the SimGrid library.
3 # Copyright (c) 2016-2023. The SimGrid Team.
5 # This file is free software; you can redistribute it and/or modify it
6 # under the terms of the license (GNU LGPL) which comes with this package.
9 # USERS OF PROGRAMS USING SIMGRID
10 # -------------------------------
12 # If cmake does not find this file, add its path to CMAKE_PREFIX_PATH:
13 # CMAKE_PREFIX_PATH="/path/to/FindSimGrid.cmake:$CMAKE_PREFIX_PATH" cmake .
15 # If this file does not find SimGrid, define SimGrid_PATH:
16 # cmake -DSimGrid_PATH=/path/to/simgrid .
19 # DEVELOPERS OF PROGRAMS USING SIMGRID
20 # ------------------------------------
22 # 1. Include this file in your own CMakeLists.txt (before defining any target)
23 # Either by copying it in your tree, or (recommended) by using the
24 # version automatically installed by SimGrid.
26 # 2. This will define a target called 'SimGrid::Simgrid'. Use it as:
27 # target_link_libraries(your-simulator SimGrid::SimGrid)
29 # It also defines a SimGrid_VERSION macro, that you can use to deal with API
30 # evolutions as follows:
32 # #if SimGrid_VERSION < 31800
33 # (code to use if the installed version is lower than v3.18)
34 # #elif SimGrid_VERSION < 31900
35 # (code to use if we are using SimGrid v3.18.x)
37 # (code to use with SimGrid v3.19+)
40 # Since SimGrid header files require C++17, so we set CMAKE_CXX_STANDARD to 17.
41 # Change this variable in your own file if you need a later standard.
46 # - Use automatic SimGridConfig.cmake creation via export/install(EXPORT in main CMakeLists.txt:
47 # https://cliutils.gitlab.io/modern-cmake/chapters/exporting.html
48 # https://cmake.org/Wiki/CMake/Tutorials/How_to_create_a_ProjectConfig.cmake_file
49 # https://github.com/boostcon/cppnow_presentations_2017/blob/master/05-19-2017_friday/effective_cmake__daniel_pfeifer__cppnow_05-19-2017.pdf
51 cmake_minimum_required(VERSION 2.8.12)
53 set(CMAKE_CXX_STANDARD 17)
54 set(CMAKE_CXX_STANDARD_REQUIRED ON)
56 find_path(SimGrid_INCLUDE_DIR
57 NAMES simgrid/config.h
58 NAMES simgrid/version.h
59 PATHS ${SimGrid_PATH}/include /opt/simgrid/include
61 if (NOT SimGrid_INCLUDE_DIR)
62 # search under the old name
63 find_path(SimGrid_INCLUDE_DIR
64 NAMES simgrid_config.h
65 PATHS ${SimGrid_PATH}/include /opt/simgrid/include
68 find_library(SimGrid_LIBRARY
70 PATHS ${SimGrid_PATH}/lib /opt/simgrid/lib
72 mark_as_advanced(SimGrid_INCLUDE_DIR)
73 mark_as_advanced(SimGrid_LIBRARY)
75 if (SimGrid_INCLUDE_DIR)
76 set(SimGrid_VERSION_REGEX "^#define SIMGRID_VERSION_(MAJOR|MINOR|PATCH) ([0-9]+)$")
77 if (EXISTS "${SimGrid_INCLUDE_DIR}/simgrid/version.h")
78 file(STRINGS "${SimGrid_INCLUDE_DIR}/simgrid/version.h" SimGrid_VERSION_STRING REGEX ${SimGrid_VERSION_REGEX})
79 elseif (EXISTS "${SimGrid_INCLUDE_DIR}/simgrid/config.h")
80 file(STRINGS "${SimGrid_INCLUDE_DIR}/simgrid/config.h" SimGrid_VERSION_STRING REGEX ${SimGrid_VERSION_REGEX})
82 file(STRINGS "${SimGrid_INCLUDE_DIR}/simgrid_config.h" SimGrid_VERSION_STRING REGEX ${SimGrid_VERSION_REGEX})
84 set(SimGrid_VERSION "")
86 # Concat the matches to MAJOR.MINOR.PATCH assuming they appear in this order
87 foreach(match ${SimGrid_VERSION_STRING})
89 set(SimGrid_VERSION "${SimGrid_VERSION}.")
91 string(REGEX REPLACE ${SimGrid_VERSION_REGEX} "${SimGrid_VERSION}\\2" SimGrid_VERSION ${match})
92 set(SimGrid_VERSION_${CMAKE_MATCH_1} ${CMAKE_MATCH_2})
94 unset(SimGrid_VERSION_STRING)
95 unset(SimGrid_VERSION_REGEX)
98 include(FindPackageHandleStandardArgs)
99 find_package_handle_standard_args(SimGrid
100 FOUND_VAR SimGrid_FOUND
101 REQUIRED_VARS SimGrid_INCLUDE_DIR SimGrid_LIBRARY
102 VERSION_VAR SimGrid_VERSION
106 add_library(SimGrid::SimGrid SHARED IMPORTED)
107 set_target_properties(SimGrid::SimGrid PROPERTIES
108 INTERFACE_SYSTEM_INCLUDE_DIRECTORIES ${SimGrid_INCLUDE_DIR}
109 INTERFACE_COMPILE_FEATURES cxx_alias_templates
110 IMPORTED_LOCATION ${SimGrid_LIBRARY}
112 # We need C++17, so check for it just in case the user removed it since compiling SimGrid
113 if (NOT CMAKE_VERSION VERSION_LESS 3.8)
114 # 3.8+ allows us to simply require C++17 (or higher)
115 set_property(TARGET SimGrid::SimGrid PROPERTY INTERFACE_COMPILE_FEATURES cxx_std_17)
117 # Old CMake can't do much. Just check the CXX_FLAGS and inform the user when a C++17 feature does not work
118 include(CheckCXXSourceCompiles)
119 set(CMAKE_REQUIRED_FLAGS "${CMAKE_CXX_FLAGS}")
120 check_cxx_source_compiles("
121 #if __cplusplus < 201703L
126 " _SIMGRID_CXX17_ENABLED)
127 if (NOT _SIMGRID_CXX17_ENABLED)
128 message(WARNING "C++17 is required to use SimGrid. Enable it with e.g. -std=c++17")
130 unset(_SIMGRID_CXX14_ENABLED CACHE)