Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add some debug info
[simgrid.git] / CMakeLists.txt
1 # Build the version number
2
3 set(SIMGRID_VERSION_MAJOR "3")
4 set(SIMGRID_VERSION_MINOR "34")
5 set(SIMGRID_VERSION_PATCH "1") # odd => git branch; even => stable release or released snapshot
6
7 if(${SIMGRID_VERSION_PATCH} EQUAL "0")
8   set(release_version "${SIMGRID_VERSION_MAJOR}.${SIMGRID_VERSION_MINOR}")
9 else()
10   set(release_version "${SIMGRID_VERSION_MAJOR}.${SIMGRID_VERSION_MINOR}.${SIMGRID_VERSION_PATCH}")
11 endif()
12
13 if(WIN32 OR MINGW)
14   message(FATAL_ERROR "SimGrid does not build on native windows, nor with MinGW. Please use WSL2 instead.")
15 endif()
16
17 message(STATUS "Configuring SimGrid v${release_version}")
18
19 set(SIMGRID_VERSION_STRING "SimGrid version ${release_version}")
20
21 set(libsimgrid_version "${release_version}")
22
23 # Basic checks on cmake
24 cmake_minimum_required(VERSION 3.12)
25 # once we move CMake to >= 3.13, we should use target_link_option in examples/sthread
26 # once we move CMake to >= 3.13.1, we could get rid of _Boost_STACKTRACE_BACKTRACE_HEADERS
27 message(STATUS "Cmake version ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}")
28 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_HOME_DIRECTORY}/tools/cmake/Modules)
29
30 project(simgrid C CXX)
31
32 # customizable installation directories
33 include(GNUInstallDirs)
34
35 #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
36 #     Check for the compiler        #
37 #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
38 ##
39 ## Check the C/C++ standard that we need
40 ##   See also tools/cmake/Flags.cmake that sets our paranoid warning flags
41 INCLUDE(CheckCCompilerFlag)
42 CHECK_C_COMPILER_FLAG(-fstack-cleaner HAVE_C_STACK_CLEANER)
43
44 ## Request full debugging flags
45 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g3")
46 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3")
47
48 if (CMAKE_COMPILER_IS_GNUCC)
49   if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "7.0")
50     message(FATAL_ERROR
51             "SimGrid needs at least g++ version 7.0 to compile but you have ${CMAKE_CXX_COMPILER_VERSION}."
52             "You need a sufficient support of c++17 to compile SimGrid.")
53   endif()
54 endif()
55
56 ## We need a decent support of the C++17 and C11 standards
57 set(CMAKE_CXX_STANDARD 17)
58 set(CMAKE_CXX_STANDARD_REQUIRED ON)
59
60 set(CMAKE_C_STANDARD 11)
61 set(CMAKE_C_STANDARD_REQUIRED ON)
62
63 if (CMAKE_C_COMPILER_ID STREQUAL "Intel" AND CMAKE_C11_EXTENSION_COMPILE_OPTION STREQUAL "-std=c11")
64   set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=gnu11")
65 endif()
66
67 ### Check threading support
68 set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
69 find_package(Threads)
70
71 ### Setup Options
72 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Option.cmake)
73
74 ### SMPI vs. Fortran
75 if ((NOT DEFINED enable_smpi) OR enable_smpi)
76   # First unset the compiler in case we're re-running cmake over a previous
77   # configuration where it was saved as smpiff
78   unset(CMAKE_Fortran_COMPILER)
79
80   SET(SMPI_FORTRAN OFF)
81   if(enable_fortran)
82     enable_language(Fortran OPTIONAL)
83   endif()
84
85   if(CMAKE_Fortran_COMPILER)
86
87     # Fortran compiler detected: save it, then replace by smpiff
88     set(SMPI_Fortran_COMPILER "${CMAKE_Fortran_COMPILER}" CACHE FILEPATH "The real Fortran compiler")
89
90         # Set flags/libs to be used in smpiff
91     if(CMAKE_Fortran_COMPILER_ID MATCHES "GNU")
92       set(SMPI_Fortran_FLAGS_ "\"-fpic\" \"-ff2c\" \"-fno-second-underscore\"")
93       set(SMPI_Fortran_LIBS "\"-lgfortran\"")
94       set(SMPI_GFORTRAN 1)
95     elseif(CMAKE_Fortran_COMPILER_ID MATCHES "Intel")
96       set(SMPI_Fortran_FLAGS_ "\"-fPIC\" \"-nofor-main\"")
97       set(SMPI_Fortran_LIBS "\"-lifcore\"")
98       set(SMPI_IFORT 1)
99     elseif(CMAKE_Fortran_COMPILER_ID MATCHES "PGI|Flang") # flang
100       set(SMPI_Fortran_FLAGS_ "\"-fPIC\"")
101       set(SMPI_Fortran_LIBS "")
102       set(SMPI_FLANG 1)
103     endif()
104     set(SMPI_Fortran_FLAGS "${SMPI_Fortran_FLAGS_} ${SMPI_Fortran_FLAGS}")
105
106     ## Request debugging flags for Fortran too
107     set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -g")
108
109     set(SMPI_FORTRAN ON)
110   endif(CMAKE_Fortran_COMPILER)
111
112 endif()
113
114 ### SET THE LIBRARY EXTENSION
115 if(APPLE)
116   set(LIB_EXE "dylib")
117 else()
118   set(LIB_EXE "so")
119 endif()
120
121 execute_process(COMMAND ${CMAKE_LINKER} -v OUTPUT_VARIABLE LINKER_VERSION ERROR_VARIABLE LINKER_VERSION)
122 string(REGEX MATCH "[0-9].[0-9]*" LINKER_VERSION "${LINKER_VERSION}")
123
124 ### Find programs and paths
125 FIND_PROGRAM(GCOV_PATH gcov)
126 include(FindPerl)
127 if(NOT PERL_FOUND)
128   message(FATAL_ERROR "Please install Perl to compile SimGrid.")
129 endif()
130
131 # tesh.py needs python 3 (or the module python-subprocess32 on python2.8+)
132 find_package(Python3 COMPONENTS Interpreter)
133 if(NOT Python3_Interpreter_FOUND)
134   message(FATAL_ERROR "Please install Python (version 3 or higher) to compile SimGrid.")
135 endif()
136 set(PYTHON_EXECUTABLE ${Python3_EXECUTABLE})
137
138 SET(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib)
139
140 ### Compute the include paths
141
142 # Only include public headers by default
143 include_directories(
144    ${CMAKE_BINARY_DIR}/include
145    ${CMAKE_HOME_DIRECTORY}/include
146 )
147
148 # Compute the ones that should be added when compiling the library
149 set(INTERNAL_INCLUDES
150   ${CMAKE_BINARY_DIR}
151   ${CMAKE_HOME_DIRECTORY}
152   )
153
154 if(enable_smpi)
155   set (INTERNAL_INCLUDES ${INTERNAL_INCLUDES} ${CMAKE_HOME_DIRECTORY}/src/smpi/include)
156 endif()
157
158 if(NOT CMAKE_CROSSCOMPILING AND EXISTS /usr/include/)
159   set(INTERNAL_INCLUDES ${INTERNAL_INCLUDES} /usr/include/)
160 endif()
161
162 # library dependency cannot start with a space (CMP0004), so initialize it with something that is never deactivated.
163 set(SIMGRID_DEP "-lm")
164
165 ### Determine the assembly flavor that we need today
166 set(HAVE_RAW_CONTEXTS 0)
167 include(CMakeDetermineSystem)
168 foreach(arch i686 x86_64 arm64)
169   set(SIMGRID_PROCESSOR_${arch} 0)
170 endforeach()
171 IF(CMAKE_SYSTEM_PROCESSOR MATCHES ".86|AMD64|amd64")
172   IF(CMAKE_SIZEOF_VOID_P EQUAL 4) # 32 bits
173     message(STATUS "System processor: i686 (${CMAKE_SYSTEM_PROCESSOR}, 32 bits)")
174     set(SIMGRID_PROCESSOR_i686 1)
175   ELSE()
176     message(STATUS "System processor: x86_64 (${CMAKE_SYSTEM_PROCESSOR}, 64 bits)")
177     set(SIMGRID_PROCESSOR_x86_64 1)
178   ENDIF()
179   if(CMAKE_SIZEOF_VOID_P EQUAL 4 AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
180     message(STATUS "Disable fast raw contexts on x32 ABI.")
181   else()
182     set(HAVE_RAW_CONTEXTS 1)
183   endif()
184 ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
185   message(STATUS "System processor: arm64 (${CMAKE_SYSTEM_PROCESSOR}, 64 bits)")
186   set(SIMGRID_PROCESSOR_arm64 1)
187 ELSE()
188   message(STATUS "System processor (${CMAKE_SYSTEM_PROCESSOR}) not explicitly accounted for")
189 ENDIF()
190
191 include(CheckFunctionExists)
192 include(CheckTypeSize)
193 include(CheckIncludeFile)
194 include(CheckIncludeFiles)
195 include(CheckLibraryExists)
196 include(CheckSymbolExists)
197
198 set(HAVE_GRAPHVIZ OFF)
199 if(minimal-bindings)
200   message(STATUS "Don't even look for graphviz, as we build minimal binding libraries.")
201 else()
202   include(FindGraphviz)
203 endif()
204
205 set(SIMGRID_HAVE_NS3 OFF)
206 if(enable_ns3)
207   include(FindNS3)
208   if (SIMGRID_HAVE_NS3)
209     if (NOT NS3_VERSION EQUAL "3-dev" AND NS3_VERSION VERSION_LESS "3.28")
210       message(FATAL_ERROR "SimGrid needs ns-3 in version 3.28 or higher. Please upgrade or disable that cmake option.")
211     endif()
212     set(SIMGRID_HAVE_NS3 ON)
213     set(SIMGRID_DEP "${SIMGRID_DEP} ${NS3_LIBRARIES}")
214   else()
215     message(FATAL_ERROR "Cannot find ns-3. Please install it (apt-get install ns3 libns3-dev) or disable that cmake option")
216   endif()
217 endif()
218
219 ### Check for Eigen library
220 set(SIMGRID_HAVE_EIGEN3 OFF)
221 find_package (Eigen3 3.3 CONFIG
222               HINTS ${EIGEN3_HINT})
223 if (Eigen3_FOUND)
224   set(SIMGRID_HAVE_EIGEN3 ON) 
225   message(STATUS "Found Eigen3: ${EIGEN3_INCLUDE_DIR}")
226   include_directories(${EIGEN3_INCLUDE_DIR})
227   if ("3.3.4" VERSION_EQUAL EIGEN3_VERSION_STRING AND CMAKE_COMPILER_IS_GNUCC)
228     message(STATUS "Avoid build error of Eigen3 v3.3.4 using -Wno-error=int-in-bool-context")
229     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=int-in-bool-context")
230   endif()
231 else()
232   message(STATUS "Disabling model BMF because Eigen3 was not found. If it's installed, use EIGEN3_HINT to hint cmake about the location of Eigen3Config.cmake")
233 endif()
234 mark_as_advanced(Eigen3_DIR)
235
236 # Check for our JSON dependency
237 set(SIMGRID_HAVE_JSON 0)
238 find_package(nlohmann_json 3.7
239              HINTS ${nlohmann_json_HINT})
240 if (nlohmann_json_FOUND)
241   set(SIMGRID_HAVE_JSON 1)
242   if (NOT NLOHMANN_JSON_INCLUDE_DIR)
243     get_target_property(NLOHMANN_JSON_INCLUDE_DIR nlohmann_json::nlohmann_json INTERFACE_INCLUDE_DIRECTORIES)
244     list(REMOVE_DUPLICATES NLOHMANN_JSON_INCLUDE_DIR)
245   else()
246     include_directories(${NLOHMANN_JSON_INCLUDE_DIR})
247   endif()
248   message(STATUS "Found nlohmann_json: ${NLOHMANN_JSON_INCLUDE_DIR}")
249 endif()
250 mark_as_advanced(nlohmann_json_DIR)
251
252 set(HAVE_PAPI OFF)
253 if(enable_smpi_papi)
254   include(FindPAPI)
255   if (NOT HAVE_PAPI)
256     message(FATAL_ERROR "Cannot find PAPI. Please install it (apt-get install papi-tools libpapi-dev) or disable PAPI bindings.")
257   endif()
258 endif()
259 mark_as_advanced(PAPI_PREFIX)
260
261 # But we do need the core of Boost
262 # cmake before 3.13.1 does not know about stacktrace components. Fix it.
263 # Usable components: https://www.boost.org/doc/libs/1_65_1/doc/html/stacktrace/configuration_and_build.html
264 set(_Boost_STACKTRACE_HEADERS           "boost/stacktrace.hpp")
265 set(_Boost_STACKTRACE_BACKTRACE_HEADERS "boost/stacktrace.hpp")
266 set(_Boost_STACKTRACE_ADDR2LINE_HEADERS "boost/stacktrace.hpp")
267
268   if(minimal-bindings) # When we want a minimal python library, don't even search for boost optional components
269     message(STATUS "Don't even look for boost optional components, as we build minimal binding libraries.")
270     find_package(Boost 1.48)
271   else()
272     find_package(Boost 1.59 OPTIONAL_COMPONENTS context stacktrace_backtrace stacktrace_addr2line)
273   endif()
274   if(Boost_FOUND)
275     include_directories(${Boost_INCLUDE_DIRS})
276     message(STATUS "Mandatory components found. SimGrid is compilable.")
277     if (NOT minimal-bindings)
278       message(STATUS "Looking for optional Boost components:")
279       set(Boost_FOUND 1) # These components are optionals
280       CHECK_INCLUDE_FILE("backtrace.h" HAVE_BACKTRACE_H) # check that backtrace is actually possible
281       if (Boost_STACKTRACE_BACKTRACE_FOUND AND HAVE_BACKTRACE_H)
282         message (STATUS "  stacktrace: found the fast 'backtrace' implementation. Activating human-readable stack traces.")
283         set(HAVE_BOOST_STACKTRACE_BACKTRACE 1)
284       else()
285         set(HAVE_BOOST_STACKTRACE_BACKTRACE 0)
286         if (Boost_STACKTRACE_ADDR2LINE_FOUND)
287           message (STATUS "  stacktrace: found the slow 'addr2line' implementation. Activating human-readable stack traces.")
288           set(HAVE_BOOST_STACKTRACE_ADDR2LINE 1)
289         else()
290           message (STATUS "  stacktrace: MISSING. Install libboost-stacktrace-dev to display the stacktraces.")
291           set(HAVE_BOOST_STACKTRACE_ADDR2LINE 0)
292         endif()
293       endif()
294
295       if(Boost_CONTEXT_FOUND)
296         message (STATUS "  context: found. Activating Boost contexts.")
297         set(HAVE_BOOST_CONTEXTS ON)
298       else()
299         message (STATUS "  context: MISSING. Install libboost-context-dev for this optional feature.")
300         set(HAVE_BOOST_CONTEXTS OFF)
301       endif()
302     endif()
303   else()
304     if(APPLE)
305       message(FATAL_ERROR "Boost libraries not found. Try to install them with 'sudo fink install boost1.53.nopython' (check the exact name with 'fink list boost') or 'sudo brew install boost'")
306     else()
307       find_package(Boost 1.48) #try without optional libraries
308       if(NOT Boost_FOUND)
309         message(FATAL_ERROR "Boost libraries not found. Install libboost-dev (>= 1.48.0).")
310       else()
311         include_directories(${Boost_INCLUDE_DIRS})
312         message(STATUS "Mandatory components found. SimGrid is compilable.")
313       endif()
314     endif()
315   endif()
316 mark_as_advanced(Boost_CONTEXT_LIBRARY_RELEASE)
317 mark_as_advanced(Boost_INCLUDE_DIR)
318 mark_as_advanced(Boost_STACKTRACE_ADDR2LINE_LIB)
319 mark_as_advanced(Boost_STACKTRACE_BACKTRACE_LIB)
320
321 # Checks for header libraries functions.
322 CHECK_LIBRARY_EXISTS(rt      clock_gettime           "" HAVE_POSIX_GETTIME)
323 CHECK_LIBRARY_EXISTS(pthread pthread_setaffinity_np  "" HAVE_PTHREAD_SETAFFINITY)
324 CHECK_INCLUDE_FILE("pthread_np.h" HAVE_PTHREAD_NP_H) # for pthread_setaffinity_np() on FreeBSD
325
326 if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
327   set(CMAKE_REQUIRED_DEFINITIONS "-D_XOPEN_SOURCE=700 -D_DARWIN_C_SOURCE")
328 else()
329   set(CMAKE_REQUIRED_DEFINITIONS "-D_GNU_SOURCE")
330 endif()
331
332 CHECK_INCLUDE_FILE("valgrind/valgrind.h" HAVE_VALGRIND_H)
333 CHECK_INCLUDE_FILE("unistd.h" HAVE_UNISTD_H)
334 CHECK_INCLUDE_FILE("linux/futex.h" HAVE_FUTEX_H)
335
336 CHECK_FUNCTION_EXISTS(dlfunc HAVE_DLFUNC)
337 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
338 CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
339 CHECK_FUNCTION_EXISTS(sysconf HAVE_SYSCONF)
340 if(NOT HAVE_SYSCONF)
341   message(FATAL_ERROR "Cannot build without sysconf.")
342 endif()
343 CHECK_FUNCTION_EXISTS(process_vm_readv HAVE_PROCESS_VM_READV)
344 CHECK_FUNCTION_EXISTS(mmap HAVE_MMAP)
345 CHECK_FUNCTION_EXISTS(mremap HAVE_MREMAP)
346
347 CHECK_SYMBOL_EXISTS(vasprintf stdio.h HAVE_VASPRINTF)
348
349 CHECK_INCLUDE_FILE("sys/sendfile.h" HAVE_SENDFILE_H)
350 CHECK_FUNCTION_EXISTS(sendfile HAVE_SENDFILE)
351 if(HAVE_SENDFILE_H AND HAVE_SENDFILE)
352   set(SG_HAVE_SENDFILE 1)
353 else()
354   set(SG_HAVE_SENDFILE 0)
355 endif()
356
357 if(enable_model-checking AND NOT "${CMAKE_SYSTEM}" MATCHES "Linux|FreeBSD")
358   message(FATAL_ERROR "Support for model-checking has not been enabled on ${CMAKE_SYSTEM}. Please use a Linux docker to use the model checker.")
359 endif()
360
361 if(enable_model-checking AND minimal-bindings)
362   message(FATAL_ERROR "Compile-time option 'minimal-bindings' cannot be enabled with 'model-checking'")
363 endif()
364
365 if(enable_mallocators)
366   SET(SIMGRID_HAVE_MALLOCATOR 1)
367 else()
368   SET(SIMGRID_HAVE_MALLOCATOR 0)
369 endif()
370
371 SET(SIMGRID_HAVE_MC OFF)
372 SET(SIMGRID_HAVE_STATEFUL_MC OFF)
373 SET(HAVE_MMALLOC 0)
374
375 find_package(Libevent)
376 if(Libevent_FOUND)
377   message(STATUS "Found libevent. The stateless model-checking can be enabled.")
378   include_directories(${LIBEVENT_INCLUDE_DIR})
379   set(SIMGRID_DEP "${SIMGRID_DEP} ${LIBEVENT_LIBRARIES}")
380   SET(SIMGRID_HAVE_MC ON)
381 else()
382   message(STATUS "libevent not found. Please install libevent-dev to enable the SimGrid model checker.")
383 endif()
384 mark_as_advanced(LIBEVENT_LIBRARY)
385 mark_as_advanced(LIBEVENT_THREADS_LIBRARY)
386
387 if(enable_model-checking)
388   include(FindLibunwind)
389   find_package(Libdw)
390   find_package(Libelf)
391   if(HAVE_MMAP AND HAVE_LIBUNWIND AND Libdw_FOUND AND Libelf_FOUND AND Libevent_FOUND)
392     message(STATUS "All dependencies found. The stateful model-checking can be enabled.")
393     SET(SIMGRID_HAVE_STATEFUL_MC ON)
394     SET(HAVE_MMALLOC 1)
395     SET(SIMGRID_DEP "${SIMGRID_DEP} ${LIBUNWIND_LIBRARIES} ${LIBELF_LIBRARIES} ${LIBDW_LIBRARIES}")
396     include_directories(${LIBDW_INCLUDE_DIR} ${LIBELF_INCLUDE_DIR})
397     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -gdwarf-4")
398     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -gdwarf-4")
399   else()
400     message(STATUS "Please install libunwind-dev libdw-dev libelf-dev libevent-dev to enable the stateful model checker.")
401     set(HAVE_MMALLOC 0)
402   endif()
403 endif()
404 mark_as_advanced(PATH_LIBDW_H)
405 mark_as_advanced(PATH_LIBDW_LIB)
406
407 if (SIMGRID_HAVE_STATEFUL_MC AND enable_ns3) 
408   message(WARNING "Activating both model-checking and ns-3 bindings is considered experimental.")
409 endif()
410
411 if(enable_smpi)
412   SET(HAVE_SMPI ON)
413   SET(HAVE_PRIVATIZATION ON)
414 else()
415   SET(HAVE_SMPI OFF)
416 endif()
417
418 #--------------------------------------------------------------------------------------------------
419 ### Check what context backends are available
420
421 set(HAVE_UCONTEXT_CONTEXTS 0)
422 CHECK_INCLUDE_FILE("ucontext.h" HAVE_UCONTEXT_H)
423 if(NOT HAVE_UCONTEXT_H)
424   message(STATUS "No ucontext factory: <ucontext.h> not found.")
425 elseif(APPLE)
426   message(STATUS "No ucontext factory: Apple don't want us to use them.")
427   set(HAVE_UCONTEXT_H 0)
428 else()
429   try_compile(compile_makecontext ${CMAKE_BINARY_DIR} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_makecontext.c
430     OUTPUT_VARIABLE compile_makecontext_output)
431
432   #If can have both context
433   if(NOT compile_makecontext)
434     message(STATUS "Error: <ucontext.h> exists, but makecontext is not compilable. Compilation output:\n ${compile_makecontext_output}")
435     message(STATUS "No ucontext factory: makecontext() is not compilable.")
436   else()
437     message(STATUS "Support for ucontext factory ok.")
438     set(HAVE_UCONTEXT_CONTEXTS 1)
439
440     # Stack setup (size and address)
441     try_run(RUN_makecontext_VAR COMPILE_makecontext_VAR
442       ${CMAKE_BINARY_DIR} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_stacksetup.c
443       RUN_OUTPUT_VARIABLE stack_setup)
444
445     LIST(LENGTH stack_setup stack_setup_len)
446     if("${stack_setup_len}" STREQUAL "2")
447       LIST(GET stack_setup 0 makecontext_addr)
448       LIST(GET stack_setup 1 makecontext_size)
449       set(sg_makecontext_stack_addr "#define sg_makecontext_stack_addr(skaddr) (${makecontext_addr})")
450       set(sg_makecontext_stack_size "#define sg_makecontext_stack_size(sksize) (${makecontext_size})")
451     else()
452       message(FATAL_ERROR "Could not figure out the stack setup. Compil: ${RUN_makecontext_VAR}. Exec: ${COMPILE_makecontext_VAR}. Output: ${stack_setup}")
453     endif()
454   endif()
455 endif()
456
457 # Stack growth direction (upward or downward). Used for the following contexts: SysV, raw, Boost
458 try_run(RUN_stackgrowth_VAR COMPILE_stackgrowth_VAR
459   ${CMAKE_BINARY_DIR}
460   ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_stackgrowth.c
461   RUN_OUTPUT_VARIABLE stack
462   COPY_FILE test_stackgrowth)
463
464 if("${stack}" STREQUAL "down")
465   set(PTH_STACKGROWTH "-1")
466 elseif("${stack}" STREQUAL "up")
467   set(PTH_STACKGROWTH "1")
468 else()
469   if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64")
470     set(PTH_STACKGROWTH "-1")
471   elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i686")
472     set(PTH_STACKGROWTH "-1")
473   else()
474     message(FATAL_ERROR "Could not figure out the stack direction. Test prog returned: ${stack}; CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}.")
475   endif()
476 endif()
477 # If the test ran well, remove the test binary
478 file(REMOVE ${CMAKE_BINARY_DIR}/test_stackgrowth)
479 #--------------------------------------------------------------------------------------------------
480
481 ###############
482 ## GIT version check
483 ##
484 if(EXISTS ${CMAKE_HOME_DIRECTORY}/.git/)
485   execute_process(COMMAND git rev-parse --verify --short HEAD
486      WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}
487      OUTPUT_VARIABLE GIT_VERSION
488      OUTPUT_STRIP_TRAILING_WHITESPACE)
489   # Check for uncommitted changes
490   execute_process(COMMAND git diff --name-only HEAD
491     WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}
492     OUTPUT_VARIABLE files_changed)
493   if(files_changed)
494     set(GIT_VERSION "${GIT_VERSION}-dirty")
495   endif()
496 elseif(EXISTS ${CMAKE_HOME_DIRECTORY}/.gitversion)
497   FILE(STRINGS ${CMAKE_HOME_DIRECTORY}/.gitversion GIT_VERSION)
498 else()
499   set(GIT_VERSION "none, release version")
500 endif()
501 message(STATUS "Git version: ${GIT_VERSION}")
502
503 ### Define source packages for Libs
504 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/DefinePackages.cmake)
505
506 ### Setup gcc & clang flags (include after DefinePackage.cmake, and before generating header files)
507 if (NOT MSVC)
508   include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Flags.cmake)
509 endif()
510
511 ### Generate the required headers and scripts
512 #############################################
513
514 # Avoid triggering a (full) rebuild by touching the files if they did not really change
515 configure_file("${CMAKE_HOME_DIRECTORY}/src/internal_config.h.in"    "${CMAKE_BINARY_DIR}/src/internal_config.h.generated"    @ONLY IMMEDIATE)
516 configure_file("${CMAKE_HOME_DIRECTORY}/include/simgrid/version.h.in" "${CMAKE_BINARY_DIR}/include/simgrid/version.h.generated" @ONLY IMMEDIATE)
517 configure_file("${CMAKE_HOME_DIRECTORY}/include/simgrid/config.h.in" "${CMAKE_BINARY_DIR}/include/simgrid/config.h.generated" @ONLY IMMEDIATE)
518 execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/src/internal_config.h.generated ${CMAKE_BINARY_DIR}/src/internal_config.h)
519 execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/include/simgrid/version.h.generated ${CMAKE_BINARY_DIR}/include/simgrid/version.h)
520 execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/include/simgrid/config.h.generated ${CMAKE_BINARY_DIR}/include/simgrid/config.h)
521 file(REMOVE ${CMAKE_BINARY_DIR}/src/internal_config.h.generated)
522 file(REMOVE ${CMAKE_BINARY_DIR}/include/simgrid/config.h.generated)
523 file(REMOVE ${CMAKE_BINARY_DIR}/include/simgrid/version.h.generated)
524
525 # We need two versions of the SMPI scripts because they contain the path to the library
526 # so, it depends of whether SimGrid is installed, or run from the sources (during the build)
527
528 file(READ ${CMAKE_HOME_DIRECTORY}/src/smpi/smpitools.sh SMPITOOLS_SH) # Definitions shared amongst all SMPI scripts, inlined in each of them
529
530 ### SMPI script used when simgrid is installed
531 set(exec_prefix ${CMAKE_INSTALL_PREFIX})
532 set(includedir "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
533 set(libdir "${CMAKE_INSTALL_FULL_LIBDIR}")
534 set(includeflag "\"-I${includedir}\" \"-I${includedir}/smpi\"")
535 set(CMAKE_SMPI_COMMAND "export LD_LIBRARY_PATH=\"${libdir}")
536 if(NS3_LIBRARY_PATH)
537   set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}:${NS3_LIBRARY_PATH}")
538 endif()
539 set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}\${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}\"")
540 set(SMPIMAIN ${libdir}/simgrid/smpimain)
541 set(SMPIREPLAYMAIN ${libdir}/simgrid/smpireplaymain)
542
543 configure_file(${CMAKE_HOME_DIRECTORY}/include/smpi/mpif.h.in ${CMAKE_BINARY_DIR}/include/smpi/mpif.h @ONLY)
544 #configure mpif.f90 to build mpi.mod
545 if(SMPI_FORTRAN)
546   set(MODULE_MPIF_IN "module mpi")
547   set(MODULE_MPIF_OUT "end module mpi")
548   configure_file(${CMAKE_HOME_DIRECTORY}/include/smpi/mpif.h.in ${CMAKE_BINARY_DIR}/src/smpi/mpif.f90.generated @ONLY)
549   execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/src/smpi/mpif.f90.generated ${CMAKE_BINARY_DIR}/src/smpi/mpif.f90)
550   file(REMOVE ${CMAKE_BINARY_DIR}/src/smpi/mpif.f90.generated)
551   set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/include/smpi)
552   add_library(mpi SHARED ${CMAKE_BINARY_DIR}/src/smpi/mpif.f90)
553 endif()
554
555 foreach(script cc cxx ff f90 run)
556   configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpi${script}.in ${CMAKE_BINARY_DIR}/bin/smpi${script} @ONLY)
557 endforeach()
558
559 ### SMPI scripts used when compiling simgrid
560 set(exec_prefix "${CMAKE_BINARY_DIR}/smpi_script/")
561 set(includedir "${CMAKE_HOME_DIRECTORY}/include")
562 set(libdir "${CMAKE_BINARY_DIR}/lib")
563 set(includeflag "\"-I${includedir}\" \"-I${includedir}/smpi\"")
564 set(includeflag "${includeflag} \"-I${CMAKE_BINARY_DIR}/include\" \"-I${CMAKE_BINARY_DIR}/include/smpi\"")
565 set(CMAKE_SMPI_COMMAND "export LD_LIBRARY_PATH=\"${libdir}")
566 if(NS3_LIBRARY_PATH)
567   set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}:${NS3_LIBRARY_PATH}")
568 endif()
569 set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}\${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}\"")
570 set(SMPIMAIN ${libdir}/simgrid/smpimain)
571 set(SMPIREPLAYMAIN ${libdir}/simgrid/smpireplaymain)
572
573 foreach(script cc cxx ff f90 run)
574   configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpi${script}.in ${CMAKE_BINARY_DIR}/smpi_script/bin/smpi${script} @ONLY)
575 endforeach()
576
577 foreach(script cc cxx ff f90 run)
578   execute_process(COMMAND chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpi${script})
579   execute_process(COMMAND chmod a=rwx ${CMAKE_BINARY_DIR}/smpi_script/bin/smpi${script})
580 endforeach()
581
582 set(generated_headers_to_install
583   ${CMAKE_CURRENT_BINARY_DIR}/include/smpi/mpif.h
584   ${CMAKE_CURRENT_BINARY_DIR}/include/simgrid/config.h
585   ${CMAKE_CURRENT_BINARY_DIR}/include/simgrid/version.h
586   )
587
588 set(generated_headers  ${CMAKE_CURRENT_BINARY_DIR}/src/internal_config.h )
589
590 set(generated_files_to_clean
591   ${generated_headers}
592   ${generated_headers_to_install}
593   ${CMAKE_BINARY_DIR}/bin/smpicc
594   ${CMAKE_BINARY_DIR}/bin/smpicxx
595   ${CMAKE_BINARY_DIR}/bin/smpiff
596   ${CMAKE_BINARY_DIR}/bin/smpif90
597   ${CMAKE_BINARY_DIR}/bin/smpirun
598   ${CMAKE_BINARY_DIR}/bin/simgrid_update_xml
599   ${CMAKE_BINARY_DIR}/examples/smpi/tracing/smpi_traced.trace
600   )
601
602 if(NOT "${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_HOME_DIRECTORY}")
603   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions0.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions0.txt COPYONLY)
604   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions1.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions1.txt COPYONLY)
605   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_allreduce.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allreduce.txt COPYONLY)
606   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_barrier.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_barrier.txt COPYONLY)
607   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_bcast.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_bcast.txt COPYONLY)
608   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_with_isend.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_with_isend.txt COPYONLY)
609   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_alltoall.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_alltoall.txt COPYONLY)
610   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_alltoallv.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_alltoallv.txt COPYONLY)
611   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_waitall.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_waitall.txt COPYONLY)
612   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_reducescatter.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_reducescatter.txt COPYONLY)
613   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_gather.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_gather.txt COPYONLY)
614   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_allgatherv.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allgatherv.txt COPYONLY)
615   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile COPYONLY)
616   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_cluster ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_cluster COPYONLY)
617   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_griffon ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_griffon COPYONLY)
618   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_coll ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_coll COPYONLY)
619   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_io ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_io COPYONLY)
620   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_empty ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_empty COPYONLY)
621
622   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/description_file ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/description_file COPYONLY)
623   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/README ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/README COPYONLY)
624   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/smpi_replay.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/smpi_replay.txt COPYONLY)
625   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace0.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace0.txt COPYONLY)
626   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace1.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace1.txt COPYONLY)
627   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace2.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace2.txt COPYONLY)
628   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace3.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace3.txt COPYONLY)
629   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace4.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace4.txt COPYONLY)
630   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace5.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace5.txt COPYONLY)
631   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace6.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace6.txt COPYONLY)
632   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace7.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace7.txt COPYONLY)
633   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace8.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace8.txt COPYONLY)
634   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace9.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace9.txt COPYONLY)
635   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace10.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace10.txt COPYONLY)
636   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace11.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace11.txt COPYONLY)
637   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace12.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace12.txt COPYONLY)
638   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace13.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace13.txt COPYONLY)
639   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace14.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace14.txt COPYONLY)
640   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace15.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace15.txt COPYONLY)
641   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace16.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace16.txt COPYONLY)
642   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace17.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace17.txt COPYONLY)
643   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace18.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace18.txt COPYONLY)
644   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace19.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace19.txt COPYONLY)
645   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace20.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace20.txt COPYONLY)
646   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace21.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace21.txt COPYONLY)
647   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace22.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace22.txt COPYONLY)
648   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace23.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace23.txt COPYONLY)
649   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace24.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace24.txt COPYONLY)
650   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace25.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace25.txt COPYONLY)
651   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace26.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace26.txt COPYONLY)
652   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace27.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace27.txt COPYONLY)
653   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace28.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace28.txt COPYONLY)
654   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace29.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace29.txt COPYONLY)
655   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace30.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace30.txt COPYONLY)
656   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace31.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace31.txt COPYONLY)
657
658 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/compute_only.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/compute_only.txt COPYONLY)
659 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/compute_only/actions0.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/compute_only/actions0.txt COPYONLY)
660 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/compute_only/actions1.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/compute_only/actions1.txt COPYONLY)
661 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/empty.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/empty.txt COPYONLY)
662 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/empty/actions0.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/empty/actions0.txt COPYONLY)
663 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/empty/actions1.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/empty/actions1.txt COPYONLY)
664 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/mixed.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/mixed.txt COPYONLY)
665 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/mixed/actions0.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/mixed/actions0.txt COPYONLY)
666 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/mixed/actions1.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/mixed/actions1.txt COPYONLY)
667 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/workload_compute ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_compute COPYONLY)
668 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/workload_compute_consecutive ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_compute_consecutive COPYONLY)
669 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/workload_compute_consecutive2 ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_compute_consecutive2 COPYONLY)
670 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/workload_compute_simple ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_compute_simple COPYONLY)
671 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/workload_mixed2_same_time ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_mixed2_same_time COPYONLY)
672 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/workload_mixed2_same_time_and_resources ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_mixed2_same_time_and_resources COPYONLY)
673
674   set(generated_files_to_clean
675     ${generated_files_to_clean}
676     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions0.txt
677     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions1.txt
678     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allreduce.txt
679     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_barrier.txt
680     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_bcast.txt
681     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_with_isend.txt
682     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_alltoall.txt
683     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_alltoallv.txt
684     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_waitall.txt
685     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_gather.txt
686     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allgatherv.txt
687     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_reducescatter.txt
688     ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile
689     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/description_file
690     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/README
691     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/smpi_replay.txt
692     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace0.txt
693     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace1.txt
694     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace2.txt
695     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace3.txt
696     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace4.txt
697     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace5.txt
698     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace6.txt
699     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace7.txt
700     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace8.txt
701     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace9.txt
702     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace10.txt
703     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace11.txt
704     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace12.txt
705     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace13.txt
706     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace14.txt
707     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace15.txt
708     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace16.txt
709     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace17.txt
710     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace18.txt
711     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace19.txt
712     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace20.txt
713     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace21.txt
714     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace22.txt
715     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace23.txt
716     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace24.txt
717     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace25.txt
718     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace26.txt
719     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace27.txt
720     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace28.txt
721     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace29.txt
722     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace30.txt
723     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace31.txt
724     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/compute_only.txt
725     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/compute_only/actions0.txt
726     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/compute_only/actions1.txt
727     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/empty.txt
728     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/empty/actions0.txt
729     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/empty/actions1.txt
730     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/mixed.txt
731     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/mixed/actions0.txt
732     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/mixed/actions1.txt
733     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/replay_multiple_manual.tesh
734     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_compute
735     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_compute_consecutive
736     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_compute_consecutive2
737     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_compute_simple
738     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_empty1
739     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_empty2
740     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_empty2_same_resources
741     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_empty2_same_time
742     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_empty2_same_time_and_resources
743     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_mixed1
744     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_mixed2
745     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_mixed2_same_resources
746     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_mixed2_same_time
747     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_mixed2_same_time_and_resources
748     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_nojob
749     )
750 endif()
751
752 SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES
753   "${generated_files_to_clean}")
754
755 add_custom_target(tests    COMMENT "Recompiling the tests")
756 add_custom_target(tests-mc COMMENT "Recompiling the MC tests and tools.")
757 add_dependencies(tests tests-mc)
758 add_custom_target(tests-ns3 COMMENT "Recompiling the ns3 tests and tools.")
759 add_dependencies(tests tests-ns3)
760 add_custom_target(examples COMMENT "Recompiling all examples")
761 add_dependencies(examples tests)
762
763 ### Build some Maintainer files
764 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/MaintainerMode.cmake)
765
766 ### Make Libs
767 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/MakeLib.cmake)
768
769 # Python binding (with pybind11)
770 ################
771 if((NOT DEFINED enable_python) OR enable_python)
772   if(EXISTS ${CMAKE_HOME_DIRECTORY}/pybind11) # Try to use a local copy of pybind11, if any
773     message(STATUS "Use the internal copy of pybind11.")
774     add_subdirectory(${CMAKE_HOME_DIRECTORY}/pybind11)
775     set(pybind11_FOUND ON)
776
777     set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_HOME_DIRECTORY}/pybind11/tools/)
778     set(Python_ADDITIONAL_VERSIONS 3.9 3.8 3.7 3.6 3.5 3.4)
779     find_package(PythonLibsNew ${PYBIND11_PYTHON_VERSION} REQUIRED)
780
781   else()
782     find_package(pybind11 CONFIG)
783     message(STATUS "Pybind11 version: ${pybind11_VERSION}")
784     if (pybind11_VERSION VERSION_LESS 2.4)
785       message(STATUS "SimGrid needs at least v2.4 of pybind11. Disabling the Python bindings.")
786       set(pybind11_FOUND OFF)
787     endif()
788   endif()
789 endif()
790
791 find_package(Python3 COMPONENTS Development)
792 if(NOT Python3_Development_FOUND OR NOT pybind11_FOUND)
793   message(STATUS "SimGrid Python bindings cannot be built on this system.")
794   set(default_enable_python OFF)
795 else()
796   set(default_enable_python ON)
797 endif()
798
799 option(enable_python "Whether the Python bindings are activated." ${default_enable_python}) # ON by default if dependencies are met
800
801 if("${CMAKE_SYSTEM}" MATCHES "FreeBSD" AND enable_model-checking AND enable_python)
802   message(WARNING "FreeBSD + Model-Checking + Python = too much for now. Disabling the Python bindings.")
803   set(enable_python FALSE)
804 endif()
805
806 if(enable_python)
807   if(NOT Python3_Development_FOUND)
808     message(FATAL_ERROR "Please install the development components of Python (python3-dev on Debian) to build the Python bindings (or disable that option).")
809   endif()
810   if(pybind11_FOUND)
811     message(STATUS "Found pybind11.")
812     if(NOT enable_lto)
813       set(pybind11_options NO_EXTRAS)
814     endif()
815     pybind11_add_module(python-bindings src/bindings/python/simgrid_python.cpp ${pybind11_options})
816     target_compile_features(python-bindings PRIVATE cxx_std_14)
817     target_link_libraries(python-bindings PUBLIC simgrid)
818     set_target_properties(python-bindings PROPERTIES
819                           LIBRARY_OUTPUT_NAME simgrid
820                           CXX_VISIBILITY_PRESET "default"
821                           INTERPROCEDURAL_OPTIMIZATION FALSE)
822     # LTO is disabled here from the python bindings because this makes a
823     # cmake warning about CMP0069 even when this policy is set. This
824     # problem may be in cmake, in pybind11 or even in our code, not sure.
825     # It may get eventually solved in cmake or pybind11. Or not.
826     # The sure thing is that our python bindings are in one file only,
827     # so there is no need for LTO here. Problem solved :)
828
829     add_dependencies(tests python-bindings)
830     set_property(TARGET python-bindings
831                  APPEND PROPERTY INCLUDE_DIRECTORIES "${INTERNAL_INCLUDES}")
832
833     if("${SIMGRID_PYTHON_LIBDIR}" STREQUAL "") # value not manually set
834       if("${CMAKE_INSTALL_PREFIX}" STREQUAL "/usr")
835         set(SIMGRID_PYTHON_LIBDIR ${Python3_SITEARCH})
836       else("${CMAKE_INSTALL_PREFIX}" STREQUAL "/usr")
837         string(REGEX REPLACE "^/usr/" "${CMAKE_INSTALL_PREFIX}/" SIMGRID_PYTHON_LIBDIR ${Python3_SITEARCH})
838       endif("${CMAKE_INSTALL_PREFIX}" STREQUAL "/usr")
839     endif()
840     install(TARGETS python-bindings
841             LIBRARY DESTINATION "${SIMGRID_PYTHON_LIBDIR}")
842   else()
843     message(FATAL_ERROR "Please install pybind11-dev to build the Python bindings (or disable that option).")
844   endif()
845 endif()
846 mark_as_advanced(PYBIND11_PYTHON_VERSION)
847 mark_as_advanced(pybind11_DIR)
848
849 ### Make tests
850 if(enable_memcheck_xml)
851   set(enable_memcheck true)
852 endif()
853
854 INCLUDE(CTest)
855 ENABLE_TESTING()
856 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Tests.cmake)
857 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/CTestConfig.cmake)
858
859 ### Define subdirectories
860 foreach(cmakefile ${CMAKEFILES_TXT})
861   string(REPLACE "/CMakeLists.txt" "" repository ${cmakefile})
862   add_subdirectory("${CMAKE_HOME_DIRECTORY}/${repository}")
863 endforeach()
864
865 ### Setup the distrib
866 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Distrib.cmake)
867
868 ### Build the docs if asked to
869 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Documentation.cmake)
870
871 ### Print the result of configuration
872 message("")
873 message("##########################################")
874 message("#### Content of src/internal_config.h ####")
875 message("##########################################")
876 file(STRINGS ${CMAKE_CURRENT_BINARY_DIR}/src/internal_config.h config_output)
877 LIST(REMOVE_AT config_output 0 1 2 3 4 5 6 7 8 9 10) # Pass the file header
878 foreach(line ${config_output})
879   message("   ${line}")
880 endforeach()
881 message("##########################################")
882 message("####   Content of simgrid/config.h    ####")
883 message("##########################################")
884 file(STRINGS ${CMAKE_CURRENT_BINARY_DIR}/include/simgrid/config.h config_output)
885 LIST(REMOVE_AT config_output 0 1 2 3 4 5 6 7 8 9 -1) # Pass the file header
886 foreach(line ${config_output})
887   message("   ${line}")
888 endforeach()
889 message("##########################################")
890 message("####   End of configuration headers   ####")
891 message("##########################################")
892
893 message("\nConfiguration of package `simgrid':")
894 message("        Home directory ..............: ${CMAKE_HOME_DIRECTORY}")
895 message("        Build Name ..................: ${BUILDNAME}")
896 message("        Cmake Generator .............: ${CMAKE_GENERATOR}")
897 message("        Site ........................: ${SITE}")
898 message("        Install prefix ..............: ${CMAKE_INSTALL_PREFIX}")
899 message("        Release .....................: simgrid-${release_version}")
900 message("")
901 message("        Compiler: C .................: ${CMAKE_C_COMPILER} (id: ${CMAKE_C_COMPILER_ID})")
902 message("                version .............: ${CMAKE_C_COMPILER_VERSION}")
903 message("                is gnu ..............: ${CMAKE_COMPILER_IS_GNUCC}")
904 message("        Compiler: C++ ...............: ${CMAKE_CXX_COMPILER} (id: ${CMAKE_CXX_COMPILER_ID})")
905 message("                version .............: ${CMAKE_CXX_COMPILER_VERSION}")
906 if(CMAKE_Fortran_COMPILER)
907   message("        Compiler: Fortran ...........: ${SMPI_Fortran_COMPILER} (id: ${CMAKE_Fortran_COMPILER_ID})")
908   message("                version .............: ${CMAKE_Fortran_COMPILER_VERSION}")
909 endif()
910 message("        Linker: .....................: ${CMAKE_LINKER}")
911 message("                version .............: ${LINKER_VERSION}")
912 message("        Make program: ...............: ${CMAKE_MAKE_PROGRAM}")
913 message("")
914 message("        CFlags ......................: ${CMAKE_C_FLAGS}")
915 message("        CXXFlags ....................: ${CMAKE_CXX_FLAGS}")
916 message("        LDFlags .....................: ${CMAKE_C_LINK_FLAGS}")
917 message("        with LTO ....................: ${enable_lto}")
918 message("")
919
920 if (SIMGRID_HAVE_NS3)
921   message("        Compile ns-3 ................: ON (path: ${NS3_PATH})")
922 else()
923   message("        Compile ns-3 ................: OFF  (hint: ${NS3_HINT})")
924 endif()
925
926 if(pybind11_FOUND)
927   message("        Compile Python bindings .....: ${enable_python}")
928   message("          module ....................: ${PYTHON_MODULE_PREFIX}simgrid${PYTHON_MODULE_EXTENSION}")
929   message("          install path ..............: ${SIMGRID_PYTHON_LIBDIR} (force another value with -DSIMGRID_PYTHON_LIBDIR)")
930 else()
931   message("        Compile Python bindings .....: OFF (disabled, or pybind11 not found)")
932 endif()
933 if(SIMGRID_HAVE_EIGEN3)
934   message("        Eigen3 library ..............: ${EIGEN3_VERSION_STRING} in ${EIGEN3_INCLUDE_DIR}")
935 else()
936   message("        Eigen3 library ..............: not found (EIGEN3_HINT='${EIGEN3_HINT}')")
937 endif()
938 if(SIMGRID_HAVE_JSON)
939   message("        JSON library ................: ${nlohmann_json_VERSION} in ${NLOHMANN_JSON_INCLUDE_DIR}")
940 else()
941   message("        JSON library ................: not found (nlohmann_json_HINT='${nlohmann_json_HINT}')")
942 endif()
943 message("        Compile Smpi ................: ${HAVE_SMPI}")
944 message("          Smpi fortran ..............: ${SMPI_FORTRAN}")
945 message("          MPICH3 testsuite ..........: ${enable_smpi_MPICH3_testsuite}")
946 message("          MBI testsuite .............: ${enable_smpi_MBI_testsuite}")
947 message("          Privatization .............: ${HAVE_PRIVATIZATION}")
948 message("          PAPI support ..............: ${HAVE_PAPI}")
949 message("        Compile Boost.Context support: ${HAVE_BOOST_CONTEXTS}")
950 message("")
951 message("        Model checking ..............: ${SIMGRID_HAVE_MC}")
952 message("          Stateful model checking ...: ${SIMGRID_HAVE_STATEFUL_MC}")
953 message("          MBI testsuite .............: ${enable_smpi_MBI_testsuite}")
954 message("")
955 message("        Maintainer mode .............: ${enable_maintainer_mode}")
956 message("        Documentation ...............: ${enable_documentation}")
957 message("        Graphviz mode ...............: ${HAVE_GRAPHVIZ}")
958 message("        Mallocators .................: ${enable_mallocators}")
959 message("")
960 message("        SimGrid dependencies ........: ${SIMGRID_DEP}")
961 message("")
962
963 execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/Testing/Notes/)
964 file(WRITE ${PROJECT_BINARY_DIR}/Testing/Notes/Build  "GIT version : ${GIT_VERSION}\n")
965 file(APPEND ${PROJECT_BINARY_DIR}/Testing/Notes/Build "Release     : simgrid-${release_version}\n")
966
967 INCLUDE(Dart)