Logo AND Algorithmique Numérique Distribuée

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