Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
even better handling ...
[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     # Fortran compiler detected: save it, then replace by smpiff
83     set(SMPI_Fortran_COMPILER "${CMAKE_Fortran_COMPILER}" CACHE FILEPATH "The real Fortran compiler")
84     set(CMAKE_Fortran_COMPILER smpiff)
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 "18")
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 set(INCLUDES
163   ${CMAKE_BINARY_DIR}
164   ${CMAKE_BINARY_DIR}/include
165   ${CMAKE_HOME_DIRECTORY}
166   ${CMAKE_HOME_DIRECTORY}/include
167   ${CMAKE_HOME_DIRECTORY}/src/include
168   )
169
170 if(enable_smpi)
171   set (INCLUDES ${INCLUDES} ${CMAKE_HOME_DIRECTORY}/src/smpi/include)
172 endif()
173
174 if(NOT CMAKE_CROSSCOMPILING AND EXISTS /usr/include/)
175   set(INCLUDES ${INCLUDES} /usr/include/)
176 endif()
177
178 if(WIN32)
179   set(CMAKE_INCLUDE_WIN "${CMAKE_C_COMPILER}")
180   set(CMAKE_LIB_WIN "${CMAKE_C_COMPILER}")
181   string(REGEX REPLACE "/bin/gcc.*" "/include"  CMAKE_INCLUDE_WIN "${CMAKE_INCLUDE_WIN}")
182   string(REGEX REPLACE "/bin/gcc.*" "/lib"  CMAKE_LIB_WIN "${CMAKE_LIB_WIN}")
183   set(INCLUDES ${INCLUDES} ${CMAKE_INCLUDE_WIN})
184   unset(CMAKE_INCLUDE_WIN)
185 endif()
186
187 include_directories(${INCLUDES})
188
189 # library dependency cannot start with a space (CMP0004), so initialize it with something that is never desactivated.
190 set(SIMGRID_DEP "-lm") 
191
192 ### Determine the assembly flavor that we need today
193 set(HAVE_RAW_CONTEXTS 0)
194 include(CMakeDetermineSystem)
195 IF(CMAKE_SYSTEM_PROCESSOR MATCHES ".86|AMD64|amd64")
196   IF(CMAKE_SIZEOF_VOID_P EQUAL 4) # 32 bits
197     message(STATUS "System processor: i686 (${CMAKE_SYSTEM_PROCESSOR}, 32 bits)")
198     set(SIMGRID_PROCESSOR_i686 1)
199     set(SIMGRID_PROCESSOR_x86_64 0)
200   ELSE()
201     message(STATUS "System processor: x86_64 (${CMAKE_SYSTEM_PROCESSOR}, 64 bits)")
202     set(SIMGRID_PROCESSOR_i686 0)
203     set(SIMGRID_PROCESSOR_x86_64 1)
204   ENDIF()
205   if (WIN32)
206     message(STATUS "Disable fast raw contexts on Windows.")
207   elseif(enable_address_sanitizer)
208     message(STATUS "Disable fast raw contexts with ASan")
209   else()
210     set(HAVE_RAW_CONTEXTS 1)
211   endif()
212 ELSE()
213   set(SIMGRID_PROCESSOR_i686 0)
214   set(SIMGRID_PROCESSOR_x86_64 0)
215 ENDIF()
216
217 include(CheckFunctionExists)
218 include(CheckTypeSize)
219 include(CheckIncludeFile)
220 include(CheckIncludeFiles)
221 include(CheckLibraryExists)
222 include(CheckSymbolExists)
223
224 set(HAVE_GRAPHVIZ 0)
225 include(FindGraphviz)
226
227 set(SIMGRID_HAVE_LUA 0)
228 if(enable_lua)
229   include(FindLuaSimgrid)
230 endif()
231
232 set(SIMGRID_HAVE_NS3 0)
233 if(enable_ns3)
234   include(FindNS3)
235   if (SIMGRID_HAVE_NS3)
236     set(SIMGRID_HAVE_NS3 1)
237     foreach(lib core csma point-to-point internet network applications)
238       set(SIMGRID_DEP "${SIMGRID_DEP} -lns${NS3_VERSION}-${lib}${NS3_SUFFIX}")
239     endforeach()
240   else()
241     message(FATAL_ERROR "Cannot find NS3. Please install it (apt-get install ns3 libns3-dev) or disable that cmake option")
242   endif()
243 endif()
244
245 if(WIN32)
246   set(Boost_USE_STATIC_LIBS 1)
247 endif()
248
249 set(HAVE_PAPI 0)
250 if(enable_smpi_papi)
251   include(FindPAPI)
252   if (NOT HAVE_PAPI)
253     message(FATAL_ERROR "Cannot find PAPI. Please install it (apt-get install papi-tools libpapi-dev) or disable PAPI bindings.")
254   endif()
255 endif()
256
257 # Not finding this is perfectly OK
258 find_package(Boost COMPONENTS unit_test_framework)
259 if (Boost_UNIT_TEST_FRAMEWORK_FOUND)
260   message(STATUS "Enabling the Boost-based unit tests.")
261 else()
262   message(STATUS "Disabling the Boost-based unit tests -- please install libboost-test-dev.")
263 endif()
264
265
266 find_package(Boost 1.48)
267 if(Boost_FOUND)
268   include_directories(${Boost_INCLUDE_DIRS})
269 else()
270   if(APPLE)
271     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'")
272   else()
273     message(FATAL_ERROR "Boost libraries not found. Install libboost-dev (>= 1.48.0).")
274   endif()
275 endif()
276
277 find_package(Boost COMPONENTS context)
278 set(Boost_FOUND 1) # This component is optional
279 if(Boost_CONTEXT_FOUND)
280   message(STATUS "Found Boost.Context")
281   set(HAVE_BOOST_CONTEXTS 1)
282 else()
283   message ("   boost        : found.")
284   message ("   boost-context: missing. Install libboost-context-dev for this optional feature.")
285   set(HAVE_BOOST_CONTEXTS 0)
286 endif()
287
288 # Checks for header libraries functions.
289 CHECK_LIBRARY_EXISTS(rt      clock_gettime           "" HAVE_POSIX_GETTIME)
290
291 if(NOT APPLE) # OS X El Capitan deprecates this function
292   CHECK_LIBRARY_EXISTS(pthread sem_init                "" HAVE_SEM_INIT_LIB)
293 endif()
294 CHECK_LIBRARY_EXISTS(pthread sem_open                "" HAVE_SEM_OPEN_LIB)
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 ### Check for GNU dynamic linker
429 CHECK_INCLUDE_FILE("dlfcn.h" HAVE_DLFCN_H)
430 if (HAVE_DLFCN_H)
431   execute_process(COMMAND ${CMAKE_C_COMPILER} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_gnu_dynlinker.c ${DL_LIBRARY} -o test_gnu_ld
432                   WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
433                   OUTPUT_VARIABLE HAVE_GNU_LD_compil
434   )
435   if(HAVE_GNU_LD_compil)
436     set(HAVE_GNU_LD 0)
437     message(STATUS "Warning: test program toward GNU ld failed to compile:")
438     message(STATUS "${HAVE_GNU_LD_comp_output}")
439   else()
440     execute_process(COMMAND ./test_gnu_ld
441                     WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
442                     RESULT_VARIABLE HAVE_GNU_LD_run
443                     OUTPUT_VARIABLE var_exec
444                    )
445
446     if(NOT HAVE_GNU_LD_run)
447       set(HAVE_GNU_LD 1)
448       message(STATUS "We are using GNU dynamic linker")
449     else()
450       set(HAVE_GNU_LD 0)
451       message(STATUS "Warning: error while checking for GNU ld:")
452       message(STATUS "Test output: '${var_exec}'")
453       message(STATUS "Exit status: ${HAVE_GNU_LD_run}")
454     endif()
455     file(REMOVE test_gnu_ld)
456   endif()
457 endif()
458
459 #--------------------------------------------------------------------------------------------------
460 ### Initialize of CONTEXT THREADS
461
462 set(HAVE_THREAD_CONTEXTS 0)
463 if(CMAKE_USE_PTHREADS_INIT)
464   ### Test that we have a way to create semaphores
465
466   if(HAVE_SEM_OPEN_LIB)
467     execute_process(COMMAND ${CMAKE_C_COMPILER} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_sem_open.c -lpthread -o sem_open
468       WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
469       OUTPUT_VARIABLE HAVE_SEM_OPEN_compil
470     )
471
472     # Test sem_open by compiling:
473     if(HAVE_SEM_OPEN_compil)
474       set(HAVE_SEM_OPEN 0)
475       message(STATUS "Warning: sem_open not compilable")
476       message(STATUS "HAVE_SEM_OPEN_comp_output: ${HAVE_SEM_OPEN_comp_output}")
477     else()
478       set(HAVE_SEM_OPEN 1)
479       message(STATUS "sem_open is compilable")
480     endif()
481
482     # If we're not crosscompiling, we check by executing the program:
483     if (HAVE_SEM_OPEN AND NOT CMAKE_CROSSCOMPILING)
484       execute_process(COMMAND ./sem_open
485         WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
486         RESULT_VARIABLE HAVE_SEM_OPEN_run
487         OUTPUT_VARIABLE var_compil
488       )
489       if (NOT HAVE_SEM_OPEN_run)
490         set(HAVE_SEM_OPEN 1)
491         message(STATUS "sem_open is executable")
492       else()
493         set(HAVE_SEM_OPEN 0)
494         if(EXISTS "${CMAKE_BINARY_DIR}/sem_open")
495           message(STATUS "Bin ${CMAKE_BINARY_DIR}/sem_open exists!")
496         else()
497           message(STATUS "Bin ${CMAKE_BINARY_DIR}/sem_open not exists!")
498         endif()
499         message(STATUS "Warning: sem_open not executable")
500         message(STATUS "Compilation output: '${var_compil}'")
501         message(STATUS "Exit result of sem_open: ${HAVE_SEM_OPEN_run}")
502       endif()
503     endif()
504     file(REMOVE sem_open)
505   else()
506     set(HAVE_SEM_OPEN 0)
507   endif()
508
509   if(HAVE_SEM_INIT_LIB)
510     execute_process(COMMAND ${CMAKE_C_COMPILER} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_sem_init.c -lpthread -o sem_init
511       WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
512       RESULT_VARIABLE HAVE_SEM_INIT_run 
513       OUTPUT_VARIABLE HAVE_SEM_INIT_compil)
514
515     # Test sem_init by compiling:
516     if(HAVE_SEM_INIT_compil)
517       set(HAVE_SEM_INIT 0)
518       message(STATUS "Warning: sem_init not compilable")
519       message(STATUS "HAVE_SEM_INIT_comp_output: ${HAVE_SEM_OPEN_comp_output}")
520     else()
521       set(HAVE_SEM_INIT 1)
522       message(STATUS "sem_init is compilable")
523     endif()
524
525     # If we're not crosscompiling, we check by executing the program:
526     if (HAVE_SEM_INIT AND NOT CMAKE_CROSSCOMPILING)
527       execute_process(COMMAND ./sem_init
528         WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
529         RESULT_VARIABLE HAVE_SEM_INIT_run
530         OUTPUT_VARIABLE var_compil
531       )
532       if (NOT HAVE_SEM_INIT_run)
533         set(HAVE_SEM_INIT 1)
534         message(STATUS "sem_init is executable")
535       else()
536         set(HAVE_SEM_INIT 0)
537         if(EXISTS "${CMAKE_BINARY_DIR}/sem_init")
538           message(STATUS "Bin ${CMAKE_BINARY_DIR}/sem_init exists!")
539         else()
540           message(STATUS "Bin ${CMAKE_BINARY_DIR}/sem_init not exists!")
541         endif()
542         message(STATUS "Warning: sem_init not executable")
543         message(STATUS "Compilation output: '${var_compil}'")
544         message(STATUS "Exit result of sem_init: ${HAVE_SEM_INIT_run}")
545       endif()
546     endif()
547     file(REMOVE sem_init)
548   else() 
549     set(HAVE_SEM_INIT 0)  
550   endif()
551
552   if(NOT HAVE_SEM_OPEN AND NOT HAVE_SEM_INIT)
553     message(FATAL_ERROR "Semaphores are not usable (neither sem_open nor sem_init is both compilable and executable), but they are mandatory to threads (you may need to mount /dev).")
554   endif()
555
556   set(HAVE_THREAD_CONTEXTS 1)
557   message(STATUS "Support for thread context factory ok.")
558 endif()
559
560 set(HAVE_UCONTEXT_CONTEXTS 0)
561 if(NOT HAVE_UCONTEXT_H)
562   message(STATUS "No ucontext factory: <ucontext.h> not found.")
563 elseif(APPLE)
564   message(STATUS "No ucontext factory: Apple don't want us to use them.")
565   set(HAVE_UCONTEXT_H 0)
566 elseif(enable_address_sanitizer)
567   message(STATUS "No ucontext factory: ASan does not support it (see http://code.google.com/p/address-sanitizer/issues/detail?id=189)")
568 else()
569   try_compile(compile_makecontext ${CMAKE_BINARY_DIR} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_makecontext.c
570     OUTPUT_VARIABLE compile_makecontext_output)
571
572   #If can have both context
573   if(compile_makecontext)
574     set(HAVE_UCONTEXT_CONTEXTS 1)
575     message(STATUS "Support for ucontext factory ok.")
576   else()
577     message(STATUS "Error: <ucontext.h> exists, but makecontext is not compilable. Compilation output:\n ${compile_makecontext_output}")
578     message(STATUS "No ucontext factory: makecontext() is not compilable.")
579   endif()
580
581   # Stack setup (size and address)
582   try_run(RUN_makecontext_VAR COMPILE_makecontext_VAR
583     ${CMAKE_BINARY_DIR} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_stacksetup.c
584     RUN_OUTPUT_VARIABLE stack_setup)
585
586   LIST(LENGTH stack_setup stack_setup_len)
587   if("${stack_setup_len}" STREQUAL "2")
588     LIST(GET stack_setup 0 makecontext_addr)
589     LIST(GET stack_setup 1 makecontext_size)
590     set(sg_makecontext_stack_addr "#define sg_makecontext_stack_addr(skaddr) (${makecontext_addr})")
591     set(sg_makecontext_stack_size "#define sg_makecontext_stack_size(sksize) (${makecontext_size})")
592   else()
593     message(FATAL_ERROR "Could not figure out the stack setup. Compil: ${RUN_makecontext_VAR}. Exec: ${COMPILE_makecontext_VAR}. Output: ${stack_setup}")
594   endif()
595 endif()
596
597 # Stack growth direction (upward or downward). Used for the following contexts: SysV, raw, Boost
598 try_run(RUN_stackgrowth_VAR COMPILE_stackgrowth_VAR
599   ${CMAKE_BINARY_DIR}
600   ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_stackgrowth.c
601   RUN_OUTPUT_VARIABLE stack
602   COPY_FILE test_stackgrowth)
603
604 if("${stack}" STREQUAL "down")
605   set(PTH_STACKGROWTH "-1")
606 elseif("${stack}" STREQUAL "up")
607   set(PTH_STACKGROWTH "1")
608 else()
609   if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64")
610     set(PTH_STACKGROWTH "-1")
611   elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i686")
612     set(PTH_STACKGROWTH "-1")
613   else()
614     message(FATAL_ERROR "Could not figure out the stack direction. Test prog returned: ${stack}; CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}.")
615   endif()
616 endif()
617 # If the test ran well, remove the test binary
618 file(REMOVE test_stackgrowth)
619 #--------------------------------------------------------------------------------------------------
620
621 ### check for addr2line
622 find_path(ADDR2LINE NAMES addr2line     PATHS NO_DEFAULT_PATHS)
623 if(ADDR2LINE)
624   set(ADDR2LINE "${ADDR2LINE}/addr2line")
625 endif()
626
627 ###############
628 ## GIT version check
629 ##
630 if(EXISTS ${CMAKE_HOME_DIRECTORY}/.git/)
631   execute_process(
632      COMMAND git remote
633      COMMAND head -n 1
634      WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git/
635      OUTPUT_VARIABLE remote
636      OUTPUT_STRIP_TRAILING_WHITESPACE)
637   #message(STATUS "Git remote: ${remote}")
638   execute_process(COMMAND git config --get remote.${remote}.url
639      WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git/
640      OUTPUT_VARIABLE url
641      OUTPUT_STRIP_TRAILING_WHITESPACE)
642   #message(STATUS "Git url: ${url}")
643   if(url)
644     execute_process(COMMAND git --git-dir=${CMAKE_HOME_DIRECTORY}/.git log --pretty=oneline --abbrev-commit -1
645        WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git/
646        OUTPUT_VARIABLE GIT_VERSION
647        OUTPUT_STRIP_TRAILING_WHITESPACE)
648     message(STATUS "Git version: ${GIT_VERSION}")
649
650     execute_process(COMMAND git --git-dir=${CMAKE_HOME_DIRECTORY}/.git log -n 1 --pretty=format:%ai .
651        WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git/
652        OUTPUT_VARIABLE GIT_DATE 
653        OUTPUT_STRIP_TRAILING_WHITESPACE)
654     message(STATUS "Git date: ${GIT_DATE}")
655     string(REGEX REPLACE " .*" "" GIT_VERSION "${GIT_VERSION}")
656
657     execute_process(COMMAND git --git-dir=${CMAKE_HOME_DIRECTORY}/.git log --pretty=format:%H -1
658        WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git/
659        OUTPUT_VARIABLE SIMGRID_GITHASH
660        OUTPUT_STRIP_TRAILING_WHITESPACE)
661   endif()
662 elseif(EXISTS ${CMAKE_HOME_DIRECTORY}/.gitversion)
663   FILE(STRINGS ${CMAKE_HOME_DIRECTORY}/.gitversion GIT_VERSION)
664 else()
665   set(GIT_VERSION "none, release version")
666 endif()
667
668 ### Setup gcc & clang flags
669 if (NOT MSVC)
670   include(${CMAKE_HOME_DIRECTORY}/tools/cmake/GCCFlags.cmake)
671 endif()
672
673 ### Generate the required headers and scripts
674 #############################################
675
676 # Avoid triggering a (full) rebuild by touching the files if they did not really change
677 configure_file("${CMAKE_HOME_DIRECTORY}/tools/cmake/src/internal_config.h.in" "${CMAKE_BINARY_DIR}/src/internal_config.h.generated"    @ONLY IMMEDIATE)
678 configure_file("${CMAKE_HOME_DIRECTORY}/include/simgrid_config.h.in"          "${CMAKE_BINARY_DIR}/include/simgrid_config.h.generated" @ONLY IMMEDIATE)
679 execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/src/internal_config.h.generated ${CMAKE_BINARY_DIR}/src/internal_config.h)
680 execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/include/simgrid_config.h.generated ${CMAKE_BINARY_DIR}/include/simgrid_config.h)
681 file(REMOVE ${CMAKE_BINARY_DIR}/src/internal_config.h.generated)
682 file(REMOVE ${CMAKE_BINARY_DIR}/include/simgrid_config.h.generated)
683
684 # We need two versions of the SMPI scripts because they contain the path to the library
685 # so, it depends of whether SimGrid is installed, or run from the sources (during the build)
686
687 file(READ ${CMAKE_HOME_DIRECTORY}/src/smpi/smpitools.sh SMPITOOLS_SH) # Definitions shared amongst all SMPI scripts, inlined in each of them
688
689 ### SMPI script used when simgrid is installed
690 set(exec_prefix ${CMAKE_INSTALL_PREFIX})
691 set(includeflag "-I${CMAKE_INSTALL_PREFIX}/include -I${CMAKE_INSTALL_PREFIX}/include/smpi")
692 set(includedir "${CMAKE_INSTALL_PREFIX}/include")
693 set(libdir ${exec_prefix}/lib)
694 set(CMAKE_SMPI_COMMAND "export LD_LIBRARY_PATH=\"${CMAKE_INSTALL_PREFIX}/lib")
695 if(NS3_LIBRARY_PATH)
696   set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}:${NS3_LIBRARY_PATH}")
697 endif()
698 set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}:\${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}\"")
699 set(SMPIMAIN smpimain)
700
701 configure_file(${CMAKE_HOME_DIRECTORY}/include/smpi/mpif.h.in ${CMAKE_BINARY_DIR}/include/smpi/mpif.h @ONLY)
702 foreach(script cc cxx ff f90 run)
703   configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpi${script}.in ${CMAKE_BINARY_DIR}/bin/smpi${script} @ONLY)
704 endforeach()
705
706 ### SMPI scripts used when compiling simgrid 
707 set(exec_prefix "${CMAKE_BINARY_DIR}/smpi_script/")
708 set(includeflag "-I${CMAKE_HOME_DIRECTORY}/include -I${CMAKE_HOME_DIRECTORY}/include/smpi")
709 set(includeflag "${includeflag} -I${CMAKE_BINARY_DIR}/include -I${CMAKE_BINARY_DIR}/include/smpi")
710 set(includedir "${CMAKE_HOME_DIRECTORY}/include")
711 set(libdir "${CMAKE_BINARY_DIR}/lib")
712 set(CMAKE_SMPI_COMMAND "export LD_LIBRARY_PATH=\"${CMAKE_BINARY_DIR}/lib")
713 if(NS3_LIBRARY_PATH)
714   set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}:${NS3_LIBRARY_PATH}")
715 endif()
716 set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}:\${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}\"")
717 set(SMPIMAIN ${CMAKE_BINARY_DIR}/bin/smpimain)
718
719 foreach(script cc cxx ff f90 run)
720   configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpi${script}.in ${CMAKE_BINARY_DIR}/smpi_script/bin/smpi${script} @ONLY)
721 endforeach()
722
723 if(NOT WIN32)
724   foreach(script cc cxx ff f90 run)
725     execute_process(COMMAND chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpi${script})
726     execute_process(COMMAND chmod a=rwx ${CMAKE_BINARY_DIR}/smpi_script/bin/smpi${script})
727   endforeach()
728 endif()
729
730 set(generated_headers_to_install
731   ${CMAKE_CURRENT_BINARY_DIR}/include/smpi/mpif.h
732   ${CMAKE_CURRENT_BINARY_DIR}/include/simgrid_config.h
733   )
734
735 set(generated_headers  ${CMAKE_CURRENT_BINARY_DIR}/src/internal_config.h )
736
737 set(generated_files_to_clean
738   ${generated_headers}
739   ${generated_headers_to_install}
740   ${CMAKE_BINARY_DIR}/bin/smpicc
741   ${CMAKE_BINARY_DIR}/bin/smpicxx
742   ${CMAKE_BINARY_DIR}/bin/smpiff
743   ${CMAKE_BINARY_DIR}/bin/smpif90
744   ${CMAKE_BINARY_DIR}/bin/smpirun
745   ${CMAKE_BINARY_DIR}/bin/colorize
746   ${CMAKE_BINARY_DIR}/bin/simgrid_update_xml
747   ${CMAKE_BINARY_DIR}/examples/smpi/tracing/smpi_traced.trace
748   )
749
750 if(NOT "${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_HOME_DIRECTORY}")
751   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions0.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions0.txt COPYONLY)
752   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions1.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions1.txt COPYONLY)
753   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_allReduce.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allReduce.txt COPYONLY)
754   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_barrier.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_barrier.txt COPYONLY)
755   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_bcast.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_bcast.txt COPYONLY)
756   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_with_isend.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_with_isend.txt COPYONLY)
757   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_alltoall.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_alltoall.txt COPYONLY)
758   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_alltoallv.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_alltoallv.txt COPYONLY)
759   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_waitall.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_waitall.txt COPYONLY)
760   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_reducescatter.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_reducescatter.txt COPYONLY)
761   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_gather.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_gather.txt COPYONLY)
762   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_allgatherv.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allgatherv.txt COPYONLY)
763   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile COPYONLY)
764   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_cluster ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_cluster COPYONLY)
765   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_coll ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_coll COPYONLY)
766
767   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/description_file ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/description_file COPYONLY)
768   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/README ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/README COPYONLY)
769   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/smpi_replay.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/smpi_replay.txt COPYONLY)
770   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)
771   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)
772   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)
773   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)
774   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)
775   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)
776   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)
777   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)
778   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)
779   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)
780   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)
781   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)
782   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)
783   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)
784   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)
785   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)
786   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)
787   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)
788   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)
789   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)
790   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)
791   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)
792   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)
793   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)
794   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)
795   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)
796   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)
797   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)
798   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)
799   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)
800   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)
801   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)
802
803   set(generated_files_to_clean
804     ${generated_files_to_clean}
805     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions0.txt
806     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions1.txt
807     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allReduce.txt
808     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_barrier.txt
809     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_bcast.txt
810     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_with_isend.txt
811     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_alltoall.txt
812     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_alltoallv.txt
813     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_waitall.txt
814     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_gather.txt
815     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allgatherv.txt
816     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_reducescatter.txt
817     ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile
818     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/description_file
819     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/README
820     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/smpi_replay.txt
821     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace0.txt
822     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace1.txt
823     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace2.txt
824     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace3.txt
825     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace4.txt
826     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace5.txt
827     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace6.txt
828     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace7.txt
829     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace8.txt
830     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace9.txt
831     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace10.txt
832     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace11.txt
833     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace12.txt
834     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace13.txt
835     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace14.txt
836     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace15.txt
837     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace16.txt
838     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace17.txt
839     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace18.txt
840     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace19.txt
841     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace20.txt
842     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace21.txt
843     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace22.txt
844     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace23.txt
845     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace24.txt
846     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace25.txt
847     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace26.txt
848     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace27.txt
849     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace28.txt
850     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace29.txt
851     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace30.txt
852     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace31.txt
853     )
854 endif()
855
856 SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES
857   "${generated_files_to_clean}")
858
859 ### Define source packages for Libs
860 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/DefinePackages.cmake)
861
862 ### Build some Maintainer files
863 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/MaintainerMode.cmake)
864 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/UnitTesting.cmake)
865
866 ### Make Libs
867 if(NOT WIN32)
868   include(${CMAKE_HOME_DIRECTORY}/tools/cmake/MakeLib.cmake)
869 else()
870   include(${CMAKE_HOME_DIRECTORY}/tools/cmake/MakeLibWin.cmake)
871 endif()
872
873 if(enable_java)
874   include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Java.cmake)
875 endif()
876
877 ### Make tests
878 if(enable_memcheck_xml)
879   set(enable_memcheck true)
880 endif()
881
882 INCLUDE(CTest)
883 ENABLE_TESTING()
884 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Tests.cmake)
885 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/CTestConfig.cmake)
886
887 ### Define subdirectories
888 foreach(cmakefile ${CMAKEFILES_TXT})
889   string(REPLACE "/CMakeLists.txt" "" repository ${cmakefile})
890   add_subdirectory("${CMAKE_HOME_DIRECTORY}/${repository}")
891 endforeach()
892
893 ### Setup the distrib
894 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Distrib.cmake)
895
896 ### Build the docs if asked to
897 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Documentation.cmake)
898
899 ### Print the result of configuration
900 message("")
901 message("##########################################")
902 message("#### Content of src/internal_config.h ####")
903 message("##########################################")
904 file(STRINGS ${CMAKE_CURRENT_BINARY_DIR}/src/internal_config.h config_output)
905 LIST(REMOVE_AT config_output 0 1 2 3 4 5 6 7 8 9 10) # Pass the file header
906 foreach(line ${config_output})
907   message("   ${line}")
908 endforeach()
909 message("##########################################")
910 message("####   Content of simgrid_config.h    ####")
911 message("##########################################")
912 file(STRINGS ${CMAKE_CURRENT_BINARY_DIR}/include/simgrid_config.h config_output)
913 LIST(REMOVE_AT config_output 0 1 2 3 4 5 6 7 8 9 -1) # Pass the file header
914 foreach(line ${config_output})
915   message("   ${line}")
916 endforeach()
917 message("##########################################")
918 message("####   End of configuration headers   ####")
919 message("##########################################")
920
921 message("\nConfiguration of package `simgrid':")
922 message("        Home directory ..............: ${CMAKE_HOME_DIRECTORY}")
923 message("        Build Name ..................: ${BUILDNAME}")
924 message("        Cmake Generator .............: ${CMAKE_GENERATOR}")
925 message("        Site ........................: ${SITE}")
926 message("        Install prefix ..............: ${CMAKE_INSTALL_PREFIX}")
927 if(release)
928   message("        Release .....................: simgrid-${release_version}${SIMGRID_VERSION_EXTRA} (release build)")
929 else()
930   message("        Release .....................: simgrid-${release_version}${SIMGRID_VERSION_EXTRA} (development build)")
931 endif()
932 message("")
933 message("        Compiler: C .................: ${CMAKE_C_COMPILER} (id: ${CMAKE_C_COMPILER_ID})")
934 message("                version .............: ${CMAKE_C_COMPILER_VERSION}")
935 message("                is gnu ..............: ${CMAKE_COMPILER_IS_GNUCC}")
936 message("        Compiler: C++ ...............: ${CMAKE_CXX_COMPILER} (id: ${CMAKE_CXX_COMPILER_ID})")
937 message("                version .............: ${CMAKE_CXX_COMPILER_VERSION}")
938 if(${Java_FOUND})
939   message("        Compiler: Javac .............: ${Java_JAVAC_EXECUTABLE}")
940   message("                version .............: ${Java_VERSION_STRING}")
941 endif()
942 if(CMAKE_Fortran_COMPILER)
943   message("        Compiler: Fortran ...........: ${SMPI_Fortran_COMPILER} (id: ${CMAKE_Fortran_COMPILER_ID})")
944   message("                version .............: ${CMAKE_Fortran_COMPILER_VERSION}")
945 endif()
946 message("        Linker: .....................: ${CMAKE_LINKER}")
947 message("                version .............: ${LINKER_VERSION}")
948 message("        Make program: ...............: ${CMAKE_MAKE_PROGRAM}")
949 message("")
950 message("        CFlags ......................: ${CMAKE_C_FLAGS}")
951 message("        CXXFlags ....................: ${CMAKE_CXX_FLAGS}")
952 message("        LDFlags .....................: ${CMAKE_C_LINK_FLAGS}")
953 message("        with LTO ....................: ${enable_lto}")
954 message("")
955
956 if (SIMGRID_HAVE_NS3)
957   message("        Compile NS-3 ................: yes (path: ${NS3_PATH})")
958 else()
959   message("        Compile NS-3 ................: NO  (hint: ${NS3_HINT})")
960 endif()
961
962 if (${Java_FOUND})
963   message("        Compile Java ................: yes")
964   message("          Native lib in jar .........: ${enable_lib_in_jar}")
965 else()
966   message("        Compile Java ................: NO")
967 endif()
968 message("        Compile Lua .................: ${SIMGRID_HAVE_LUA}")
969 message("        Compile Smpi ................: ${HAVE_SMPI}")
970 message("          Smpi fortran ..............: ${SMPI_FORTRAN}")
971 message("          MPICH3 testsuite ..........: ${enable_smpi_MPICH3_testsuite}")
972 message("          Privatization .............: ${HAVE_PRIVATIZATION}")
973 message("          PAPI support...............: ${HAVE_PAPI}")
974 message("        Compile Boost.Context support: ${HAVE_BOOST_CONTEXTS}")
975 message("")
976 message("        Maintainer mode .............: ${enable_maintainer_mode}")
977 message("        Documentation................: ${enable_documentation}")
978 message("        Model checking ..............: ${SIMGRID_HAVE_MC}")
979 message("        Jedule  mode ................: ${SIMGRID_HAVE_JEDULE}")
980 message("        Graphviz mode ...............: ${HAVE_GRAPHVIZ}")
981 message("        Mallocators .................: ${enable_mallocators}")
982 message("")
983 message("        Simgrid dependencies ........: ${SIMGRID_DEP}")
984 message("")
985
986 execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/Testing/Notes/)
987 file(WRITE ${PROJECT_BINARY_DIR}/Testing/Notes/Build  "GIT version : ${GIT_VERSION}\n")
988 file(APPEND ${PROJECT_BINARY_DIR}/Testing/Notes/Build "Release     : simgrid-${release_version}\n")
989
990 INCLUDE(Dart)