Logo AND Algorithmique Numérique Distribuée

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