Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge pull request #193 from Takishipp/signals
[simgrid.git] / CMakeLists.txt
1 cmake_minimum_required(VERSION 2.8.8)
2 message(STATUS "Cmake version ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}")
3 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_HOME_DIRECTORY}/tools/cmake/Modules)
4
5 project(SimGrid C CXX)
6
7 #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
8 #     Check for the compiler        #
9 #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
10
11 ### Need to set rc ccompiler before enable language
12 if(WIN32)
13   SET(CMAKE_RC_COMPILER "windres")
14 endif()
15
16 ## 
17 ## Check the C/C++ standard that we need
18 ##   See also tools/cmake/GCCFlags.cmake that sets our paranoid warning flags
19 INCLUDE(CheckCCompilerFlag)
20 CHECK_C_COMPILER_FLAG(-fstack-cleaner HAVE_C_STACK_CLEANER)
21
22 ## Request full debugging flags
23 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g3")
24 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3")
25 set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -g")
26
27 if (CMAKE_COMPILER_IS_GNUCC)    
28   if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.7")
29     message(FATAL_ERROR
30             "SimGrid needs at least g++ version 4.7 to compile but you have ${CMAKE_CXX_COMPILER_VERSION}."
31             "You need a sufficient support of c++11 to compile SimGrid.")
32   endif()
33 endif()
34
35 ## We need a decent support of the c++11 standard
36 include(CheckCXXCompilerFlag)
37 CHECK_CXX_COMPILER_FLAG("-std=gnu++11" COMPILER_SUPPORTS_CXX11)
38 if(COMPILER_SUPPORTS_CXX11)
39   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
40 else() 
41   message(FATAL_ERROR 
42           "The compiler ${CMAKE_CXX_COMPILER} (v${CMAKE_CXX_COMPILER_VERSION}) has no C++11 support. "
43            "Please use a decent C++ compiler.")
44 endif()
45
46 ### And we need C11 standard, too
47 include(CheckCCompilerFlag)
48 CHECK_C_COMPILER_FLAG("-std=gnu11" COMPILER_SUPPORTS_C11)
49 if(COMPILER_SUPPORTS_C11)
50   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11")
51 else()
52   message(FATAL_ERROR 
53           "The compiler ${CMAKE_C_COMPILER} (v${CMAKE_C_COMPILER_VERSION}) has no C11 support. "
54           "Please use a decent C compiler "
55           "(note that c++11 support of ${CMAKE_CXX_COMPILER} seems ok).")
56 endif()
57 if(APPLE AND (CMAKE_C_COMPILER_VERSION VERSION_LESS "4.6"))
58   ### gcc 4.[1-5] cannot compile ucontext on OSX
59   message(STATUS "Ucontext can't be used with this version of gcc (must be greater than 4.5)")
60   set(HAVE_UCONTEXT_H 0)
61 endif()
62
63 ### 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 "17")
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(NOT CMAKE_CROSSCOMPILING AND EXISTS /usr/include/)
171   set(INCLUDES ${INCLUDES} /usr/include/)
172 endif()
173
174 if(WIN32)
175   set(CMAKE_INCLUDE_WIN "${CMAKE_C_COMPILER}")
176   set(CMAKE_LIB_WIN "${CMAKE_C_COMPILER}")
177   string(REGEX REPLACE "/bin/gcc.*" "/include"  CMAKE_INCLUDE_WIN "${CMAKE_INCLUDE_WIN}")
178   string(REGEX REPLACE "/bin/gcc.*" "/lib"  CMAKE_LIB_WIN "${CMAKE_LIB_WIN}")
179   set(INCLUDES ${INCLUDES} ${CMAKE_INCLUDE_WIN})
180   unset(CMAKE_INCLUDE_WIN)
181 endif()
182
183 include_directories(${INCLUDES})
184
185 # library dependency cannot start with a space (CMP0004), so initialize it with something that is never desactivated.
186 set(SIMGRID_DEP "-lm") 
187
188 ### Determine the assembly flavor that we need today
189 set(HAVE_RAW_CONTEXTS 0)
190 include(CMakeDetermineSystem)
191 IF(CMAKE_SYSTEM_PROCESSOR MATCHES ".86|AMD64|amd64")
192   IF(CMAKE_SIZEOF_VOID_P EQUAL 4) # 32 bits
193     message(STATUS "System processor: i686 (${CMAKE_SYSTEM_PROCESSOR}, 32 bits)")
194     set(SIMGRID_PROCESSOR_i686 1)
195     set(SIMGRID_PROCESSOR_x86_64 0)
196   ELSE()
197     message(STATUS "System processor: x86_64 (${CMAKE_SYSTEM_PROCESSOR}, 64 bits)")
198     set(SIMGRID_PROCESSOR_i686 0)
199     set(SIMGRID_PROCESSOR_x86_64 1)
200   ENDIF()
201   if (WIN32)
202     message(STATUS "Disable fast raw contexts on Windows.")
203   else()
204     set(HAVE_RAW_CONTEXTS 1)
205   endif()
206 ELSE()
207   set(SIMGRID_PROCESSOR_i686 0)
208   set(SIMGRID_PROCESSOR_x86_64 0)
209 ENDIF()
210
211 include(CheckFunctionExists)
212 include(CheckTypeSize)
213 include(CheckIncludeFile)
214 include(CheckIncludeFiles)
215 include(CheckLibraryExists)
216 include(CheckSymbolExists)
217
218 set(HAVE_GRAPHVIZ 0)
219 include(FindGraphviz)
220
221 set(SIMGRID_HAVE_LUA 0)
222 if(enable_lua)
223   include(FindLuaSimgrid)
224 endif()
225
226 set(SIMGRID_HAVE_NS3 0)
227 if(enable_ns3)
228   include(FindNS3)
229   if (SIMGRID_HAVE_NS3)
230     set(SIMGRID_HAVE_NS3 1)
231   else()
232     message(FATAL_ERROR "Cannot find NS3. Please install it (apt-get install ns3 libns3-dev) or disable that cmake option")
233   endif()
234 endif()
235
236 if(WIN32)
237   set(Boost_USE_STATIC_LIBS 1)
238 endif()
239 set(HAVE_PAPI 0)
240 if(enable_smpi_papi)
241   include(FindPAPI)
242   if (NOT HAVE_PAPI)
243     message(FATAL_ERROR "Cannot find PAPI. Please install it (apt-get install papi-tools libpapi-dev) or disable PAPI bindings.")
244   endif()
245 endif()
246
247 # Not finding this is perfectly OK
248 find_package(Boost COMPONENTS unit_test_framework)
249 if (Boost_UNIT_TEST_FRAMEWORK_FOUND)
250   message("--   (enabling the Boost-based unit tests)")
251 else()
252   message("--   (disabling the Boost-based unit tests -- please install libboost-test-dev)")
253 endif()
254
255
256 find_package(Boost 1.48)
257 if(Boost_FOUND)
258   include_directories(${Boost_INCLUDE_DIRS})
259 else()
260   if(APPLE)
261     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'")
262   else()
263     message(FATAL_ERROR "Boost libraries not found. Install libboost-dev (>= 1.48.0).")
264   endif()
265 endif()
266
267 find_package(Boost COMPONENTS context)
268 set(Boost_FOUND 1) # This component is optional
269 if(Boost_CONTEXT_FOUND)
270   if (Boost_VERSION LESS 105600)
271     message("Found Boost.Context API v1")
272     set(HAVE_BOOST_CONTEXTS 1)
273   elseif(Boost_VERSION LESS 106100)
274     message("Found Boost.Context API v2")
275     set(HAVE_BOOST_CONTEXTS 2)
276   else()
277     message("   WARNING : our implementation of Boost context factory is not compatible with Boost >=1.61 yet.")
278     set(HAVE_BOOST_CONTEXTS 0)
279   endif()
280 else()
281   message ("   boost        : found.")
282   message ("   boost-context: missing. Install libboost-context-dev for this optional feature.")
283   set(HAVE_BOOST_CONTEXTS 0)
284 endif()
285
286 # Checks for header libraries functions.
287 CHECK_LIBRARY_EXISTS(rt      clock_gettime           "" HAVE_POSIX_GETTIME)
288
289 if(NOT APPLE) # OS X El Capitan deprecates this function
290   CHECK_LIBRARY_EXISTS(pthread sem_init                "" HAVE_SEM_INIT_LIB)
291 endif()
292 CHECK_LIBRARY_EXISTS(pthread sem_open                "" HAVE_SEM_OPEN_LIB)
293 set(HAVE_PTHREAD_SETAFFINITY 0)
294 CHECK_LIBRARY_EXISTS(pthread pthread_setaffinity_np  "" HAVE_PTHREAD_SETAFFINITY)
295
296 if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
297   set(CMAKE_REQUIRED_DEFINITIONS "-D_XOPEN_SOURCE=700 -D_DARWIN_C_SOURCE")
298 elseif(MINGW)
299   # Use the GNU version of unusual modifiers like PRIx64
300   add_definitions(-D__USE_MINGW_ANSI_STDIO=1)
301   set(CMAKE_REQUIRED_DEFINITIONS "-D__USE_MINGW_ANSI_STDIO=1")
302 else()
303   set(CMAKE_REQUIRED_DEFINITIONS "-D_GNU_SOURCE")
304 endif()
305
306 CHECK_INCLUDE_FILE("valgrind/valgrind.h" HAVE_VALGRIND_H)
307 CHECK_INCLUDE_FILE("unistd.h" HAVE_UNISTD_H)
308 CHECK_INCLUDE_FILE("execinfo.h" HAVE_EXECINFO_H)
309 CHECK_INCLUDE_FILE("signal.h" HAVE_SIGNAL_H)
310 CHECK_INCLUDE_FILE("sys/param.h" HAVE_SYS_PARAM_H)
311 CHECK_INCLUDE_FILE("sys/sysctl.h" HAVE_SYS_SYSCTL_H)
312 CHECK_INCLUDE_FILE("ucontext.h" HAVE_UCONTEXT_H)
313 CHECK_INCLUDE_FILE("linux/futex.h" HAVE_FUTEX_H)
314
315 CHECK_FUNCTION_EXISTS(backtrace HAVE_BACKTRACE)
316 CHECK_FUNCTION_EXISTS(dlfunc HAVE_DLFUNC)
317 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
318 CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
319 CHECK_FUNCTION_EXISTS(getdtablesize HAVE_GETDTABLESIZE)
320 CHECK_FUNCTION_EXISTS(sysconf HAVE_SYSCONF)
321 CHECK_FUNCTION_EXISTS(popen HAVE_POPEN)
322 CHECK_FUNCTION_EXISTS(process_vm_readv HAVE_PROCESS_VM_READV)
323 CHECK_FUNCTION_EXISTS(mmap HAVE_MMAP)
324 CHECK_FUNCTION_EXISTS(mremap HAVE_MREMAP)
325
326 CHECK_SYMBOL_EXISTS(vasprintf stdio.h HAVE_VASPRINTF)
327 if(MINGW)
328   # The detection of vasprintf fails on MinGW, assumingly because it's
329   # defined as an inline function in stdio.h instead of a regular
330   # function. So force the result to be 1 despite of the test.
331   set(HAVE_VASPRINTF 1)
332 endif()
333
334 #Check if __thread is defined
335 execute_process(
336   COMMAND "${CMAKE_C_COMPILER} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_thread_storage.c -o testprog"
337   WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
338   RESULT_VARIABLE HAVE_thread_storage_run)
339 file(REMOVE testprog)
340 if(HAVE_thread_storage_run)
341   set(HAVE_THREAD_LOCAL_STORAGE 1)
342 else()
343   set(HAVE_THREAD_LOCAL_STORAGE 0)
344 endif()
345
346 CHECK_INCLUDE_FILE("sys/sendfile.h" HAVE_SENDFILE_H)
347 CHECK_FUNCTION_EXISTS(sendfile HAVE_SENDFILE)
348 if(HAVE_SENDFILE_H AND HAVE_SENDFILE)
349   set(HAVE_SENDFILE 1)
350 else()
351   set(HAVE_SENDFILE 0)
352 endif()
353
354 if(enable_model-checking AND NOT "${CMAKE_SYSTEM}" MATCHES "Linux|FreeBSD")
355   message(WARNING "Support for model-checking has not been enabled on ${CMAKE_SYSTEM}: disabling it")
356   set(enable_model-checking FALSE)
357 endif()
358
359 if(HAVE_MMAP AND HAVE_THREAD_LOCAL_STORAGE)
360   SET(HAVE_MMALLOC 1)
361 else()
362   SET(HAVE_MMALLOC 0)
363   if(enable_model-checking)
364     message(STATUS "Warning: support for model-checking has been disabled because you are missing either mmap or __thread.")
365   endif()
366   SET(enable_model-checking 0)
367 endif()
368
369 if(enable_jedule)
370   set(SIMGRID_HAVE_JEDULE 1)
371 else()
372   set(SIMGRID_HAVE_JEDULE 0)
373 endif()
374
375 if(enable_mallocators)
376   SET(SIMGRID_HAVE_MALLOCATOR 1)
377 else()
378   SET(SIMGRID_HAVE_MALLOCATOR 0)
379 endif()
380
381 include(FindLibunwind)
382 if(HAVE_LIBUNWIND)
383   if(NOT APPLE)
384     SET(SIMGRID_DEP "${SIMGRID_DEP} -lunwind")
385   else()
386     # Apple forbids to link directly against its libunwind implementation
387     # So let's comply and link against the System framework
388     SET(SIMGRID_DEP "${SIMGRID_DEP} -lSystem")
389   endif()
390   if("${CMAKE_SYSTEM}" MATCHES "Linux|FreeBSD")
391     set(SIMGRID_DEP "${SIMGRID_DEP} -lunwind-ptrace")
392     # This supposes that the host machine is either an AMD or a X86.
393     # This is deeply wrong, and should be fixed by manually loading -lunwind-PLAT (FIXME)
394     if(SIMGRID_PROCESSOR_x86_64)
395       SET(SIMGRID_DEP "${SIMGRID_DEP} -lunwind-x86_64")
396     else()
397       SET(SIMGRID_DEP "${SIMGRID_DEP} -lunwind-x86")
398     endif()
399   endif()
400 else()
401   if(enable_model-checking)
402     message(FATAL_ERROR "Please install libunwind-dev libdw-dev libevent-dev if you want to compile the SimGrid model checker.")
403   endif()
404 endif()
405
406 if(enable_model-checking)
407   find_package(Libdw REQUIRED)
408   find_package(Libevent REQUIRED)
409   include_directories(${LIBDW_INCLUDE_DIR} ${LIBEVENT_INCLUDE_DIR})
410   set(SIMGRID_DEP "${SIMGRID_DEP} ${LIBEVENT_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("-- Support for thread context factory ok.")
569 endif()
570
571 set(HAVE_UCONTEXT_CONTEXTS 0)
572 if(NOT HAVE_UCONTEXT_H)
573   message("-- No ucontext factory: <ucontext.h> not found.")
574 elseif(APPLE)
575   message("-- No ucontext factory: Apple don't want us to use them.")
576   set(HAVE_UCONTEXT_H 0)
577 else()
578   try_compile(compile_makecontext ${CMAKE_BINARY_DIR} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_makecontext.c
579     OUTPUT_VARIABLE compile_makecontext_output)
580
581   #If can have both context
582   if(compile_makecontext)
583     set(HAVE_UCONTEXT_CONTEXTS 1)
584     message("-- Support for ucontext factory ok.")
585   else()
586     message("-- Error: <ucontext.h> exists, but makecontext is not compilable. Compilation output:\n ${compile_makecontext_output}")
587     message("-- No ucontext factory: makecontext() is not compilable.")
588   endif()
589
590   # Stack setup (size and address)
591   try_run(RUN_makecontext_VAR COMPILE_makecontext_VAR
592     ${CMAKE_BINARY_DIR} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_stacksetup.c
593     RUN_OUTPUT_VARIABLE stack_setup)
594
595   LIST(LENGTH stack_setup stack_setup_len)
596   if("${stack_setup_len}" STREQUAL "2")
597     LIST(GET stack_setup 0 makecontext_addr)
598     LIST(GET stack_setup 1 makecontext_size)
599     set(sg_makecontext_stack_addr "#define sg_makecontext_stack_addr(skaddr) (${makecontext_addr})")
600     set(sg_makecontext_stack_size "#define sg_makecontext_stack_size(sksize) (${makecontext_size})")
601   else()
602     message(FATAL_ERROR "Could not figure out the stack setup. Compil: ${RUN_makecontext_VAR}. Exec: ${COMPILE_makecontext_VAR}. Output: ${stack_setup}")
603   endif()
604 endif()
605
606 # Stack growth direction (upward or downward). Used for the following contexts: SysV, raw, Boost
607 try_run(RUN_stackgrowth_VAR COMPILE_stackgrowth_VAR
608   ${CMAKE_BINARY_DIR}
609   ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_stackgrowth.c
610   RUN_OUTPUT_VARIABLE stack
611   COPY_FILE test_stackgrowth)
612
613 if("${stack}" STREQUAL "down")
614   set(PTH_STACKGROWTH "-1")
615 elseif("${stack}" STREQUAL "up")
616   set(PTH_STACKGROWTH "1")
617 else()
618   if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64")
619     set(PTH_STACKGROWTH "-1")
620   elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i686")
621     set(PTH_STACKGROWTH "-1")
622   else()
623     message(FATAL_ERROR "Could not figure out the stack direction. Test prog returned: ${stack}; CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}.")
624   endif()
625 endif()
626 # If the test ran well, remove the test binary
627 file(REMOVE test_stackgrowth)
628 #--------------------------------------------------------------------------------------------------
629
630 ### check for addr2line
631 find_path(ADDR2LINE NAMES addr2line     PATHS NO_DEFAULT_PATHS)
632 if(ADDR2LINE)
633   set(ADDR2LINE "${ADDR2LINE}/addr2line")
634 endif()
635
636 ###############
637 ## GIT version check
638 ##
639 if(EXISTS ${CMAKE_HOME_DIRECTORY}/.git/)
640   execute_process(
641      COMMAND git remote
642      COMMAND head -n 1
643      WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git/
644      OUTPUT_VARIABLE remote
645      OUTPUT_STRIP_TRAILING_WHITESPACE)
646   #message(STATUS "Git remote: ${remote}")
647   execute_process(COMMAND git config --get remote.${remote}.url
648      WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git/
649      OUTPUT_VARIABLE url
650      OUTPUT_STRIP_TRAILING_WHITESPACE)
651   #message(STATUS "Git url: ${url}")
652   if(url)
653     execute_process(COMMAND git --git-dir=${CMAKE_HOME_DIRECTORY}/.git log --pretty=oneline --abbrev-commit -1
654        WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git/
655        OUTPUT_VARIABLE GIT_VERSION
656        OUTPUT_STRIP_TRAILING_WHITESPACE)
657     message(STATUS "Git version: ${GIT_VERSION}")
658
659     execute_process(COMMAND git --git-dir=${CMAKE_HOME_DIRECTORY}/.git log -n 1 --pretty=format:%ai .
660        WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git/
661        OUTPUT_VARIABLE GIT_DATE 
662        OUTPUT_STRIP_TRAILING_WHITESPACE)
663     message(STATUS "Git date: ${GIT_DATE}")
664     string(REGEX REPLACE " .*" "" GIT_VERSION "${GIT_VERSION}")
665
666     execute_process(COMMAND git --git-dir=${CMAKE_HOME_DIRECTORY}/.git log --pretty=format:%H -1
667        WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git/
668        OUTPUT_VARIABLE SIMGRID_GITHASH
669        OUTPUT_STRIP_TRAILING_WHITESPACE)
670   endif()
671 elseif(EXISTS ${CMAKE_HOME_DIRECTORY}/.gitversion)
672   FILE(STRINGS ${CMAKE_HOME_DIRECTORY}/.gitversion GIT_VERSION)
673 else()
674   set(GIT_VERSION "none, release version")
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 foreach(script cc cxx ff f90 run)
707   configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpi${script}.in ${CMAKE_BINARY_DIR}/bin/smpi${script} @ONLY)
708 endforeach()
709
710 ### SMPI scripts used when compiling simgrid 
711 set(exec_prefix "${CMAKE_BINARY_DIR}/smpi_script/")
712 set(includeflag "-I${CMAKE_HOME_DIRECTORY}/include -I${CMAKE_HOME_DIRECTORY}/include/smpi")
713 set(includeflag "${includeflag} -I${CMAKE_BINARY_DIR}/include -I${CMAKE_BINARY_DIR}/include/smpi")
714 set(includedir "${CMAKE_HOME_DIRECTORY}/include")
715 set(libdir "${CMAKE_BINARY_DIR}/lib")
716 set(CMAKE_SMPI_COMMAND "export LD_LIBRARY_PATH=\"${CMAKE_BINARY_DIR}/lib")
717 if(NS3_LIBRARY_PATH)
718   set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}:${NS3_LIBRARY_PATH}")
719 endif()
720 set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}:\${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}\"")
721 set(SMPIMAIN ${CMAKE_BINARY_DIR}/bin/smpimain)
722
723 foreach(script cc cxx ff f90 run)
724   configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpi${script}.in ${CMAKE_BINARY_DIR}/smpi_script/bin/smpi${script} @ONLY)
725 endforeach()
726
727 if(NOT WIN32)
728   foreach(script cc cxx ff f90 run)
729     execute_process(COMMAND chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpi${script})
730     execute_process(COMMAND chmod a=rwx ${CMAKE_BINARY_DIR}/smpi_script/bin/smpi${script})
731   endforeach()
732 endif()
733
734 set(generated_headers_to_install
735   ${CMAKE_CURRENT_BINARY_DIR}/include/smpi/mpif.h
736   ${CMAKE_CURRENT_BINARY_DIR}/include/simgrid_config.h
737   )
738
739 set(generated_headers  ${CMAKE_CURRENT_BINARY_DIR}/src/internal_config.h )
740
741 set(generated_files_to_clean
742   ${generated_headers}
743   ${generated_headers_to_install}
744   ${CMAKE_BINARY_DIR}/bin/smpicc
745   ${CMAKE_BINARY_DIR}/bin/smpicxx
746   ${CMAKE_BINARY_DIR}/bin/smpiff
747   ${CMAKE_BINARY_DIR}/bin/smpif90
748   ${CMAKE_BINARY_DIR}/bin/smpirun
749   ${CMAKE_BINARY_DIR}/bin/colorize
750   ${CMAKE_BINARY_DIR}/bin/simgrid_update_xml
751   ${CMAKE_BINARY_DIR}/examples/smpi/tracing/smpi_traced.trace
752   )
753
754 if(NOT "${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_HOME_DIRECTORY}")
755   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions0.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions0.txt COPYONLY)
756   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions1.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions1.txt COPYONLY)
757   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_allReduce.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allReduce.txt COPYONLY)
758   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_barrier.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_barrier.txt COPYONLY)
759   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_bcast.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_bcast.txt COPYONLY)
760   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_with_isend.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_with_isend.txt COPYONLY)
761   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_alltoall.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_alltoall.txt COPYONLY)
762   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_alltoallv.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_alltoallv.txt COPYONLY)
763   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_waitall.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_waitall.txt COPYONLY)
764   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_reducescatter.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_reducescatter.txt COPYONLY)
765   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_gather.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_gather.txt COPYONLY)
766   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_allgatherv.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allgatherv.txt COPYONLY)
767   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile COPYONLY)
768
769   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/description_file ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/description_file COPYONLY)
770   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/README ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/README COPYONLY)
771   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/smpi_replay.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/smpi_replay.txt COPYONLY)
772   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)
773   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)
774   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)
775   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)
776   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)
777   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)
778   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)
779   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)
780   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)
781   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)
782   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)
783   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)
784   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)
785   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)
786   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)
787   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)
788   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)
789   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)
790   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)
791   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)
792   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)
793   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)
794   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)
795   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)
796   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)
797   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)
798   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)
799   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)
800   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)
801   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)
802   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)
803   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)
804
805   set(generated_files_to_clean
806     ${generated_files_to_clean}
807     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions0.txt
808     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions1.txt
809     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allReduce.txt
810     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_barrier.txt
811     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_bcast.txt
812     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_with_isend.txt
813     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_alltoall.txt
814     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_alltoallv.txt
815     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_waitall.txt
816     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_gather.txt
817     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allgatherv.txt
818     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_reducescatter.txt
819     ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile
820     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/description_file
821     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/README
822     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/smpi_replay.txt
823     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace0.txt
824     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace1.txt
825     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace2.txt
826     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace3.txt
827     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace4.txt
828     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace5.txt
829     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace6.txt
830     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace7.txt
831     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace8.txt
832     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace9.txt
833     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace10.txt
834     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace11.txt
835     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace12.txt
836     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace13.txt
837     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace14.txt
838     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace15.txt
839     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace16.txt
840     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace17.txt
841     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace18.txt
842     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace19.txt
843     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace20.txt
844     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace21.txt
845     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace22.txt
846     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace23.txt
847     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace24.txt
848     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace25.txt
849     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace26.txt
850     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace27.txt
851     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace28.txt
852     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace29.txt
853     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace30.txt
854     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace31.txt
855     )
856 endif()
857
858 SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES
859   "${generated_files_to_clean}")
860
861 ### Define source packages for Libs
862 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/DefinePackages.cmake)
863
864 ### Build some Maintainer files
865 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/MaintainerMode.cmake)
866 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/UnitTesting.cmake)
867
868 ### Setup gcc & clang flags
869 if (NOT MSVC)
870   include(${CMAKE_HOME_DIRECTORY}/tools/cmake/GCCFlags.cmake)
871 endif()
872
873 ### Make Libs
874 if(NOT WIN32)
875   include(${CMAKE_HOME_DIRECTORY}/tools/cmake/MakeLib.cmake)
876 else()
877   include(${CMAKE_HOME_DIRECTORY}/tools/cmake/MakeLibWin.cmake)
878 endif()
879
880 if(enable_java)
881   include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Java.cmake)
882 endif()
883
884 ### Make tests
885 if(enable_memcheck_xml)
886   set(enable_memcheck true)
887 endif()
888
889 INCLUDE(CTest)
890 ENABLE_TESTING()
891 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Tests.cmake)
892 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/CTestConfig.cmake)
893
894 ### Define subdirectories
895 foreach(cmakefile ${CMAKEFILES_TXT})
896   string(REPLACE "/CMakeLists.txt" "" repository ${cmakefile})
897   add_subdirectory("${CMAKE_HOME_DIRECTORY}/${repository}")
898 endforeach()
899
900 ### Setup the distrib
901 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Distrib.cmake)
902
903 ### Build the docs if asked to
904 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Documentation.cmake)
905
906 ### Print the result of configuration
907 message("")
908 message("##########################################")
909 message("#### Content of src/internal_config.h ####")
910 message("##########################################")
911 file(STRINGS ${CMAKE_CURRENT_BINARY_DIR}/src/internal_config.h config_output)
912 LIST(REMOVE_AT config_output 0 1 2 3 4 5 6 7 8 9 10) # Pass the file header
913 foreach(line ${config_output})
914   message("   ${line}")
915 endforeach()
916 message("##########################################")
917 message("####   Content of simgrid_config.h    ####")
918 message("##########################################")
919 file(STRINGS ${CMAKE_CURRENT_BINARY_DIR}/include/simgrid_config.h config_output)
920 LIST(REMOVE_AT config_output 0 1 2 3 4 5 6 7 8 9 -1) # Pass the file header
921 foreach(line ${config_output})
922   message("   ${line}")
923 endforeach()
924 message("##########################################")
925 message("####   End of configuration headers   ####")
926 message("##########################################")
927
928 message("\nConfiguration of package `simgrid':")
929 message("        Home directory ..............: ${CMAKE_HOME_DIRECTORY}")
930 message("        Build Name ..................: ${BUILDNAME}")
931 message("        Cmake Generator .............: ${CMAKE_GENERATOR}")
932 message("        Site ........................: ${SITE}")
933 message("        Install prefix ..............: ${CMAKE_INSTALL_PREFIX}")
934 if(release)
935   message("        Release .....................: simgrid-${release_version}${SIMGRID_VERSION_EXTRA} (release build)")
936 else()
937   message("        Release .....................: simgrid-${release_version}${SIMGRID_VERSION_EXTRA} (development build)")
938 endif()
939 message("")
940 message("        Compiler: C .................: ${CMAKE_C_COMPILER} (id: ${CMAKE_C_COMPILER_ID})")
941 message("                version .............: ${CMAKE_C_COMPILER_VERSION}")
942 message("                is gnu ..............: ${CMAKE_COMPILER_IS_GNUCC}")
943 message("        Compiler: C++ ...............: ${CMAKE_CXX_COMPILER} (id: ${CMAKE_CXX_COMPILER_ID})")
944 message("                version .............: ${CMAKE_CXX_COMPILER_VERSION}")
945 if(${Java_FOUND})
946   message("        Compiler: Javac .............: ${Java_JAVAC_EXECUTABLE}")
947   message("                version .............: ${Java_VERSION_STRING}")
948 if(${SWIG_FOUND})
949   message("                SWIG ................: Version ${SWIG_VERSION} found.")
950 else()
951   message("                SWIG ................: Missing.")
952 endif()
953 endif()
954 if(CMAKE_Fortran_COMPILER)
955   message("        Compiler: Fortran ...........: ${SMPI_Fortran_COMPILER} (id: ${CMAKE_Fortran_COMPILER_ID})")
956   message("                version .............: ${CMAKE_Fortran_COMPILER_VERSION}")
957 endif()
958 message("        Linker: .....................: ${CMAKE_LINKER}")
959 message("                version .............: ${LINKER_VERSION}")
960 message("        Make program: ...............: ${CMAKE_MAKE_PROGRAM}")
961 message("")
962 message("        CFlags ......................: ${CMAKE_C_FLAGS}")
963 message("        CXXFlags ....................: ${CMAKE_CXX_FLAGS}")
964 message("        LDFlags .....................: ${CMAKE_C_LINK_FLAGS}")
965 message("        with LTO ....................: ${enable_lto}")
966 message("")
967
968 if (SIMGRID_HAVE_NS3)
969   message("        Compile NS-3 ................: yes (path: ${NS3_PATH})")
970 else()
971   message("        Compile NS-3 ................: NO  (hint: ${NS3_HINT})")
972 endif()
973
974 if (${Java_FOUND})
975   message("        Compile Java ................: yes")
976   message("          Native lib in jar .........: ${enable_lib_in_jar}")
977 else()
978   message("        Compile Java ................: NO")
979 endif()
980 message("        Compile Lua .................: ${SIMGRID_HAVE_LUA}")
981 message("        Compile Smpi ................: ${HAVE_SMPI}")
982 message("          Smpi fortran ..............: ${SMPI_FORTRAN}")
983 message("          MPICH3 testsuite ..........: ${enable_smpi_MPICH3_testsuite}")
984 message("          Privatization .............: ${HAVE_PRIVATIZATION}")
985 message("          PAPI support...............: ${HAVE_PAPI}")
986 message("        Compile Boost.Context support: ${HAVE_BOOST_CONTEXTS}")
987 message("")
988 message("        Maintainer mode .............: ${enable_maintainer_mode}")
989 message("        Documentation................: ${enable_documentation}")
990 message("        Model checking ..............: ${SIMGRID_HAVE_MC}")
991 message("        Jedule  mode ................: ${SIMGRID_HAVE_JEDULE}")
992 message("        Graphviz mode ...............: ${HAVE_GRAPHVIZ}")
993 message("        Mallocators .................: ${enable_mallocators}")
994 message("")
995 message("        Simgrid dependencies ........: ${SIMGRID_DEP}")
996 message("")
997
998 execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/Testing/Notes/)
999 file(WRITE ${PROJECT_BINARY_DIR}/Testing/Notes/Build  "GIT version : ${GIT_VERSION}\n")
1000 file(APPEND ${PROJECT_BINARY_DIR}/Testing/Notes/Build "Release     : simgrid-${release_version}\n")
1001
1002 INCLUDE(Dart)