Logo AND Algorithmique Numérique Distribuée

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