# Since SimGrid header files require C++17, so we set CMAKE_CXX_STANDARD to 17.
# Change this variable in your own file if you need a later standard.
+# DEVELOPPERS OF MPI PROGRAMS USING SIMGRID
+# You should use smpi_c_target() on the targets that are intended to run in SMPI.
+# ${SMPIRUN} is correctly set if it's installed.
+#
+# Example:
+# add_executable(roundtrip roundtrip.c)
+# smpi_c_target(roundtrip)
+#
+# enable_testing()
+# add_test(NAME Roundtrip
+# COMMAND ${SMPIRUN} -platform ${CMAKE_SOURCE_DIR}/../cluster_backbone.xml -np 2 ./roundtrip)
+
#
# IMPROVING THIS FILE
# -------------------
# https://cmake.org/Wiki/CMake/Tutorials/How_to_create_a_ProjectConfig.cmake_file
# https://github.com/boostcon/cppnow_presentations_2017/blob/master/05-19-2017_friday/effective_cmake__daniel_pfeifer__cppnow_05-19-2017.pdf
-cmake_minimum_required(VERSION 2.8.12)
+cmake_minimum_required(VERSION 3.5)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
)
if (SimGrid_FOUND)
+
+ find_program(SMPIRUN smpirun
+ HINTS ${SimGrid_PATH}/bin /opt/simgrid/bin)
+
+ MACRO(smpi_c_target NAME)
+ target_compile_options(${NAME} PUBLIC "-include;smpi/smpi_helpers.h;-fPIC;-shared;-Wl,-z,defs")
+ target_link_options(${NAME} PUBLIC "-fPIC;-shared;-Wl,-z,defs;-lm")
+ target_link_libraries(${NAME} PUBLIC ${SimGrid_LIBRARY})
+ target_include_directories(${NAME} PUBLIC "${SimGrid_INCLUDE_DIR};${SimGrid_INCLUDE_DIR}/smpi")
+ ENDMACRO()
+
add_library(SimGrid::SimGrid SHARED IMPORTED)
set_target_properties(SimGrid::SimGrid PROPERTIES
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES ${SimGrid_INCLUDE_DIR}
trying to compile on a machine where SimGrid is not installed. Please
also refer to the file header for more information.
-MPI projects should include ``find_package (MPI)`` in CMakeLists.txt. Then, the
-variables ``MPI_C_COMPILER``, ``MPI_CXX_COMPILER``, and ``MPI_Fortran_COMPILER`` should
-point to the full path of smpicc, smpicxx, and smpiff respectively.
-It is however not advised to set these variables from the CMakeLists.txt file directly.
-In addition, you may need to set ``SMPI_PRETEND_CC=1`` to please cmake when it tests the compiler.
+MPI projects should NOT search for MPI as usual in cmake, but instead use the ``smpi_c_target()`` macro
+to declare that a given target is meant to be executed in ``smpirun`` (which path is set in ``${SMPIRUN}``).
+This macro should work for C and C++ programs. Here is a small example:
+
+.. code-block:: cmake
+
+ # Search FindSimgrid in my sources
+ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}")
+ find_package(SimGrid)
+
+ # Declare an executable, and specify that it's meant to run within smpirun
+ add_executable(roundtrip roundtrip.c)
+ smpi_c_target(roundtrip)
+
+ # Declare a test running our executable in ${SMPIRUN}
+ enable_testing()
+ add_test(NAME RoundTrip
+ COMMAND ${SMPIRUN} -platform ${CMAKE_SOURCE_DIR}/../cluster_backbone.xml -np 2 ./roundtrip)
+
+To compile Fortran code with cmake, you must override the ``MPI_Fortran_COMPILER`` variable as follows, but it will probably
+break some configuration checks, so you should export ``SMPI_PRETEND_CC=1`` during the configuration (not during the compilation
+nor the execution).
.. code-block:: console
$ SMPI_PRETEND_CC=1 cmake -DMPI_C_COMPILER=/opt/simgrid/bin/smpicc -DMPI_CXX_COMPILER=/opt/simgrid/bin/smpicxx -DMPI_Fortran_COMPILER=/opt/simgrid/bin/smpiff .
-
+ $ make
Building your project with Makefile
-----------------------------------