Logo AND Algorithmique Numérique Distribuée

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