Logo AND Algorithmique Numérique Distribuée

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