Logo AND Algorithmique Numérique Distribuée

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