Logo AND Algorithmique Numérique Distribuée

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