Logo AND Algorithmique Numérique Distribuée

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