X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/a2edf8c05c4c543c8926cb454d2fb66cb5e8a0d8..af537f85d61a303b8f2c0b0707fbb3116dca2126:/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 14db0b4bab..34d5caa427 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8.8) +cmake_minimum_required(VERSION 3.5) message(STATUS "Cmake version ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_HOME_DIRECTORY}/tools/cmake/Modules) @@ -15,81 +15,75 @@ endif() ## ## Check the C/C++ standard that we need -## See also tools/cmake/GCCFlags.cmake that sets our paranoid warning flags -if (MSVC) - message("-- You are compiling SimGrid with MicroSoft Visual C. Good luck.") - - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_SCL_SECURE_NO_WARNINGS") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_SCL_SECURE_NO_WARNINGS") -else() # gcc or clang - INCLUDE(CheckCCompilerFlag) - CHECK_C_COMPILER_FLAG(-fstack-cleaner HAVE_C_STACK_CLEANER) - - ## Request full debugging flags - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g3") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3") - set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -g") - - if (CMAKE_COMPILER_IS_GNUCC) - if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.7") - message(FATAL_ERROR - "SimGrid needs at least g++ version 4.7 to compile but you have ${CMAKE_CXX_COMPILER_VERSION}." - "You need a sufficient support of c++11 to compile SimGrid.") - endif() +## See also tools/cmake/Flags.cmake that sets our paranoid warning flags +INCLUDE(CheckCCompilerFlag) +CHECK_C_COMPILER_FLAG(-fstack-cleaner HAVE_C_STACK_CLEANER) + +## Request full debugging flags +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g3") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3") +set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -g") + +if (CMAKE_COMPILER_IS_GNUCC) + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.7") + message(FATAL_ERROR + "SimGrid needs at least g++ version 4.7 to compile but you have ${CMAKE_CXX_COMPILER_VERSION}." + "You need a sufficient support of c++11 to compile SimGrid.") endif() +endif() - ## We need a decent support of the c++11 standard - include(CheckCXXCompilerFlag) - CHECK_CXX_COMPILER_FLAG("-std=gnu++11" COMPILER_SUPPORTS_CXX11) - if(COMPILER_SUPPORTS_CXX11) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11") - else() - message(FATAL_ERROR - "The compiler ${CMAKE_CXX_COMPILER} (v${CMAKE_CXX_COMPILER_VERSION}) has no C++11 support. " - "Please use a decent C++ compiler.") - endif() +## We need a decent support of the C++11 and C11 standards +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) - ### And we need C11 standard, too - include(CheckCCompilerFlag) - CHECK_C_COMPILER_FLAG("-std=gnu11" COMPILER_SUPPORTS_C11) - if(COMPILER_SUPPORTS_C11) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11") - else() - message(FATAL_ERROR - "The compiler ${CMAKE_C_COMPILER} (v${CMAKE_C_COMPILER_VERSION}) has no C11 support. " - "Please use a decent C compiler " - "(note that c++11 support of ${CMAKE_CXX_COMPILER} seems ok).") - endif() - if(APPLE AND (CMAKE_C_COMPILER_VERSION VERSION_LESS "4.6")) - ### gcc 4.[1-5] cannot compile ucontext on OSX - message(STATUS "Ucontext can't be used with this version of gcc (must be greater than 4.5)") - set(HAVE_UCONTEXT_H 0) - endif() -endif() # NOT MSVC +set(CMAKE_C_STANDARD 11) +set(CMAKE_C_STANDARD_REQUIRED ON) + +if (CMAKE_C_COMPILER_ID STREQUAL "Intel" AND CMAKE_C11_EXTENSION_COMPILE_OPTION STREQUAL "-std=c11") + set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=gnu11") +endif() + +### Check threading support +set(CMAKE_THREAD_PREFER_PTHREAD TRUE) +find_package(Threads) + +### Setup Options +include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Option.cmake) ### SMPI vs. Fortran -if ((NOT DEFINED enable_smpi OR enable_smpi) AND NOT APPLE) # smpi is enabled by default - # Call enable_language(Fortran) in order to load the build rules for - # this language, needed by teshsuite/smpi/mpich-test/. Use - # CMAKE_FORCE_Fortran_COMPILER to bypass checks for a working - # compiler (smpiff don't exist at configure time). - include(CMakeForceCompiler) - if(NOT COMMAND CMAKE_FORCE_Fortran_COMPILER) - MACRO(CMAKE_FORCE_Fortran_COMPILER compiler id) - SET(CMAKE_Fortran_COMPILER "${compiler}") - SET(CMAKE_Fortran_COMPILER_ID_RUN TRUE) - SET(CMAKE_Fortran_COMPILER_ID ${id}) - SET(CMAKE_Fortran_COMPILER_WORKS TRUE) - SET(CMAKE_Fortran_COMPILER_FORCED TRUE) - - # Set old compiler id variables. - IF("${CMAKE_Fortran_COMPILER_ID}" MATCHES "GNU") - SET(CMAKE_COMPILER_IS_GNUG77 1) - ENDIF("${CMAKE_Fortran_COMPILER_ID}" MATCHES "GNU") - ENDMACRO(CMAKE_FORCE_Fortran_COMPILER) +if ((NOT DEFINED enable_smpi) OR enable_smpi) + # First unset the compiler in case we're re-running cmake over a previous + # configuration where it was saved as smpiff + unset(CMAKE_Fortran_COMPILER) + + SET(SMPI_FORTRAN 0) + if(enable_fortran) + enable_language(Fortran OPTIONAL) endif() - CMAKE_FORCE_Fortran_COMPILER(smpiff smpiff) - enable_language(Fortran OPTIONAL) + + if(CMAKE_Fortran_COMPILER) + + # Fortran compiler detected: save it, then replace by smpiff + set(SMPI_Fortran_COMPILER "${CMAKE_Fortran_COMPILER}" CACHE FILEPATH "The real Fortran compiler") + + # Set flags/libs to be used in smpiff + if(CMAKE_Fortran_COMPILER_ID MATCHES "GNU") + set(SMPI_Fortran_FLAGS "\"-fpic\" \"-ff2c\" \"-fno-second-underscore\"") + set(SMPI_Fortran_LIBS "\"-lgfortran\"") + set(SMPI_GFORTRAN 1) + elseif(CMAKE_Fortran_COMPILER_ID MATCHES "Intel") + set(SMPI_Fortran_FLAGS "\"-fPIC\" \"-nofor-main\"") + set(SMPI_Fortran_LIBS "\"-lifcore\"") + set(SMPI_IFORT 1) + elseif(CMAKE_Fortran_COMPILER_ID MATCHES "PGI|Flang") # flang + set(SMPI_Fortran_FLAGS "\"-fPIC\"") + set(SMPI_Fortran_LIBS "") + set(SMPI_FLANG 1) + endif() + + set(SMPI_FORTRAN 1) + endif(CMAKE_Fortran_COMPILER) + endif() #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# @@ -97,11 +91,11 @@ endif() #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# set(SIMGRID_VERSION_MAJOR "3") -set(SIMGRID_VERSION_MINOR "13") -set(SIMGRID_VERSION_PATCH "0") -set(SIMGRID_VERSION_EXTRA "-devel") # Extra words to add to version string (e.g. -rc1) +set(SIMGRID_VERSION_MINOR "22") +set(SIMGRID_VERSION_PATCH "90") +set(SIMGRID_VERSION_EXTRA "-DEVEL") # Extra words to add to version string (e.g. -rc1) -set(SIMGRID_VERSION_DATE "2016") # Year for copyright information +set(SIMGRID_VERSION_DATE "2019") # Year for copyright information if(${SIMGRID_VERSION_PATCH} EQUAL "0") set(release_version "${SIMGRID_VERSION_MAJOR}.${SIMGRID_VERSION_MINOR}") @@ -110,29 +104,21 @@ else() endif() set(SIMGRID_VERSION_STRING "SimGrid version ${release_version}${SIMGRID_VERSION_EXTRA}") -set(SIMGRID_VERSION_BANNER "SIMGRID_VERSION_STRING\\nCopyright (c) 2004-${SIMGRID_VERSION_DATE}. The Simgrid Team.") -if(release) - set(SIMGRID_VERSION_BANNER "${SIMGRID_VERSION_BANNER}\\nRelease build") -else() - set(SIMGRID_VERSION_BANNER "${SIMGRID_VERSION_BANNER}\\nDevelopment build") -endif() set(libsimgrid_version "${release_version}") set(libsimgrid-java_version "${release_version}") ### SET THE LIBRARY EXTENSION -if(APPLE) #MAC +if(APPLE) set(LIB_EXE "dylib") +elseif(WIN32) + set(LIB_EXE "a") + set(BIN_EXE ".exe") else() - if(WIN32) #WINDOWS - set(LIB_EXE "a") - set(BIN_EXE ".exe") - else() #UNIX - set(LIB_EXE "so") - endif() + set(LIB_EXE "so") endif() -exec_program("${CMAKE_LINKER} --version" OUTPUT_VARIABLE "LINKER_VERSION") +execute_process(COMMAND ${CMAKE_LINKER} -version OUTPUT_VARIABLE LINKER_VERSION ERROR_VARIABLE LINKER_VERSION) string(REGEX MATCH "[0-9].[0-9]*" LINKER_VERSION "${LINKER_VERSION}") ### Find programs and paths @@ -142,64 +128,73 @@ if(NOT PERL_FOUND) message(FATAL_ERROR "Please install Perl to compile SimGrid.") endif() -if (APPLE) - set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") - set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) +# tesh.py needs python 3 (or the module python-subprocess32 on python2.8+) +set(PythonInterp_FIND_VERSION 3) +set(PythonInterp_FIND_VERSION_COUNT 1) +set(PythonInterp_FIND_VERSION_MAJOR 3) +include(FindPythonInterp) +if(NOT PYTHONINTERP_FOUND) + message(FATAL_ERROR "Please install Python (version 3 or higher) to compile SimGrid.") endif() + SET(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib) ### Compute the include paths -set(INCLUDES + +# Only include public headers by default +include_directories( + ${CMAKE_BINARY_DIR}/include + ${CMAKE_HOME_DIRECTORY}/include +) + +# Compute the ones that should be added when compiling the library +set(INTERNAL_INCLUDES + ${CMAKE_BINARY_DIR} ${CMAKE_HOME_DIRECTORY} - ${CMAKE_HOME_DIRECTORY}/include ${CMAKE_HOME_DIRECTORY}/src/include - ${CMAKE_BINARY_DIR} - ${CMAKE_BINARY_DIR}/include ) -if(NOT CMAKE_CROSSCOMPILING AND EXISTS /usr/include/) - set(INCLUDES ${INCLUDES} /usr/include/) +if(enable_smpi) + set (INTERNAL_INCLUDES ${INTERNAL_INCLUDES} ${CMAKE_HOME_DIRECTORY}/src/smpi/include) endif() -### Check 32bits or 64bits -IF(CMAKE_SIZEOF_VOID_P EQUAL 4) - SET(ARCH_32_BITS 1) -ELSE() - SET(ARCH_32_BITS 0) -ENDIF() +if(NOT CMAKE_CROSSCOMPILING AND EXISTS /usr/include/) + set(INTERNAL_INCLUDES ${INTERNAL_INCLUDES} /usr/include/) +endif() if(WIN32) - set(CMAKE_INCLUDE_WIN "${CMAKE_C_COMPILER}") set(CMAKE_LIB_WIN "${CMAKE_C_COMPILER}") string(REGEX REPLACE "/bin/gcc.*" "/include" CMAKE_INCLUDE_WIN "${CMAKE_INCLUDE_WIN}") string(REGEX REPLACE "/bin/gcc.*" "/lib" CMAKE_LIB_WIN "${CMAKE_LIB_WIN}") - set(INCLUDES ${INCLUDES} ${CMAKE_INCLUDE_WIN}) + set(INTERNAL_INCLUDES ${INTERNAL_INCLUDES} ${CMAKE_INCLUDE_WIN}) unset(CMAKE_INCLUDE_WIN) - endif() -include_directories(${INCLUDES}) - -### Setup Options -include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Option.cmake) +# library dependency cannot start with a space (CMP0004), so initialize it with something that is never desactivated. +set(SIMGRID_DEP "-lm") ### Determine the assembly flavor that we need today +set(HAVE_RAW_CONTEXTS 0) include(CMakeDetermineSystem) IF(CMAKE_SYSTEM_PROCESSOR MATCHES ".86|AMD64|amd64") - IF(${ARCH_32_BITS}) + IF(CMAKE_SIZEOF_VOID_P EQUAL 4) # 32 bits message(STATUS "System processor: i686 (${CMAKE_SYSTEM_PROCESSOR}, 32 bits)") - set(PROCESSOR_i686 1) + set(SIMGRID_PROCESSOR_i686 1) + set(SIMGRID_PROCESSOR_x86_64 0) ELSE() message(STATUS "System processor: x86_64 (${CMAKE_SYSTEM_PROCESSOR}, 64 bits)") - set(PROCESSOR_x86_64 1) + set(SIMGRID_PROCESSOR_i686 0) + set(SIMGRID_PROCESSOR_x86_64 1) ENDIF() if (WIN32) - message(STATUS "Disable fast raw contextes on Windows.") + message(STATUS "Disable fast raw contexts on Windows.") else() set(HAVE_RAW_CONTEXTS 1) endif() - +ELSE() + set(SIMGRID_PROCESSOR_i686 0) + set(SIMGRID_PROCESSOR_x86_64 0) ENDIF() include(CheckFunctionExists) @@ -211,17 +206,21 @@ include(CheckSymbolExists) set(HAVE_GRAPHVIZ 0) include(FindGraphviz) -include(FindLibSigc++) -set(HAVE_LUA 0) +set(SIMGRID_HAVE_LUA 0) if(enable_lua) include(FindLuaSimgrid) endif() -set(HAVE_NS3 0) +set(SIMGRID_HAVE_NS3 0) if(enable_ns3) include(FindNS3) - if (NOT HAVE_NS3) + if (SIMGRID_HAVE_NS3) + set(SIMGRID_HAVE_NS3 1) + foreach(lib core csma point-to-point internet network applications) + set(SIMGRID_DEP "${SIMGRID_DEP} -lns${NS3_VERSION}-${lib}${NS3_SUFFIX}") + endforeach() + else() message(FATAL_ERROR "Cannot find NS3. Please install it (apt-get install ns3 libns3-dev) or disable that cmake option") endif() endif() @@ -230,46 +229,62 @@ if(WIN32) set(Boost_USE_STATIC_LIBS 1) endif() +set(HAVE_PAPI 0) +if(enable_smpi_papi) + include(FindPAPI) + if (NOT HAVE_PAPI) + message(FATAL_ERROR "Cannot find PAPI. Please install it (apt-get install papi-tools libpapi-dev) or disable PAPI bindings.") + endif() +endif() + +# But we do need the core of Boost find_package(Boost 1.48) if(Boost_FOUND) include_directories(${Boost_INCLUDE_DIRS}) else() if(APPLE) - message(FATAL_ERROR "Failed to find Boost libraries (Try to install them with 'sudo fink install boost1.53.nopython')") + 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'") else() - message(FATAL_ERROR "Failed to find Boost libraries." - "Did you install libboost-dev and libboost-context-dev?" - "(libboost-context-dev is optional)") + message(FATAL_ERROR "Boost libraries not found. Install libboost-dev (>= 1.48.0).") endif() endif() -# Try again to see if we have libboost-context -find_package(Boost 1.42 COMPONENTS context) -set(Boost_FOUND 1) # We don't care of whether this component is missing +# cmake before 3.13.1 does not know about stacktrace components. Fix it. +# Usable components: https://www.boost.org/doc/libs/1_65_1/doc/html/stacktrace/configuration_and_build.html +set(_Boost_STACKTRACE_HEADERS "boost/stacktrace.hpp") +set(_Boost_STACKTRACE_BACKTRACE_HEADERS "boost/stacktrace.hpp") -if(Boost_FOUND AND Boost_CONTEXT_FOUND) - # We should use feature detection for this instead: - if (Boost_VERSION LESS 105600) - message("Found Boost.Context API v1") +if(minimal_java) # When we want a minimal jarfile, don't even search for boost optional components + message(STATUS "Don't even look for boost optional components, as we build a minimal jar file") +else() + find_package(Boost 1.59 COMPONENTS context stacktrace_backtrace) + set(Boost_FOUND 1) # These components are optionals + message(STATUS "Mandatory components found. SimGrid is compilable.") + message(STATUS "Looking for optional Boost components:") + + if (Boost_STACKTRACE_BACKTRACE_FOUND) + message (STATUS " stacktrace: found. Activating human-readable stack traces.") + set(HAVE_BOOST_STACKTRACE 1) + set(SIMGRID_DEP "${SIMGRID_DEP} -lboost_stacktrace_backtrace") + else() + message (STATUS " stacktrace: MISSING. Install libboost-stacktrace-dev to display the stacktraces.") + set(HAVE_BOOST_STACKTRACE 0) + endif() + + if(Boost_CONTEXT_FOUND) + message (STATUS " context: found. Activating Boost contexts.") set(HAVE_BOOST_CONTEXTS 1) else() - message("Found Boost.Context API v2") - set(HAVE_BOOST_CONTEXTS 2) + message (STATUS " context: MISSING. Install libboost-context-dev for this optional feature.") + set(HAVE_BOOST_CONTEXTS 0) endif() -else() - message (" boost : found.") - message (" boost-context: missing. Install libboost-context-dev for this optional feature.") - set(HAVE_BOOST_CONTEXTS 0) endif() + # Checks for header libraries functions. -CHECK_LIBRARY_EXISTS(execinfo backtrace "" HAVE_BACKTRACE_IN_LIBEXECINFO) CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_POSIX_GETTIME) - -CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_PTHREAD) -CHECK_LIBRARY_EXISTS(pthread sem_init "" HAVE_SEM_INIT_LIB) -CHECK_LIBRARY_EXISTS(pthread sem_open "" HAVE_SEM_OPEN_LIB) CHECK_LIBRARY_EXISTS(pthread pthread_setaffinity_np "" HAVE_PTHREAD_SETAFFINITY) +CHECK_INCLUDE_FILE("pthread_np.h" HAVE_PTHREAD_NP_H) # for pthread_setaffinity_np() on FreeBSD if(CMAKE_SYSTEM_NAME MATCHES "Darwin") set(CMAKE_REQUIRED_DEFINITIONS "-D_XOPEN_SOURCE=700 -D_DARWIN_C_SOURCE") @@ -281,256 +296,136 @@ else() set(CMAKE_REQUIRED_DEFINITIONS "-D_GNU_SOURCE") endif() -CHECK_INCLUDE_FILE("valgrind/valgrind.h" HAVE_VALGRIND_VALGRIND_H) +CHECK_INCLUDE_FILE("valgrind/valgrind.h" HAVE_VALGRIND_H) CHECK_INCLUDE_FILE("unistd.h" HAVE_UNISTD_H) -CHECK_INCLUDE_FILE("execinfo.h" HAVE_EXECINFO_H) CHECK_INCLUDE_FILE("signal.h" HAVE_SIGNAL_H) CHECK_INCLUDE_FILE("sys/param.h" HAVE_SYS_PARAM_H) CHECK_INCLUDE_FILE("sys/sysctl.h" HAVE_SYS_SYSCTL_H) CHECK_INCLUDE_FILE("ucontext.h" HAVE_UCONTEXT_H) CHECK_INCLUDE_FILE("linux/futex.h" HAVE_FUTEX_H) +CHECK_FUNCTION_EXISTS(dlfunc HAVE_DLFUNC) CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY) CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP) CHECK_FUNCTION_EXISTS(getdtablesize HAVE_GETDTABLESIZE) CHECK_FUNCTION_EXISTS(sysconf HAVE_SYSCONF) -CHECK_FUNCTION_EXISTS(popen HAVE_POPEN) CHECK_FUNCTION_EXISTS(process_vm_readv HAVE_PROCESS_VM_READV) CHECK_FUNCTION_EXISTS(mmap HAVE_MMAP) +CHECK_FUNCTION_EXISTS(mremap HAVE_MREMAP) CHECK_SYMBOL_EXISTS(vasprintf stdio.h HAVE_VASPRINTF) -if(MINGW) +if(MINGW) # The detection of vasprintf fails on MinGW, assumingly because it's # defined as an inline function in stdio.h instead of a regular # function. So force the result to be 1 despite of the test. set(HAVE_VASPRINTF 1) endif() - -#Check if __thread is defined -execute_process( - COMMAND "${CMAKE_C_COMPILER} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_thread_storage.c" - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - RESULT_VARIABLE HAVE_thread_storage_run - ) - -if(HAVE_thread_storage_run) - set(HAVE_THREAD_LOCAL_STORAGE 1) +CHECK_INCLUDE_FILE("sys/sendfile.h" HAVE_SENDFILE_H) +CHECK_FUNCTION_EXISTS(sendfile HAVE_SENDFILE) +if(HAVE_SENDFILE_H AND HAVE_SENDFILE) + set(SG_HAVE_SENDFILE 1) else() - set(HAVE_THREAD_LOCAL_STORAGE 0) + set(SG_HAVE_SENDFILE 0) endif() -# Our usage of mmap is Linux-specific (flag MAP_ANONYMOUS), but kFreeBSD uses a GNU libc -IF(HAVE_MMAP AND - NOT "${CMAKE_SYSTEM}" MATCHES "Linux" AND - NOT "${CMAKE_SYSTEM}" MATCHES "kFreeBSD" AND - NOT "${CMAKE_SYSTEM}" MATCHES "GNU" AND - NOT "${CMAKE_SYSTEM}" MATCHES "Darwin") - SET(HAVE_MMAP 0) - message(STATUS "Warning: MMAP is thought as non functional on this architecture (${CMAKE_SYSTEM})") -ENDIF() +if(enable_model-checking AND NOT "${CMAKE_SYSTEM}" MATCHES "Linux|FreeBSD") + message(WARNING "Support for model-checking has not been enabled on ${CMAKE_SYSTEM}: disabling it") + set(enable_model-checking FALSE) +endif() -if(HAVE_MMAP AND HAVE_THREAD_LOCAL_STORAGE) +if(HAVE_MMAP) SET(HAVE_MMALLOC 1) else() SET(HAVE_MMALLOC 0) + if(enable_model-checking) + message(STATUS "Warning: support for model-checking has been disabled because you are missing either mmap or __thread.") + endif() + SET(enable_model-checking 0) endif() -set(HAVE_UCONTEXT_CONTEXTS 0) -set(HAVE_THREAD_CONTEXTS 0) - if(enable_jedule) - set(HAVE_JEDULE 1) + set(SIMGRID_HAVE_JEDULE 1) +else() + set(SIMGRID_HAVE_JEDULE 0) endif() if(enable_mallocators) - SET(MALLOCATOR_IS_WANTED 1) + SET(SIMGRID_HAVE_MALLOCATOR 1) else() - SET(MALLOCATOR_IS_WANTED 0) + SET(SIMGRID_HAVE_MALLOCATOR 0) endif() -if(enable_model-checking AND HAVE_MMALLOC) - SET(HAVE_MC 1) - SET(MMALLOC_WANT_OVERRIDE_LEGACY 1) - include(FindLibunwind) - include(FindLibdw) -else() +if (minimal_java) + message(STATUS "Don't look for libunwind as we build a minimal jar file.") if(enable_model-checking) - message(STATUS "Warning: support for model-checking has been disabled because HAVE_MMALLOC is false") + message(FATAL_ERROR "You cannot enable model-checking and minimal_java at the same time.") + endif() +else() + include(FindLibunwind) + if(HAVE_LIBUNWIND) + SET(SIMGRID_DEP "${SIMGRID_DEP} ${LIBUNWIND_LIBRARIES}") + else() + if(enable_model-checking) + message(FATAL_ERROR "Please install libunwind-dev libdw-dev libelf-dev libevent-dev if you want to compile the SimGrid model checker.") + endif() endif() - SET(HAVE_MC 0) - SET(HAVE_MMALLOC 0) - SET(MMALLOC_WANT_OVERRIDE_LEGACY 0) +endif() + +if(enable_model-checking) + find_package(Libdw REQUIRED) + find_package(Libelf REQUIRED) + find_package(Libevent REQUIRED) + include_directories(${LIBDW_INCLUDE_DIR} ${LIBELF_INCLUDE_DIR} ${LIBEVENT_INCLUDE_DIR}) + set(SIMGRID_DEP "${SIMGRID_DEP} ${LIBEVENT_LIBRARIES} ${LIBELF_LIBRARIES} ${LIBDW_LIBRARIES}") + set(SIMGRID_HAVE_MC 1) + if("${CMAKE_SYSTEM}" MATCHES "FreeBSD" AND enable_java) + message(WARNING "FreeBSD + Model-Checking + Java = too much for now. Disabling java") + set(enable_java FALSE) + endif() +else() + SET(SIMGRID_HAVE_MC 0) + set(HAVE_MMALLOC 0) +endif() +mark_as_advanced(PATH_LIBDW_H) +mark_as_advanced(PATH_LIBDW_LIB) + +if (enable_model-checking AND enable_ns3) + message(FATAL_ERROR "Cannot activate both model-checking and NS3 bindings: NS3 pull too much dependencies for the MC to work") endif() if(enable_smpi) - include(FindGFortran) SET(HAVE_SMPI 1) - if("${CMAKE_SYSTEM}" MATCHES "Linux") - SET(USE_LIBUTIL 0) + if("${CMAKE_SYSTEM}" MATCHES "Darwin|FreeBSD|Linux") SET(HAVE_PRIVATIZATION 1) - elseif("${CMAKE_SYSTEM}" MATCHES "^FreeBSD") - SET(USE_LIBUTIL 0) - SET(HAVE_PRIVATIZATION 0) else() message (STATUS "Warning: no support for SMPI automatic privatization on this platform") SET(HAVE_PRIVATIZATION 0) endif() +else() + SET(HAVE_SMPI 0) endif() #-------------------------------------------------------------------------------------------------- -### Check for GNU dynamic linker -CHECK_INCLUDE_FILE("dlfcn.h" HAVE_DLFCN_H) -if (HAVE_DLFCN_H) - execute_process(COMMAND ${CMAKE_C_COMPILER} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_gnu_dynlinker.c -ldl -o test_gnu_ld - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - OUTPUT_VARIABLE HAVE_GNU_LD_compil - ) - if(HAVE_GNU_LD_compil) - set(HAVE_GNU_LD 0) - message(STATUS "Warning: test program toward GNU ld failed to compile:") - message(STATUS "${HAVE_GNU_LD_comp_output}") - else() - - execute_process(COMMAND ./test_gnu_ld - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - RESULT_VARIABLE HAVE_GNU_LD_run - OUTPUT_VARIABLE var_exec - ) - - if(NOT HAVE_GNU_LD_run) - set(HAVE_GNU_LD 1) - message(STATUS "We are using GNU dynamic linker") - else() - set(HAVE_GNU_LD 0) - message(STATUS "Warning: error while checking for GNU ld:") - message(STATUS "Test output: '${var_exec}'") - message(STATUS "Exit status: ${HAVE_GNU_LD_run}") - endif() - file(REMOVE test_gnu_ld) - endif() -endif() - - -#-------------------------------------------------------------------------------------------------- -### Initialize of CONTEXT THREADS - -if(HAVE_PTHREAD) - ### Test that we have a way to create semaphores - - if(HAVE_SEM_OPEN_LIB) - execute_process(COMMAND ${CMAKE_C_COMPILER} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_sem_open.c -lpthread -o sem_open - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - OUTPUT_VARIABLE HAVE_SEM_OPEN_compil - ) - - # Test sem_open by compiling: - if(HAVE_SEM_OPEN_compil) - set(HAVE_SEM_OPEN 0) - message(STATUS "Warning: sem_open not compilable") - message(STATUS "HAVE_SEM_OPEN_comp_output: ${HAVE_SEM_OPEN_comp_output}") - else() - set(HAVE_SEM_OPEN 1) - message(STATUS "sem_open is compilable") - endif() - - # If we're not crosscompiling, we check by executing the program: - if (HAVE_SEM_OPEN AND NOT CMAKE_CROSSCOMPILING) - execute_process(COMMAND ./sem_open - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - RESULT_VARIABLE HAVE_SEM_OPEN_run - OUTPUT_VARIABLE var_compil - ) - if (NOT HAVE_SEM_OPEN_run) - set(HAVE_SEM_OPEN 1) - message(STATUS "sem_open is executable") - else() - set(HAVE_SEM_OPEN 0) - if(EXISTS "${CMAKE_BINARY_DIR}/sem_open") - message(STATUS "Bin ${CMAKE_BINARY_DIR}/sem_open exists!") - else() - message(STATUS "Bin ${CMAKE_BINARY_DIR}/sem_open not exists!") - endif() - message(STATUS "Warning: sem_open not executable") - message(STATUS "Compilation output: '${var_compil}'") - message(STATUS "Exit result of sem_open: ${HAVE_SEM_OPEN_run}") - endif() - endif() - file(REMOVE sem_open) - - else() - set(HAVE_SEM_OPEN 0) - endif() - - if(HAVE_SEM_INIT_LIB) - execute_process(COMMAND ${CMAKE_C_COMPILER} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_sem_init.c -lpthread -o sem_init - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - RESULT_VARIABLE HAVE_SEM_INIT_run OUTPUT_VARIABLE HAVE_SEM_INIT_compil) - - # Test sem_init by compiling: - if(HAVE_SEM_INIT_compil) - set(HAVE_SEM_INIT 0) - message(STATUS "Warning: sem_init not compilable") - message(STATUS "HAVE_SEM_INIT_comp_output: ${HAVE_SEM_OPEN_comp_output}") - else() - set(HAVE_SEM_INIT 1) - message(STATUS "sem_init is compilable") - endif() - - # If we're not crosscompiling, we check by executing the program: - if (HAVE_SEM_INIT AND NOT CMAKE_CROSSCOMPILING) - execute_process(COMMAND ./sem_init - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - RESULT_VARIABLE HAVE_SEM_INIT_run - OUTPUT_VARIABLE var_compil - ) - if (NOT HAVE_SEM_INIT_run) - set(HAVE_SEM_INIT 1) - message(STATUS "sem_init is executable") - else() - set(HAVE_SEM_INIT 0) - if(EXISTS "${CMAKE_BINARY_DIR}/sem_init") - message(STATUS "Bin ${CMAKE_BINARY_DIR}/sem_init exists!") - else() - message(STATUS "Bin ${CMAKE_BINARY_DIR}/sem_init not exists!") - endif() - message(STATUS "Warning: sem_init not executable") - message(STATUS "Compilation output: '${var_compil}'") - message(STATUS "Exit result of sem_init: ${HAVE_SEM_INIT_run}") - endif() - endif() - file(REMOVE sem_init) - endif() - - if(NOT HAVE_SEM_OPEN AND NOT HAVE_SEM_INIT) - message(FATAL_ERROR "Semaphores are not usable (neither sem_open nor sem_init is both compilable and executable), but they are mandatory to threads (you may need to mount /dev).") - endif() - -endif() - -if(HAVE_PTHREAD) - set(HAVE_THREAD_CONTEXTS 1) - message("-- Support for thread context factory ok.") -endif() - +### Check what context backends are available +set(HAVE_UCONTEXT_CONTEXTS 0) if(NOT HAVE_UCONTEXT_H) - message("-- No ucontext factory: not found.") + message(STATUS "No ucontext factory: not found.") +elseif(APPLE) + message(STATUS "No ucontext factory: Apple don't want us to use them.") + set(HAVE_UCONTEXT_H 0) else() - # This is needed for ucontext on MacOS X: - if(CMAKE_SYSTEM_NAME MATCHES "Darwin") - add_definitions(-D_XOPEN_SOURCE=700 -D_DARWIN_C_SOURCE) - endif() try_compile(compile_makecontext ${CMAKE_BINARY_DIR} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_makecontext.c OUTPUT_VARIABLE compile_makecontext_output) - + #If can have both context if(compile_makecontext) set(HAVE_UCONTEXT_CONTEXTS 1) - message("-- Support for ucontext factory ok.") + message(STATUS "Support for ucontext factory ok.") else() - message("-- Error: exists, but makecontext is not compilable. Compilation output:\n ${compile_makecontext_output}") - message("-- No ucontext factory: makecontext() is not compilable.") + message(STATUS "Error: exists, but makecontext is not compilable. Compilation output:\n ${compile_makecontext_output}") + message(STATUS "No ucontext factory: makecontext() is not compilable.") endif() # Stack setup (size and address) @@ -547,101 +442,80 @@ else() else() message(FATAL_ERROR "Could not figure out the stack setup. Compil: ${RUN_makecontext_VAR}. Exec: ${COMPILE_makecontext_VAR}. Output: ${stack_setup}") endif() - - # Stack growth direction (upward or downward) - try_run(RUN_stackgrowth_VAR COMPILE_stackgrowth_VAR - ${CMAKE_BINARY_DIR} - ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_stackgrowth.c - RUN_OUTPUT_VARIABLE stack - COPY_FILE test_stackgrowth) - - if("${stack}" STREQUAL "down") +endif() + +# Stack growth direction (upward or downward). Used for the following contexts: SysV, raw, Boost +try_run(RUN_stackgrowth_VAR COMPILE_stackgrowth_VAR + ${CMAKE_BINARY_DIR} + ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_stackgrowth.c + RUN_OUTPUT_VARIABLE stack + COPY_FILE test_stackgrowth) + +if("${stack}" STREQUAL "down") + set(PTH_STACKGROWTH "-1") +elseif("${stack}" STREQUAL "up") + set(PTH_STACKGROWTH "1") +else() + if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64") + set(PTH_STACKGROWTH "-1") + elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i686") set(PTH_STACKGROWTH "-1") - elseif("${stack}" STREQUAL "up") - set(PTH_STACKGROWTH "1") else() - if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64") - set(PTH_STACKGROWTH "-1") - elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i686") - set(PTH_STACKGROWTH "-1") - else() - message(FATAL_ERROR "Could not figure out the stack direction. Test prog returned: ${stack}; CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}.") - endif() + message(FATAL_ERROR "Could not figure out the stack direction. Test prog returned: ${stack}; CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}.") endif() - # If the test ran well, remove the test binary - execute_process(COMMAND ${CMAKE_COMMAND} -E remove test_stackgrowth) endif() +# If the test ran well, remove the test binary +file(REMOVE test_stackgrowth) #-------------------------------------------------------------------------------------------------- -### check for addr2line -find_path(ADDR2LINE NAMES addr2line PATHS NO_DEFAULT_PATHS) -if(ADDR2LINE) - set(ADDR2LINE "${ADDR2LINE}/addr2line") -endif() - ############### ## GIT version check ## if(EXISTS ${CMAKE_HOME_DIRECTORY}/.git/) - execute_process(COMMAND git remote - COMMAND head -n 1 - WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git/ - OUTPUT_VARIABLE remote - RESULT_VARIABLE ret - ) - string(REPLACE "\n" "" remote "${remote}") - #message(STATUS "Git remote: ${remote}") - execute_process(COMMAND git config --get remote.${remote}.url - WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git/ - OUTPUT_VARIABLE url - RESULT_VARIABLE ret - ) - string(REPLACE "\n" "" url "${url}") - #message(STATUS "Git url: ${url}") - if(url) - execute_process(COMMAND git --git-dir=${CMAKE_HOME_DIRECTORY}/.git log --pretty=oneline --abbrev-commit -1 - WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git/ - OUTPUT_VARIABLE GIT_VERSION - RESULT_VARIABLE ret - ) - string(REPLACE "\n" "" GIT_VERSION "${GIT_VERSION}") - message(STATUS "Git version: ${GIT_VERSION}") - execute_process(COMMAND git --git-dir=${CMAKE_HOME_DIRECTORY}/.git log -n 1 --pretty=format:%ai . - WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git/ - OUTPUT_VARIABLE GIT_DATE - RESULT_VARIABLE ret - ) - string(REPLACE "\n" "" GIT_DATE "${GIT_DATE}") - message(STATUS "Git date: ${GIT_DATE}") - string(REGEX REPLACE " .*" "" GIT_VERSION "${GIT_VERSION}") - - execute_process(COMMAND git --git-dir=${CMAKE_HOME_DIRECTORY}/.git log --pretty=format:%H -1 - WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git/ - OUTPUT_VARIABLE SIMGRID_GITHASH - RESULT_VARIABLE ret - ) - string(REPLACE "\n" "" SIMGRID_GITHASH "${SIMGRID_GITHASH}") - + execute_process(COMMAND git rev-parse --verify --short HEAD + WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY} + OUTPUT_VARIABLE GIT_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE) + # Check for uncommitted changes + execute_process(COMMAND git diff --name-only HEAD + WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY} + OUTPUT_VARIABLE files_changed) + if(files_changed) + set(GIT_VERSION "${GIT_VERSION}-dirty") endif() elseif(EXISTS ${CMAKE_HOME_DIRECTORY}/.gitversion) FILE(STRINGS ${CMAKE_HOME_DIRECTORY}/.gitversion GIT_VERSION) +else() + set(GIT_VERSION "none, release version") endif() +message(STATUS "Git version: ${GIT_VERSION}") -if(GIT_VERSION) - set(SIMGRID_VERSION_BANNER "${SIMGRID_VERSION_BANNER} at commit ${GIT_VERSION}") -endif() -if(GIT_DATE) - set(SIMGRID_VERSION_BANNER "${SIMGRID_VERSION_BANNER} (${GIT_DATE})") +### Define source packages for Libs +include(${CMAKE_HOME_DIRECTORY}/tools/cmake/DefinePackages.cmake) + +### Setup gcc & clang flags (include after DefinePackage.cmake, and before generating header files) +if (NOT MSVC) + include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Flags.cmake) endif() ### Generate the required headers and scripts ############################################# -configure_file("${CMAKE_HOME_DIRECTORY}/tools/cmake/src/internal_config.h.in" "${CMAKE_BINARY_DIR}/src/internal_config.h" @ONLY IMMEDIATE) -configure_file("${CMAKE_HOME_DIRECTORY}/include/simgrid_config.h.in" "${CMAKE_BINARY_DIR}/include/simgrid_config.h" @ONLY IMMEDIATE) + +# Avoid triggering a (full) rebuild by touching the files if they did not really change +configure_file("${CMAKE_HOME_DIRECTORY}/src/internal_config.h.in" "${CMAKE_BINARY_DIR}/src/internal_config.h.generated" @ONLY IMMEDIATE) +configure_file("${CMAKE_HOME_DIRECTORY}/src/simgrid/version.h.in" "${CMAKE_BINARY_DIR}/src/simgrid/version.h.generated" @ONLY IMMEDIATE) +configure_file("${CMAKE_HOME_DIRECTORY}/include/simgrid/config.h.in" "${CMAKE_BINARY_DIR}/include/simgrid/config.h.generated" @ONLY IMMEDIATE) +execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/src/internal_config.h.generated ${CMAKE_BINARY_DIR}/src/internal_config.h) +execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/src/simgrid/version.h.generated ${CMAKE_BINARY_DIR}/src/simgrid/version.h) +execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/include/simgrid/config.h.generated ${CMAKE_BINARY_DIR}/include/simgrid/config.h) +file(REMOVE ${CMAKE_BINARY_DIR}/src/internal_config.h.generated) +file(REMOVE ${CMAKE_BINARY_DIR}/include/simgrid/config.h.generated) +file(REMOVE ${CMAKE_BINARY_DIR}/src/simgrid/version.h.generated) # We need two versions of the SMPI scripts because they contain the path to the library # so, it depends of whether SimGrid is installed, or run from the sources (during the build) -file(READ ${CMAKE_HOME_DIRECTORY}/src/smpi/smpitools.sh SMPITOOLS_SH) # Definitions shared amongst all scripts, inlined in each of them + +file(READ ${CMAKE_HOME_DIRECTORY}/src/smpi/smpitools.sh SMPITOOLS_SH) # Definitions shared amongst all SMPI scripts, inlined in each of them ### SMPI script used when simgrid is installed set(exec_prefix ${CMAKE_INSTALL_PREFIX}) @@ -653,8 +527,20 @@ if(NS3_LIBRARY_PATH) set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}:${NS3_LIBRARY_PATH}") endif() set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}:\${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}\"") +set(SMPIMAIN ${libdir}/simgrid/smpimain) +set(SMPIREPLAYMAIN ${libdir}/simgrid/smpireplaymain) configure_file(${CMAKE_HOME_DIRECTORY}/include/smpi/mpif.h.in ${CMAKE_BINARY_DIR}/include/smpi/mpif.h @ONLY) +#configure mpif.f90 to build mpi.mod +if(SMPI_FORTRAN) + set(MODULE_MPIF_IN "module mpi") + set(MODULE_MPIF_OUT "end module mpi") + configure_file(${CMAKE_HOME_DIRECTORY}/include/smpi/mpif.h.in ${CMAKE_BINARY_DIR}/src/smpi/mpif.f90.generated @ONLY) + execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/src/smpi/mpif.f90.generated ${CMAKE_BINARY_DIR}/src/smpi/mpif.f90) + set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/include/smpi) + add_library(mpi SHARED ${CMAKE_BINARY_DIR}/src/smpi/mpif.f90) +endif() + foreach(script cc cxx ff f90 run) configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpi${script}.in ${CMAKE_BINARY_DIR}/bin/smpi${script} @ONLY) endforeach() @@ -670,6 +556,8 @@ if(NS3_LIBRARY_PATH) set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}:${NS3_LIBRARY_PATH}") endif() set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}:\${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}\"") +set(SMPIMAIN ${CMAKE_BINARY_DIR}/lib/simgrid/smpimain) +set(SMPIREPLAYMAIN ${CMAKE_BINARY_DIR}/lib/simgrid/smpireplaymain) foreach(script cc cxx ff f90 run) configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpi${script}.in ${CMAKE_BINARY_DIR}/smpi_script/bin/smpi${script} @ONLY) @@ -684,12 +572,10 @@ endif() set(generated_headers_to_install ${CMAKE_CURRENT_BINARY_DIR}/include/smpi/mpif.h - ${CMAKE_CURRENT_BINARY_DIR}/include/simgrid_config.h + ${CMAKE_CURRENT_BINARY_DIR}/include/simgrid/config.h ) -set(generated_headers - ${CMAKE_CURRENT_BINARY_DIR}/src/internal_config.h - ) +set(generated_headers ${CMAKE_CURRENT_BINARY_DIR}/src/internal_config.h ) set(generated_files_to_clean ${generated_headers} @@ -707,7 +593,7 @@ set(generated_files_to_clean if(NOT "${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_HOME_DIRECTORY}") configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions0.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions0.txt COPYONLY) configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions1.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions1.txt COPYONLY) - configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_allReduce.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allReduce.txt COPYONLY) + configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_allreduce.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allreduce.txt COPYONLY) configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_barrier.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_barrier.txt COPYONLY) configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_bcast.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_bcast.txt COPYONLY) configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_with_isend.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_with_isend.txt COPYONLY) @@ -718,7 +604,9 @@ if(NOT "${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_HOME_DIRECTORY}") configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_gather.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_gather.txt COPYONLY) configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_allgatherv.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allgatherv.txt COPYONLY) configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile COPYONLY) - + configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_cluster ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_cluster COPYONLY) + configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_coll ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_coll COPYONLY) + configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/description_file ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/description_file COPYONLY) configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/README ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/README COPYONLY) configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/smpi_replay.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/smpi_replay.txt COPYONLY) @@ -755,11 +643,27 @@ if(NOT "${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_HOME_DIRECTORY}") 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) 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) +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) +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) +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) +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) +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) +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) +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) +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) +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) +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) +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) +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) +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) +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) +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) + set(generated_files_to_clean ${generated_files_to_clean} ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions0.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions1.txt - ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allReduce.txt + ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allreduce.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_barrier.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_bcast.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_with_isend.txt @@ -805,23 +709,41 @@ if(NOT "${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_HOME_DIRECTORY}") ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace29.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace30.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace31.txt + ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/compute_only.txt + ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/compute_only/actions0.txt + ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/compute_only/actions1.txt + ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/empty.txt + ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/empty/actions0.txt + ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/empty/actions1.txt + ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/mixed.txt + ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/mixed/actions0.txt + ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/mixed/actions1.txt + ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/replay_multiple_manual.tesh + ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_compute + ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_compute_consecutive + ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_compute_consecutive2 + ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_compute_simple + ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_empty1 + ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_empty2 + ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_empty2_same_resources + ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_empty2_same_time + ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_empty2_same_time_and_resources + ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_mixed1 + ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_mixed2 + ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_mixed2_same_resources + ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_mixed2_same_time + ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_mixed2_same_time_and_resources + ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_nojob ) endif() SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${generated_files_to_clean}") -### Define source packages for Libs -include(${CMAKE_HOME_DIRECTORY}/tools/cmake/DefinePackages.cmake) +add_custom_target(tests COMMENT "Recompiling the tests") ### Build some Maintainer files include(${CMAKE_HOME_DIRECTORY}/tools/cmake/MaintainerMode.cmake) -include(${CMAKE_HOME_DIRECTORY}/tools/cmake/UnitTesting.cmake) - -### Setup gcc & clang flags -if (NOT MSVC) - include(${CMAKE_HOME_DIRECTORY}/tools/cmake/GCCFlags.cmake) -endif() ### Make Libs if(NOT WIN32) @@ -834,6 +756,64 @@ if(enable_java) include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Java.cmake) endif() +# Python binding (with pybind11) +################ +# Our usage of pybind11::overload_cast mandates C++14 +get_property(known_features GLOBAL PROPERTY CMAKE_CXX_KNOWN_FEATURES) + +if("cxx_std_14" IN_LIST known_features) + + if(EXISTS ${CMAKE_HOME_DIRECTORY}/pybind11) # Try to use a local copy of pybind11, if any + message(STATUS "Use the internal copy of pybind11 (using C++14).") + add_subdirectory(${CMAKE_HOME_DIRECTORY}/pybind11) + set(pybind11_FOUND ON) + + set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_HOME_DIRECTORY}/pybind11/tools/) + set(Python_ADDITIONAL_VERSIONS 3.7 3.6 3.5 3.4) + find_package(PythonLibsNew ${PYBIND11_PYTHON_VERSION} REQUIRED) + + else() + find_package(pybind11 2.2.0) + endif() + + if(NOT PYTHONLIBS_FOUND) + message(STATUS "Python libs not found. Turn pybind11 off.") + + set(pybind11_FOUND OFF) + endif() + +else() + message(STATUS "No support for C++14 detected, don't even search for pybind11.") + set(pybind11_FOUND OFF) +endif() +unset(known_features) + +option(enable_python "Whether the Python bindings are activated." ${pybind11_FOUND}) # ON by default if dependencies are met + +if("${CMAKE_SYSTEM}" MATCHES "FreeBSD" AND enable_model-checking AND enable_python) + message(WARNING "FreeBSD + Model-Checking + Python = too much for now. Disabling python.") + set(enable_python FALSE) +endif() + +if(enable_python) + if(pybind11_FOUND) + message(STATUS "Found pybind11, with C++14.") + pybind11_add_module(python-bindings src/bindings/python/simgrid_python.cpp) + target_compile_features(python-bindings PRIVATE cxx_std_14) + target_link_libraries(python-bindings PUBLIC simgrid) + set_target_properties(python-bindings PROPERTIES + LIBRARY_OUTPUT_NAME simgrid + CXX_VISIBILITY_PRESET "default") + add_dependencies(tests python-bindings) + set_property(TARGET python-bindings + APPEND PROPERTY INCLUDE_DIRECTORIES "${INTERNAL_INCLUDES}") + else() + message(FATAL_ERROR "Please install pybind11-dev to build the Python bindings (or disable that option).") + endif() +endif() +mark_as_advanced(PYBIND11_PYTHON_VERSION) +mark_as_advanced(pybind11_DIR) + ### Make tests if(enable_memcheck_xml) set(enable_memcheck true) @@ -853,32 +833,29 @@ endforeach() ### Setup the distrib include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Distrib.cmake) -### Build the doc (Windows downloads the doc instead of regenerating) -# -if(NOT WIN32) - include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Documentation.cmake) -else() - find_program(WGET_PROGRAM NAMES wget) - message(STATUS "wget: ${WGET_PROGRAM}") - if(WGET_PROGRAM) - ADD_CUSTOM_TARGET(documentation - COMMENT "Downloading the SimGrid documentation..." - COMMAND ${WGET_PROGRAM} -r -np -nH -nd http://simgrid.gforge.inria.fr/simgrid/${release_version}/doc/ - WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/doc/html - ) - endif() -endif() +### Build the docs if asked to +include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Documentation.cmake) ### Print the result of configuration message("") message("##########################################") message("#### Content of src/internal_config.h ####") +message("##########################################") file(STRINGS ${CMAKE_CURRENT_BINARY_DIR}/src/internal_config.h config_output) -LIST(REMOVE_AT config_output 0 1 2 3 4 5 6 7 8) # Pass the file header +LIST(REMOVE_AT config_output 0 1 2 3 4 5 6 7 8 9 10) # Pass the file header foreach(line ${config_output}) message(" ${line}") endforeach() -message("#### end of src/internal_config.h ####") +message("##########################################") +message("#### Content of simgrid/config.h ####") +message("##########################################") +file(STRINGS ${CMAKE_CURRENT_BINARY_DIR}/include/simgrid/config.h config_output) +LIST(REMOVE_AT config_output 0 1 2 3 4 5 6 7 8 9 -1) # Pass the file header +foreach(line ${config_output}) + message(" ${line}") +endforeach() +message("##########################################") +message("#### End of configuration headers ####") message("##########################################") message("\nConfiguration of package `simgrid':") @@ -901,14 +878,10 @@ message(" version .............: ${CMAKE_CXX_COMPILER_VERSION}") if(${Java_FOUND}) message(" Compiler: Javac .............: ${Java_JAVAC_EXECUTABLE}") message(" version .............: ${Java_VERSION_STRING}") -if(${SWIG_FOUND}) - message(" SWIG ................: Version ${SWIG_VERSION} found.") -else() - message(" SWIG ................: Missing.") -endif() + message(" runtime .............: ${Java_JAVA_EXECUTABLE}") endif() if(CMAKE_Fortran_COMPILER) - message(" Compiler: Fortran ...........: ${CMAKE_Fortran_COMPILER} (id: ${CMAKE_Fortran_COMPILER_ID})") + message(" Compiler: Fortran ...........: ${SMPI_Fortran_COMPILER} (id: ${CMAKE_Fortran_COMPILER_ID})") message(" version .............: ${CMAKE_Fortran_COMPILER_VERSION}") endif() message(" Linker: .....................: ${CMAKE_LINKER}") @@ -921,7 +894,7 @@ message(" LDFlags .....................: ${CMAKE_C_LINK_FLAGS}") message(" with LTO ....................: ${enable_lto}") message("") -if (HAVE_NS3) +if (SIMGRID_HAVE_NS3) message(" Compile NS-3 ................: yes (path: ${NS3_PATH})") else() message(" Compile NS-3 ................: NO (hint: ${NS3_HINT})") @@ -933,25 +906,31 @@ if (${Java_FOUND}) else() message(" Compile Java ................: NO") endif() -message(" Compile Lua .................: ${HAVE_LUA}") +if(pybind11_FOUND) + message(" Compile Python bindings .....: ${enable_python}") + message(" module ....................: ${PYTHON_MODULE_PREFIX}simgrid${PYTHON_MODULE_EXTENSION}") +else() + message(" Compile Python bindings .....: NO (disabled, or pybind11 not found)") +endif() +message(" Compile Lua .................: ${SIMGRID_HAVE_LUA}") message(" Compile Smpi ................: ${HAVE_SMPI}") message(" Smpi fortran ..............: ${SMPI_FORTRAN}") message(" MPICH3 testsuite ..........: ${enable_smpi_MPICH3_testsuite}") message(" Privatization .............: ${HAVE_PRIVATIZATION}") +message(" PAPI support...............: ${HAVE_PAPI}") message(" Compile Boost.Context support: ${HAVE_BOOST_CONTEXTS}") message("") message(" Maintainer mode .............: ${enable_maintainer_mode}") message(" Documentation................: ${enable_documentation}") -message(" Model checking ..............: ${HAVE_MC}") -message(" Jedule mode ................: ${HAVE_JEDULE}") +message(" Model checking ..............: ${SIMGRID_HAVE_MC}") +message(" Jedule mode ................: ${SIMGRID_HAVE_JEDULE}") message(" Graphviz mode ...............: ${HAVE_GRAPHVIZ}") -message(" Sigc++ mode .................: ${SIMGRID_HAVE_LIBSIG}") message(" Mallocators .................: ${enable_mallocators}") message("") message(" Simgrid dependencies ........: ${SIMGRID_DEP}") message("") -exec_program("${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/Testing/Notes/" OUTPUT_VARIABLE OKIDOKI) +execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/Testing/Notes/) file(WRITE ${PROJECT_BINARY_DIR}/Testing/Notes/Build "GIT version : ${GIT_VERSION}\n") file(APPEND ${PROJECT_BINARY_DIR}/Testing/Notes/Build "Release : simgrid-${release_version}\n")