Skip to content
  • Steffen Müthing's avatar
    [CMake] Clean up dune_enable_all_packages() and fix library handling · 6bceb786
    Steffen Müthing authored
    dune_enable_all_packages() doesn't really work if a module contains
    libraries (it triggers CMP022 and CMP038). This patch works around that
    problem and also adds a number of convenience features to the overall
    mechanism. In particular:
    
    - dune_enable_all_packages() now accepts optional lists of additional
      include directories and compile definitions that will be applied to
      all targets in the module. There is a new option APPEND that controls
      the placement of those compiler arguments, analogous to
      dune_register_package_flags().
    
    - Libraries need special handling to work around the problem with the
      two CMake policies listed above. Those get triggered because libraries
      defined in the module ended up linking to themselves, and newer
      versions of CMake really don't like that. We can avoid this problem by
      exploiting the fact that the set of libraries contained in
      link_libraries is evaluated only once, at the point when a target is
      created. So we only have to make sure that libraries inside the module
      are created before they are added to link_libraries(). But we have to
      be careful to make sure that link_libraries() is called before the
      user creates any targets that depend on the module library.
      In order to minimize the risk of user error, I have integrated those
      two tasks (creating the library and adding it to link_libraries())
      into the dune_enable_all_packages() macro. So this macro now accepts a
      list of library names (as the multi argument MODULE_LIBRARIES). These
      are automatically created using dune_add_library() (placing them in
      lib/) in the order that they are listed and added to link_libraries()
      afterwards. Users MUST use this mechanism if they want the library to
      be linked automatically to programs in the module. On the other hand,
      you can still manually create libraries, but then you have to link to
      them manually (e.g. the Alberta libs in dune-grid).
    
    - There is a new macro dune_library_add_sources() that can be used to add
      source files to libraries created with the help of
      dune_enable_all_packages(). That macro can be called repeatedly and in
      any subdirectory of the source tree. Using this facility, I think we
      can mostly get rid of OBJECT libraries. :-)
    
    - CMake doesn't like to create a target without any source files, so the
      patch generates a small stub source for each library that contains two
      functions that are named after the library and return the version of
      the associated dune module.
    6bceb786