Logo AND Algorithmique Numérique Distribuée

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