Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
f45dca95b0a631f8fc66e83790a45c092209ffe2
[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     execute_process(COMMAND ${CMAKE_C_COMPILER} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_sem_open.c -lpthread -o sem_open
440       WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
441       OUTPUT_VARIABLE HAVE_SEM_OPEN_compil
442     )
443
444     # Test sem_open by compiling:
445     if(HAVE_SEM_OPEN_compil)
446       set(HAVE_SEM_OPEN 0)
447       message(STATUS "Warning: sem_open not compilable")
448       message(STATUS "HAVE_SEM_OPEN_comp_output: ${HAVE_SEM_OPEN_comp_output}")
449     else()
450       set(HAVE_SEM_OPEN 1)
451       message(STATUS "sem_open is compilable")
452     endif()
453
454     # If we're not crosscompiling, we check by executing the program:
455     if (HAVE_SEM_OPEN AND NOT CMAKE_CROSSCOMPILING)
456       execute_process(COMMAND ./sem_open
457         WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
458         RESULT_VARIABLE HAVE_SEM_OPEN_run
459         OUTPUT_VARIABLE var_compil
460       )
461       if (NOT HAVE_SEM_OPEN_run)
462         set(HAVE_SEM_OPEN 1)
463         message(STATUS "sem_open is executable")
464       else()
465         set(HAVE_SEM_OPEN 0)
466         if(EXISTS "${CMAKE_BINARY_DIR}/sem_open")
467           message(STATUS "Bin ${CMAKE_BINARY_DIR}/sem_open exists!")
468         else()
469           message(STATUS "Bin ${CMAKE_BINARY_DIR}/sem_open not exists!")
470         endif()
471         message(STATUS "Warning: sem_open not executable")
472         message(STATUS "Compilation output: '${var_compil}'")
473         message(STATUS "Exit result of sem_open: ${HAVE_SEM_OPEN_run}")
474       endif()
475     endif()
476     file(REMOVE sem_open)
477   else()
478     set(HAVE_SEM_OPEN 0)
479   endif()
480
481   if(HAVE_SEM_INIT_LIB)
482     execute_process(COMMAND ${CMAKE_C_COMPILER} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_sem_init.c -lpthread -o sem_init
483       WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
484       RESULT_VARIABLE HAVE_SEM_INIT_run 
485       OUTPUT_VARIABLE HAVE_SEM_INIT_compil)
486
487     # Test sem_init by compiling:
488     if(HAVE_SEM_INIT_compil)
489       set(HAVE_SEM_INIT 0)
490       message(STATUS "Warning: sem_init not compilable")
491       message(STATUS "HAVE_SEM_INIT_comp_output: ${HAVE_SEM_OPEN_comp_output}")
492     else()
493       set(HAVE_SEM_INIT 1)
494       message(STATUS "sem_init is compilable")
495     endif()
496
497     # If we're not crosscompiling, we check by executing the program:
498     if (HAVE_SEM_INIT AND NOT CMAKE_CROSSCOMPILING)
499       execute_process(COMMAND ./sem_init
500         WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
501         RESULT_VARIABLE HAVE_SEM_INIT_run
502         OUTPUT_VARIABLE var_compil
503       )
504       if (NOT HAVE_SEM_INIT_run)
505         set(HAVE_SEM_INIT 1)
506         message(STATUS "sem_init is executable")
507       else()
508         set(HAVE_SEM_INIT 0)
509         if(EXISTS "${CMAKE_BINARY_DIR}/sem_init")
510           message(STATUS "Bin ${CMAKE_BINARY_DIR}/sem_init exists!")
511         else()
512           message(STATUS "Bin ${CMAKE_BINARY_DIR}/sem_init not exists!")
513         endif()
514         message(STATUS "Warning: sem_init not executable")
515         message(STATUS "Compilation output: '${var_compil}'")
516         message(STATUS "Exit result of sem_init: ${HAVE_SEM_INIT_run}")
517       endif()
518     endif()
519     file(REMOVE sem_init)
520   else() 
521     set(HAVE_SEM_INIT 0)  
522   endif()
523
524   if(NOT HAVE_SEM_OPEN AND NOT HAVE_SEM_INIT)
525     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).")
526   endif()
527
528   set(HAVE_THREAD_CONTEXTS 1)
529   message(STATUS "Support for thread context factory ok.")
530 endif()
531
532 set(HAVE_UCONTEXT_CONTEXTS 0)
533 if(NOT HAVE_UCONTEXT_H)
534   message(STATUS "No ucontext factory: <ucontext.h> not found.")
535 elseif(APPLE)
536   message(STATUS "No ucontext factory: Apple don't want us to use them.")
537   set(HAVE_UCONTEXT_H 0)
538 elseif(enable_address_sanitizer)
539   message(STATUS "No ucontext factory: ASan does not support it (see http://code.google.com/p/address-sanitizer/issues/detail?id=189)")
540 else()
541   try_compile(compile_makecontext ${CMAKE_BINARY_DIR} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_makecontext.c
542     OUTPUT_VARIABLE compile_makecontext_output)
543
544   #If can have both context
545   if(compile_makecontext)
546     set(HAVE_UCONTEXT_CONTEXTS 1)
547     message(STATUS "Support for ucontext factory ok.")
548   else()
549     message(STATUS "Error: <ucontext.h> exists, but makecontext is not compilable. Compilation output:\n ${compile_makecontext_output}")
550     message(STATUS "No ucontext factory: makecontext() is not compilable.")
551   endif()
552
553   # Stack setup (size and address)
554   try_run(RUN_makecontext_VAR COMPILE_makecontext_VAR
555     ${CMAKE_BINARY_DIR} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_stacksetup.c
556     RUN_OUTPUT_VARIABLE stack_setup)
557
558   LIST(LENGTH stack_setup stack_setup_len)
559   if("${stack_setup_len}" STREQUAL "2")
560     LIST(GET stack_setup 0 makecontext_addr)
561     LIST(GET stack_setup 1 makecontext_size)
562     set(sg_makecontext_stack_addr "#define sg_makecontext_stack_addr(skaddr) (${makecontext_addr})")
563     set(sg_makecontext_stack_size "#define sg_makecontext_stack_size(sksize) (${makecontext_size})")
564   else()
565     message(FATAL_ERROR "Could not figure out the stack setup. Compil: ${RUN_makecontext_VAR}. Exec: ${COMPILE_makecontext_VAR}. Output: ${stack_setup}")
566   endif()
567 endif()
568
569 # Stack growth direction (upward or downward). Used for the following contexts: SysV, raw, Boost
570 try_run(RUN_stackgrowth_VAR COMPILE_stackgrowth_VAR
571   ${CMAKE_BINARY_DIR}
572   ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_stackgrowth.c
573   RUN_OUTPUT_VARIABLE stack
574   COPY_FILE test_stackgrowth)
575
576 if("${stack}" STREQUAL "down")
577   set(PTH_STACKGROWTH "-1")
578 elseif("${stack}" STREQUAL "up")
579   set(PTH_STACKGROWTH "1")
580 else()
581   if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64")
582     set(PTH_STACKGROWTH "-1")
583   elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i686")
584     set(PTH_STACKGROWTH "-1")
585   else()
586     message(FATAL_ERROR "Could not figure out the stack direction. Test prog returned: ${stack}; CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}.")
587   endif()
588 endif()
589 # If the test ran well, remove the test binary
590 file(REMOVE test_stackgrowth)
591 #--------------------------------------------------------------------------------------------------
592
593 ### check for addr2line
594 find_path(ADDR2LINE NAMES addr2line     PATHS NO_DEFAULT_PATHS)
595 if(ADDR2LINE)
596   set(ADDR2LINE "${ADDR2LINE}/addr2line")
597 endif()
598
599 ###############
600 ## GIT version check
601 ##
602 if(EXISTS ${CMAKE_HOME_DIRECTORY}/.git/)
603   execute_process(
604      COMMAND git remote
605      COMMAND head -n 1
606      WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git/
607      OUTPUT_VARIABLE remote
608      OUTPUT_STRIP_TRAILING_WHITESPACE)
609   #message(STATUS "Git remote: ${remote}")
610   execute_process(COMMAND git config --get remote.${remote}.url
611      WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git/
612      OUTPUT_VARIABLE url
613      OUTPUT_STRIP_TRAILING_WHITESPACE)
614   #message(STATUS "Git url: ${url}")
615   if(url)
616     execute_process(COMMAND git --git-dir=${CMAKE_HOME_DIRECTORY}/.git log --pretty=oneline --abbrev-commit -1
617        WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git/
618        OUTPUT_VARIABLE GIT_VERSION
619        OUTPUT_STRIP_TRAILING_WHITESPACE)
620     message(STATUS "Git version: ${GIT_VERSION}")
621
622     execute_process(COMMAND git --git-dir=${CMAKE_HOME_DIRECTORY}/.git log -n 1 --pretty=format:%ai .
623        WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git/
624        OUTPUT_VARIABLE GIT_DATE 
625        OUTPUT_STRIP_TRAILING_WHITESPACE)
626     message(STATUS "Git date: ${GIT_DATE}")
627     string(REGEX REPLACE " .*" "" GIT_VERSION "${GIT_VERSION}")
628
629     execute_process(COMMAND git --git-dir=${CMAKE_HOME_DIRECTORY}/.git log --pretty=format:%H -1
630        WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git/
631        OUTPUT_VARIABLE SIMGRID_GITHASH
632        OUTPUT_STRIP_TRAILING_WHITESPACE)
633   endif()
634 elseif(EXISTS ${CMAKE_HOME_DIRECTORY}/.gitversion)
635   FILE(STRINGS ${CMAKE_HOME_DIRECTORY}/.gitversion GIT_VERSION)
636 else()
637   set(GIT_VERSION "none, release version")
638 endif()
639
640 ### Setup gcc & clang flags
641 if (NOT MSVC)
642   include(${CMAKE_HOME_DIRECTORY}/tools/cmake/GCCFlags.cmake)
643 endif()
644
645 ### Generate the required headers and scripts
646 #############################################
647
648 # Avoid triggering a (full) rebuild by touching the files if they did not really change
649 configure_file("${CMAKE_HOME_DIRECTORY}/tools/cmake/src/internal_config.h.in" "${CMAKE_BINARY_DIR}/src/internal_config.h.generated"    @ONLY IMMEDIATE)
650 configure_file("${CMAKE_HOME_DIRECTORY}/include/simgrid_config.h.in"          "${CMAKE_BINARY_DIR}/include/simgrid_config.h.generated" @ONLY IMMEDIATE)
651 execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/src/internal_config.h.generated ${CMAKE_BINARY_DIR}/src/internal_config.h)
652 execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/include/simgrid_config.h.generated ${CMAKE_BINARY_DIR}/include/simgrid_config.h)
653 file(REMOVE ${CMAKE_BINARY_DIR}/src/internal_config.h.generated)
654 file(REMOVE ${CMAKE_BINARY_DIR}/include/simgrid_config.h.generated)
655
656 # We need two versions of the SMPI scripts because they contain the path to the library
657 # so, it depends of whether SimGrid is installed, or run from the sources (during the build)
658
659 file(READ ${CMAKE_HOME_DIRECTORY}/src/smpi/smpitools.sh SMPITOOLS_SH) # Definitions shared amongst all SMPI scripts, inlined in each of them
660
661 ### SMPI script used when simgrid is installed
662 set(exec_prefix ${CMAKE_INSTALL_PREFIX})
663 set(includeflag "-I${CMAKE_INSTALL_PREFIX}/include -I${CMAKE_INSTALL_PREFIX}/include/smpi")
664 set(includedir "${CMAKE_INSTALL_PREFIX}/include")
665 set(libdir ${exec_prefix}/lib)
666 set(CMAKE_SMPI_COMMAND "export LD_LIBRARY_PATH=\"${CMAKE_INSTALL_PREFIX}/lib")
667 if(NS3_LIBRARY_PATH)
668   set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}:${NS3_LIBRARY_PATH}")
669 endif()
670 set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}:\${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}\"")
671 set(SMPIMAIN smpimain)
672
673 configure_file(${CMAKE_HOME_DIRECTORY}/include/smpi/mpif.h.in ${CMAKE_BINARY_DIR}/include/smpi/mpif.h @ONLY)
674 #configure mpif.f90 to build mpi.mod
675 if(SMPI_FORTRAN)
676   set(MODULE_MPIF_IN "module mpi")
677   set(MODULE_MPIF_OUT "end module mpi")
678   configure_file(${CMAKE_HOME_DIRECTORY}/include/smpi/mpif.h.in ${CMAKE_BINARY_DIR}/src/smpi/mpif.f90.generated @ONLY)
679   execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/src/smpi/mpif.f90.generated ${CMAKE_BINARY_DIR}/src/smpi/mpif.f90)
680   set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/include/smpi)
681   add_library(mpi SHARED ${CMAKE_BINARY_DIR}/src/smpi/mpif.f90)
682 endif()
683
684 foreach(script cc cxx ff f90 run)
685   configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpi${script}.in ${CMAKE_BINARY_DIR}/bin/smpi${script} @ONLY)
686 endforeach()
687
688 ### SMPI scripts used when compiling simgrid 
689 set(exec_prefix "${CMAKE_BINARY_DIR}/smpi_script/")
690 set(includeflag "-I${CMAKE_HOME_DIRECTORY}/include -I${CMAKE_HOME_DIRECTORY}/include/smpi")
691 set(includeflag "${includeflag} -I${CMAKE_BINARY_DIR}/include -I${CMAKE_BINARY_DIR}/include/smpi")
692 set(includedir "${CMAKE_HOME_DIRECTORY}/include")
693 set(libdir "${CMAKE_BINARY_DIR}/lib")
694 set(CMAKE_SMPI_COMMAND "export LD_LIBRARY_PATH=\"${CMAKE_BINARY_DIR}/lib")
695 if(NS3_LIBRARY_PATH)
696   set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}:${NS3_LIBRARY_PATH}")
697 endif()
698 set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}:\${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}\"")
699 set(SMPIMAIN ${CMAKE_BINARY_DIR}/bin/smpimain)
700
701 foreach(script cc cxx ff f90 run)
702   configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpi${script}.in ${CMAKE_BINARY_DIR}/smpi_script/bin/smpi${script} @ONLY)
703 endforeach()
704
705 if(NOT WIN32)
706   foreach(script cc cxx ff f90 run)
707     execute_process(COMMAND chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpi${script})
708     execute_process(COMMAND chmod a=rwx ${CMAKE_BINARY_DIR}/smpi_script/bin/smpi${script})
709   endforeach()
710 endif()
711
712 set(generated_headers_to_install
713   ${CMAKE_CURRENT_BINARY_DIR}/include/smpi/mpif.h
714   ${CMAKE_CURRENT_BINARY_DIR}/include/simgrid_config.h
715   )
716
717 set(generated_headers  ${CMAKE_CURRENT_BINARY_DIR}/src/internal_config.h )
718
719 set(generated_files_to_clean
720   ${generated_headers}
721   ${generated_headers_to_install}
722   ${CMAKE_BINARY_DIR}/bin/smpicc
723   ${CMAKE_BINARY_DIR}/bin/smpicxx
724   ${CMAKE_BINARY_DIR}/bin/smpiff
725   ${CMAKE_BINARY_DIR}/bin/smpif90
726   ${CMAKE_BINARY_DIR}/bin/smpirun
727   ${CMAKE_BINARY_DIR}/bin/colorize
728   ${CMAKE_BINARY_DIR}/bin/simgrid_update_xml
729   ${CMAKE_BINARY_DIR}/examples/smpi/tracing/smpi_traced.trace
730   )
731
732 if(NOT "${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_HOME_DIRECTORY}")
733   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions0.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions0.txt COPYONLY)
734   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions1.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions1.txt COPYONLY)
735   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_allReduce.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allReduce.txt COPYONLY)
736   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_barrier.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_barrier.txt COPYONLY)
737   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_bcast.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_bcast.txt COPYONLY)
738   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_with_isend.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_with_isend.txt COPYONLY)
739   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_alltoall.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_alltoall.txt COPYONLY)
740   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_alltoallv.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_alltoallv.txt COPYONLY)
741   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_waitall.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_waitall.txt COPYONLY)
742   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_reducescatter.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_reducescatter.txt COPYONLY)
743   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_gather.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_gather.txt COPYONLY)
744   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_allgatherv.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allgatherv.txt COPYONLY)
745   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile COPYONLY)
746   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_cluster ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_cluster COPYONLY)
747   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_coll ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_coll COPYONLY)
748
749   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/description_file ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/description_file COPYONLY)
750   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/README ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/README COPYONLY)
751   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/smpi_replay.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/smpi_replay.txt COPYONLY)
752   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)
753   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)
754   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)
755   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)
756   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)
757   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)
758   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)
759   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)
760   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)
761   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)
762   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)
763   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)
764   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)
765   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)
766   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)
767   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)
768   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)
769   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)
770   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)
771   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)
772   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)
773   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)
774   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)
775   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)
776   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)
777   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)
778   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)
779   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)
780   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)
781   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)
782   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)
783   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)
784
785   set(generated_files_to_clean
786     ${generated_files_to_clean}
787     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions0.txt
788     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions1.txt
789     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allReduce.txt
790     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_barrier.txt
791     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_bcast.txt
792     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_with_isend.txt
793     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_alltoall.txt
794     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_alltoallv.txt
795     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_waitall.txt
796     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_gather.txt
797     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allgatherv.txt
798     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_reducescatter.txt
799     ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile
800     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/description_file
801     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/README
802     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/smpi_replay.txt
803     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace0.txt
804     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace1.txt
805     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace2.txt
806     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace3.txt
807     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace4.txt
808     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace5.txt
809     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace6.txt
810     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace7.txt
811     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace8.txt
812     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace9.txt
813     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace10.txt
814     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace11.txt
815     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace12.txt
816     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace13.txt
817     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace14.txt
818     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace15.txt
819     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace16.txt
820     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace17.txt
821     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace18.txt
822     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace19.txt
823     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace20.txt
824     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace21.txt
825     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace22.txt
826     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace23.txt
827     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace24.txt
828     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace25.txt
829     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace26.txt
830     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace27.txt
831     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace28.txt
832     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace29.txt
833     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace30.txt
834     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace31.txt
835     )
836 endif()
837
838 SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES
839   "${generated_files_to_clean}")
840
841 ### Define source packages for Libs
842 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/DefinePackages.cmake)
843
844 ### Build some Maintainer files
845 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/MaintainerMode.cmake)
846 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/UnitTesting.cmake)
847
848 ### Make Libs
849 if(NOT WIN32)
850   include(${CMAKE_HOME_DIRECTORY}/tools/cmake/MakeLib.cmake)
851 else()
852   include(${CMAKE_HOME_DIRECTORY}/tools/cmake/MakeLibWin.cmake)
853 endif()
854
855 if(enable_java)
856   include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Java.cmake)
857 endif()
858
859 ### Make tests
860 if(enable_memcheck_xml)
861   set(enable_memcheck true)
862 endif()
863
864 INCLUDE(CTest)
865 ENABLE_TESTING()
866 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Tests.cmake)
867 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/CTestConfig.cmake)
868
869 ### Define subdirectories
870 foreach(cmakefile ${CMAKEFILES_TXT})
871   string(REPLACE "/CMakeLists.txt" "" repository ${cmakefile})
872   add_subdirectory("${CMAKE_HOME_DIRECTORY}/${repository}")
873 endforeach()
874
875 ### Setup the distrib
876 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Distrib.cmake)
877
878 ### Build the docs if asked to
879 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Documentation.cmake)
880
881 ### Print the result of configuration
882 message("")
883 message("##########################################")
884 message("#### Content of src/internal_config.h ####")
885 message("##########################################")
886 file(STRINGS ${CMAKE_CURRENT_BINARY_DIR}/src/internal_config.h config_output)
887 LIST(REMOVE_AT config_output 0 1 2 3 4 5 6 7 8 9 10) # Pass the file header
888 foreach(line ${config_output})
889   message("   ${line}")
890 endforeach()
891 message("##########################################")
892 message("####   Content of simgrid_config.h    ####")
893 message("##########################################")
894 file(STRINGS ${CMAKE_CURRENT_BINARY_DIR}/include/simgrid_config.h config_output)
895 LIST(REMOVE_AT config_output 0 1 2 3 4 5 6 7 8 9 -1) # Pass the file header
896 foreach(line ${config_output})
897   message("   ${line}")
898 endforeach()
899 message("##########################################")
900 message("####   End of configuration headers   ####")
901 message("##########################################")
902
903 message("\nConfiguration of package `simgrid':")
904 message("        Home directory ..............: ${CMAKE_HOME_DIRECTORY}")
905 message("        Build Name ..................: ${BUILDNAME}")
906 message("        Cmake Generator .............: ${CMAKE_GENERATOR}")
907 message("        Site ........................: ${SITE}")
908 message("        Install prefix ..............: ${CMAKE_INSTALL_PREFIX}")
909 if(release)
910   message("        Release .....................: simgrid-${release_version}${SIMGRID_VERSION_EXTRA} (release build)")
911 else()
912   message("        Release .....................: simgrid-${release_version}${SIMGRID_VERSION_EXTRA} (development build)")
913 endif()
914 message("")
915 message("        Compiler: C .................: ${CMAKE_C_COMPILER} (id: ${CMAKE_C_COMPILER_ID})")
916 message("                version .............: ${CMAKE_C_COMPILER_VERSION}")
917 message("                is gnu ..............: ${CMAKE_COMPILER_IS_GNUCC}")
918 message("        Compiler: C++ ...............: ${CMAKE_CXX_COMPILER} (id: ${CMAKE_CXX_COMPILER_ID})")
919 message("                version .............: ${CMAKE_CXX_COMPILER_VERSION}")
920 if(${Java_FOUND})
921   message("        Compiler: Javac .............: ${Java_JAVAC_EXECUTABLE}")
922   message("                version .............: ${Java_VERSION_STRING}")
923 endif()
924 if(CMAKE_Fortran_COMPILER)
925   message("        Compiler: Fortran ...........: ${SMPI_Fortran_COMPILER} (id: ${CMAKE_Fortran_COMPILER_ID})")
926   message("                version .............: ${CMAKE_Fortran_COMPILER_VERSION}")
927 endif()
928 message("        Linker: .....................: ${CMAKE_LINKER}")
929 message("                version .............: ${LINKER_VERSION}")
930 message("        Make program: ...............: ${CMAKE_MAKE_PROGRAM}")
931 message("")
932 message("        CFlags ......................: ${CMAKE_C_FLAGS}")
933 message("        CXXFlags ....................: ${CMAKE_CXX_FLAGS}")
934 message("        LDFlags .....................: ${CMAKE_C_LINK_FLAGS}")
935 message("        with LTO ....................: ${enable_lto}")
936 message("")
937
938 if (SIMGRID_HAVE_NS3)
939   message("        Compile NS-3 ................: yes (path: ${NS3_PATH})")
940 else()
941   message("        Compile NS-3 ................: NO  (hint: ${NS3_HINT})")
942 endif()
943
944 if (${Java_FOUND})
945   message("        Compile Java ................: yes")
946   message("          Native lib in jar .........: ${enable_lib_in_jar}")
947 else()
948   message("        Compile Java ................: NO")
949 endif()
950 message("        Compile Lua .................: ${SIMGRID_HAVE_LUA}")
951 message("        Compile Smpi ................: ${HAVE_SMPI}")
952 message("          Smpi fortran ..............: ${SMPI_FORTRAN}")
953 message("          MPICH3 testsuite ..........: ${enable_smpi_MPICH3_testsuite}")
954 message("          Privatization .............: ${HAVE_PRIVATIZATION}")
955 message("          PAPI support...............: ${HAVE_PAPI}")
956 message("        Compile Boost.Context support: ${HAVE_BOOST_CONTEXTS}")
957 message("")
958 message("        Maintainer mode .............: ${enable_maintainer_mode}")
959 message("        Documentation................: ${enable_documentation}")
960 message("        Model checking ..............: ${SIMGRID_HAVE_MC}")
961 message("        Jedule  mode ................: ${SIMGRID_HAVE_JEDULE}")
962 message("        Graphviz mode ...............: ${HAVE_GRAPHVIZ}")
963 message("        Mallocators .................: ${enable_mallocators}")
964 message("")
965 message("        Simgrid dependencies ........: ${SIMGRID_DEP}")
966 message("")
967
968 execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/Testing/Notes/)
969 file(WRITE ${PROJECT_BINARY_DIR}/Testing/Notes/Build  "GIT version : ${GIT_VERSION}\n")
970 file(APPEND ${PROJECT_BINARY_DIR}/Testing/Notes/Build "Release     : simgrid-${release_version}\n")
971
972 INCLUDE(Dart)