Logo AND Algorithmique Numérique Distribuée

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