Logo AND Algorithmique Numérique Distribuée

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