Logo AND Algorithmique Numérique Distribuée

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