Logo AND Algorithmique Numérique Distribuée

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