SimGrid  3.13
Versatile Simulation of Distributed Systems
Modifying the cmake files

Generalities on Cmake

What is Cmake?

CMake is a family of tools designed to build, test and package software. CMake is used to control the software compilation process using simple platform and compiler independent configuration files. CMake generates native makefiles and workspaces that can be used in the compiler environment of your choice. For more information see official web site here.

Why cmake?

CMake permits to developers to compile projects on different platforms. Then many tools are embedded like ctest for making test, a link to cdash for vizualise results but also test coverage and bug reports.

How to add source files?

If you want modified, add or delete source files from a library you have to edit <project/directory>/tools/cmake/DefinePackages.cmake. Chose the section you are interested in and modify it.

set(SMPI_SRC
  src/smpi/smpi_base.c
  src/smpi/smpi_bench.c
  src/smpi/smpi_c99.c
  src/smpi/smpi_coll.c
  src/smpi/smpi_comm.c
  src/smpi/smpi_global.c
  src/smpi/smpi_group.c
  src/smpi/smpi_mpi.c
  src/smpi/smpi_mpi_dt.c
  src/smpi/smpi_pmpi.c
  src/smpi/smpi_replay.c
  )

If your source is always added to the library, you are set. But if it's optional, you must ensure that it gets added to the source distribution when not compiled in, or it may well be missing if the archive is built without the option activating your source. This is done by adding the files to the EXTRA_DIST list, as in the following example:

### If fortran is installed compile source other-whise source is only copied in the dist 
if(SMPI_FORTRAN)
  set(SMPI_SRC
    ${SMPI_SRC}
    src/smpi/smpi_f77.c
    )
else()
  set(EXTRA_DIST
    ${EXTRA_DIST}
    src/smpi/smpi_f77.c
  )
endif()

Don't forget to run the "make distcheck" target after any modification to the cmake files: it checks whether all necessary files are present in the distribution.

How to add an example?

The first rule is that the content of examples/ must be interesting to the users. It is expected that the users will take one of these examples and start editing it to make it fit their needs. So, it should be self-contained, informative and should use only the public APIs.

To ensure that all examples actually work as expected, every examples are also used as integration test (see Testing SimGrid), but you should still strive to keep the code under examples/ as informative as possible for the users. In particular, torture test cases should be placed in teshsuite/, not examples/, so that the users don't stumble upon them by error.

To add a new example, create a CMakeList.txt in the chosen source directory. It must specify where to create the executable, the source list, dependencies and the name of the binary.

set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")

add_executable(Hello Hello.c)

### Add definitions for compile
target_link_libraries(Hello simgrid)

### You have to put all new files in the apropriated section 
### If they are not there, they can't be on the dist package. 
set(tesh_files
  ${tesh_files}
  PARENT_SCOPE
  )
set(xml_files
  ${xml_files}
  PARENT_SCOPE
  )
set(examples_src
  ${examples_src}
  ${CMAKE_CURRENT_SOURCE_DIR}/Hello.c
  PARENT_SCOPE
  )
set(bin_files
  ${bin_files}
  PARENT_SCOPE
  )
set(txt_files
  ${txt_files}
  PARENT_SCOPE
  )

Then, you have to add your CMakeLists.txt to CMAKEFILES_TXT in <project/directory>/tools/cmake/DefinePackages.cmake:

set(CMAKEFILES_TXT
  <path_to_your_CMakeList.txt>
  )

And finally, add the tesh file and register your example to the testing infrastructure. See Adding integration tests for more details.

Once you're done, you must run "make distcheck" to ensure that you did not forget to add any file to the distributed archives. This ensures that everything was commited correctly, so you have to first commit before running "make distcheck". If you forgot something, you want to "git commit --amend". But never amend a commit that you already pushed to public repositories! Do a second commit in that case.