Logo AND Algorithmique Numérique Distribuée

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