Logo AND Algorithmique Numérique Distribuée

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