Logo AND Algorithmique Numérique Distribuée

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