Logo AND Algorithmique Numérique Distribuée

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