Logo AND Algorithmique Numérique Distribuée

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