Logo AND Algorithmique Numérique Distribuée

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