From 8b36944935610791244a0a9979f13b0d7a2db693 Mon Sep 17 00:00:00 2001 From: Martin Quinson Date: Thu, 16 Nov 2023 19:18:49 +0100 Subject: [PATCH] Ease the usage of cmake for SMPI programs --- FindSimGrid.cmake | 25 +++++++++++++++++++++- docs/source/Start_your_own_project.rst | 29 ++++++++++++++++++++------ 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/FindSimGrid.cmake b/FindSimGrid.cmake index 6f9d9e19cf..eec2f92ed5 100644 --- a/FindSimGrid.cmake +++ b/FindSimGrid.cmake @@ -40,6 +40,18 @@ # 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 # ------------------- @@ -48,7 +60,7 @@ # 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) @@ -103,6 +115,17 @@ find_package_handle_standard_args(SimGrid ) 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} diff --git a/docs/source/Start_your_own_project.rst b/docs/source/Start_your_own_project.rst index c339a00c32..bb06f098db 100644 --- a/docs/source/Start_your_own_project.rst +++ b/docs/source/Start_your_own_project.rst @@ -58,16 +58,33 @@ manually but your project will produce relevant error messages when 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 ----------------------------------- -- 2.20.1