Logo AND Algorithmique Numérique Distribuée

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