Logo AND Algorithmique Numérique Distribuée

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