Logo AND Algorithmique Numérique Distribuée

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