Logo AND Algorithmique Numérique Distribuée

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