Logo AND Algorithmique Numérique Distribuée

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