Logo AND Algorithmique Numérique Distribuée

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