Logo AND Algorithmique Numérique Distribuée

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