Logo AND Algorithmique Numérique Distribuée

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