forked from simgrid/simgrid
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFindSimGrid.cmake
157 lines (141 loc) · 5.76 KB
/
FindSimGrid.cmake
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# CMake find module to search for the SimGrid library.
# Copyright (c) 2016-2024. The SimGrid Team.
#
# This file is free software; you can redistribute it and/or modify it
# under the terms of the license (GNU LGPL) which comes with this package.
#
# USERS OF PROGRAMS USING SIMGRID
# -------------------------------
#
# If cmake does not find this file, add its path to CMAKE_PREFIX_PATH:
# CMAKE_PREFIX_PATH="/path/to/FindSimGrid.cmake:$CMAKE_PREFIX_PATH" cmake .
#
# If this file does not find SimGrid, define SimGrid_PATH:
# cmake -DSIMGRID_PATH=/path/to/simgrid .
#
# DEVELOPERS OF PROGRAMS USING SIMGRID
# ------------------------------------
#
# 1. Include this file in your own CMakeLists.txt (before defining any target)
# Either by copying it in your tree, or (recommended) by using the
# version automatically installed by SimGrid.
#
# 2. This will define a target called 'SimGrid::Simgrid'. Use it as:
# target_link_libraries(your-simulator SimGrid::SimGrid)
#
# It also defines a SIMGRID_VERSION macro, that you can use to deal with API
# evolutions as follows:
#
# #include <simgrid/version.h>
# #if SIMGRID_VERSION < 31800
# (code to use if the installed version is lower than v3.18)
# #elif SIMGRID_VERSION < 31900
# (code to use if we are using SimGrid v3.18.x)
# #else
# (code to use with SimGrid v3.19 or later)
# #endif
#
# Since SimGrid header files require C++17, we set CMAKE_CXX_STANDARD to 17.
# Change this variable in your own file if you need a later standard.
# DEVELOPPERS OF MPI PROGRAMS USING SIMGRID
# You should use smpi_c_target() on the targets that are intended to run in SMPI.
# ${SMPIRUN} is correctly set if it's installed.
#
# Example:
# add_executable(roundtrip roundtrip.c)
# smpi_c_target(roundtrip)
#
# enable_testing()
# add_test(NAME Roundtrip
# COMMAND ${SMPIRUN} -platform ${CMAKE_SOURCE_DIR}/../cluster_backbone.xml -np 2 ./roundtrip)
#
# IMPROVING THIS FILE
# -------------------
# - Use automatic SimGridConfig.cmake creation via export/install(EXPORT in main CMakeLists.txt:
# https://cliutils.gitlab.io/modern-cmake/chapters/exporting.html
# https://cmake.org/Wiki/CMake/Tutorials/How_to_create_a_ProjectConfig.cmake_file
# https://github.com/boostcon/cppnow_presentations_2017/blob/master/05-19-2017_friday/effective_cmake__daniel_pfeifer__cppnow_05-19-2017.pdf
cmake_minimum_required(VERSION 3.5)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_path(SimGrid_INCLUDE_DIR
NAMES simgrid/config.h
NAMES simgrid/version.h
PATHS ${SimGrid_PATH}/include ${SIMGRID_PATH}/include /opt/simgrid/include
)
if (NOT SimGrid_INCLUDE_DIR)
# search under the old name
find_path(SimGrid_INCLUDE_DIR
NAMES simgrid_config.h
PATHS ${SimGrid_PATH}/include ${SIMGRID_PATH}/include /opt/simgrid/include
)
endif()
find_library(SimGrid_LIBRARY
NAMES simgrid
PATHS ${SimGrid_PATH}/lib ${SIMGRID_PATH}/lib /opt/simgrid/lib
)
mark_as_advanced(SimGrid_INCLUDE_DIR)
mark_as_advanced(SimGrid_LIBRARY)
if (SimGrid_INCLUDE_DIR)
set(SimGrid_VERSION_REGEX "^#define SIMGRID_VERSION_(MAJOR|MINOR|PATCH) ([0-9]+)$")
if (EXISTS "${SimGrid_INCLUDE_DIR}/simgrid/version.h")
file(STRINGS "${SimGrid_INCLUDE_DIR}/simgrid/version.h" SimGrid_VERSION_STRING REGEX ${SimGrid_VERSION_REGEX})
elseif (EXISTS "${SimGrid_INCLUDE_DIR}/simgrid/config.h")
file(STRINGS "${SimGrid_INCLUDE_DIR}/simgrid/config.h" SimGrid_VERSION_STRING REGEX ${SimGrid_VERSION_REGEX})
else()
file(STRINGS "${SimGrid_INCLUDE_DIR}/simgrid_config.h" SimGrid_VERSION_STRING REGEX ${SimGrid_VERSION_REGEX})
endif()
set(SimGrid_VERSION "")
# Concat the matches to MAJOR.MINOR.PATCH assuming they appear in this order
foreach(match ${SimGrid_VERSION_STRING})
if(SimGrid_VERSION)
set(SimGrid_VERSION "${SimGrid_VERSION}.")
endif()
string(REGEX REPLACE ${SimGrid_VERSION_REGEX} "${SimGrid_VERSION}\\2" SimGrid_VERSION ${match})
set(SimGrid_VERSION_${CMAKE_MATCH_1} ${CMAKE_MATCH_2})
endforeach()
unset(SimGrid_VERSION_STRING)
unset(SimGrid_VERSION_REGEX)
endif ()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(SimGrid
FOUND_VAR SimGrid_FOUND
REQUIRED_VARS SimGrid_INCLUDE_DIR SimGrid_LIBRARY
VERSION_VAR SimGrid_VERSION
)
if (SimGrid_FOUND)
find_program(SMPIRUN smpirun
HINTS ${SimGrid_PATH}/bin /opt/simgrid/bin)
MACRO(smpi_c_target NAME)
target_compile_options(${NAME} PUBLIC "-include;smpi/smpi_helpers.h;-fPIC;-shared;-Wl,-z,defs")
target_link_options(${NAME} PUBLIC "-fPIC;-shared;-Wl,-z,defs;-lm")
target_link_libraries(${NAME} PUBLIC ${SimGrid_LIBRARY})
target_include_directories(${NAME} PUBLIC "${SimGrid_INCLUDE_DIR};${SimGrid_INCLUDE_DIR}/smpi")
ENDMACRO()
add_library(SimGrid::SimGrid SHARED IMPORTED)
set_target_properties(SimGrid::SimGrid PROPERTIES
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES ${SimGrid_INCLUDE_DIR}
INTERFACE_COMPILE_FEATURES cxx_alias_templates
IMPORTED_LOCATION ${SimGrid_LIBRARY}
)
# We need C++17, so check for it just in case the user removed it since compiling SimGrid
if (NOT CMAKE_VERSION VERSION_LESS 3.8)
# 3.8+ allows us to simply require C++17 (or higher)
set_property(TARGET SimGrid::SimGrid PROPERTY INTERFACE_COMPILE_FEATURES cxx_std_17)
else ()
# Old CMake can't do much. Just check the CXX_FLAGS and inform the user when a C++17 feature does not work
include(CheckCXXSourceCompiles)
set(CMAKE_REQUIRED_FLAGS "${CMAKE_CXX_FLAGS}")
check_cxx_source_compiles("
#if __cplusplus < 201703L
#error
#else
int main(){}
#endif
" _SIMGRID_CXX17_ENABLED)
if (NOT _SIMGRID_CXX17_ENABLED)
message(WARNING "C++17 is required to use SimGrid. Enable it with e.g. -std=c++17")
endif ()
unset(_SIMGRID_CXX14_ENABLED CACHE)
endif ()
endif ()