Logo AND Algorithmique Numérique Distribuée

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