Logo AND Algorithmique Numérique Distribuée

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