Provide common library headers through new CMake target.
authorM. Eric Irrgang <mei2n@virginia.edu>
Thu, 12 Nov 2020 13:13:20 +0000 (13:13 +0000)
committerMark Abraham <mark.j.abraham@gmail.com>
Thu, 12 Nov 2020 13:13:20 +0000 (13:13 +0000)
Prepare to remove `src/` from global build tree include path.
Create `src/include` and `common` target for library-level headers.

Ref #3288

12 files changed:
api/gmxapi/cpp/CMakeLists.txt
api/nblib/CMakeLists.txt
docs/dev-manual/build-system.rst
src/CMakeLists.txt
src/gromacs/CMakeLists.txt
src/gromacs/mdrunutility/tests/CMakeLists.txt
src/gromacs/onlinehelp/tests/CMakeLists.txt
src/gromacs/trajectoryanalysis/tests/CMakeLists.txt
src/include/gmxpre.h [moved from src/gmxpre.h with 98% similarity]
src/programs/CMakeLists.txt
src/testutils/CMakeLists.txt
src/testutils/TestMacros.cmake

index 52d88c54dce11188c1ce70191028b440be493085..54e61dbfb76acbec53442b7713e46bc975c81103 100644 (file)
@@ -84,6 +84,7 @@ set_target_properties(gmxapi PROPERTIES
                       )
 
 target_link_libraries(gmxapi PRIVATE libgromacs)
+target_link_libraries(gmxapi PRIVATE common)
 
 
 ################################################
index 4c75ae58ad31abbdbdd180f75549b341a1309a1b..a514d910770c75a6c69c1ef0e7873d723003191c 100644 (file)
@@ -122,6 +122,7 @@ gmx_target_compile_options(nblib)
 target_link_libraries(nblib PRIVATE libgromacs)
 target_include_directories(nblib PRIVATE ${PROJECT_SOURCE_DIR}/api)
 include_directories(BEFORE ${CMAKE_SOURCE_DIR}/api)
+target_link_libraries(nblib PRIVATE common)
 # There are transitive dependencies on the legacy GROMACS headers.
 target_link_libraries(nblib PUBLIC legacy_api)
 
index a35b57f78427902aba124c80fa84cdb690a8038e..d3be576fb9711a6223274e5c9a4b787517bb83f1 100644 (file)
@@ -566,7 +566,9 @@ The build system uses a few different mechanisms to influence the compilation:
     headers fall in this category.  See Doxygen documentation for
     :file:`gmxpre.h`.
 
-  All the above files get generated in :file:`src/`.
+  The above files are available through the INTERFACE_INCLUDE_DIR of
+  the ``common`` CMake target. I.e. to ``#include "config.h"``, be sure to
+  ``target_link_libraries(mymodule PRIVATE common)``
 
   Additionally, the following file is generated by the build system:
 
index b987bdb5e56b62b382ae91e729601ca99a94bdd8..aac191361c61439090c18ebf3fea22b638972b5b 100644 (file)
@@ -53,7 +53,7 @@ endif()
 # CMAKE_BUILD_TYPE is #included into buildinfo.h and populates the
 # fields e.g. printed to the log file.
 file(GENERATE
-    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/compilerflaginfo-$<CONFIG>-$<COMPILE_LANGUAGE>.h
+    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/include/compilerflaginfo-$<CONFIG>-$<COMPILE_LANGUAGE>.h
     INPUT ${CMAKE_CURRENT_SOURCE_DIR}/compilerflaginfo.h.cmakein
     CONDITION $<CONFIG:${CMAKE_BUILD_TYPE}>
     )
@@ -114,6 +114,19 @@ if (GMX_CLANG_TIDY)
    mark_as_advanced(CLANG_TIDY_EXE)
 endif()
 
+# Create a basic target for the `src` section of the build tree to capture
+# the library-level shared details through CMake infrastructure. It is not
+# installed or exported, so it must only be used as a PRIVATE dependency by
+# installed targets.
+# Initially, this is just an INTERFACE target to provide include directory.
+# It should also absorb global variables and compiler/linker details to be
+# provided as transitive usage requirements.
+# It could expand to aggregate the module targets in the future.
+add_library(common INTERFACE)
+target_include_directories(common INTERFACE
+                           ${CMAKE_CURRENT_SOURCE_DIR}/include
+                           ${CMAKE_CURRENT_BINARY_DIR}/include)
+
 add_subdirectory(external)
 
 if (BUILD_TESTING)
@@ -139,9 +152,9 @@ add_subdirectory(api)
 # header file in both of the make stages. That's slow, and is useless
 # busy work for ccache, too.
 string(TOUPPER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_UPPER)
-configure_file(config.h.cmakein config.h)
-configure_file(gmxpre-config.h.cmakein gmxpre-config.h)
+configure_file(config.h.cmakein include/config.h)
+configure_file(gmxpre-config.h.cmakein include/gmxpre-config.h)
 
 set(CMAKE_BUILD_CONFIGURATION_C_FLAGS   ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UPPER}})
 set(CMAKE_BUILD_CONFIGURATION_CXX_FLAGS ${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE_UPPER}})
-configure_file(buildinfo.h.cmakein buildinfo.h ESCAPE_QUOTES)
+configure_file(buildinfo.h.cmakein include/buildinfo.h ESCAPE_QUOTES)
index 962c2b558c30404d85257b5b0a15303cff15e900..df2147579d1f87d32f273b382ffd7dacdfa62a85 100644 (file)
@@ -186,6 +186,7 @@ if (GMX_GPU_CUDA)
 else()
     add_library(libgromacs ${LIBGROMACS_SOURCES})
 endif()
+target_link_libraries(libgromacs PRIVATE common)
 
 # Add these contents first because linking their tests can take a lot
 # of time, so we want lots of parallel work still available after
@@ -204,6 +205,7 @@ foreach(object_library ${libgromacs_object_library_dependencies})
         set_target_properties(${object_library} PROPERTIES POSITION_INDEPENDENT_CODE true)
     endif()
     target_include_directories(${object_library} SYSTEM BEFORE PRIVATE ${PROJECT_SOURCE_DIR}/src/external/thread_mpi/include)
+    target_link_libraries(${object_library} PRIVATE common)
 
     # Add the sources from the object libraries to the main library.
     target_sources(libgromacs PRIVATE $<TARGET_OBJECTS:${object_library}>)
index 1a95671662ce36728d8131a7dea049d445360f6d..900eee12c590946b3a46ac6defbd29f5af3dcc87 100644 (file)
@@ -34,6 +34,7 @@
 
 gmx_add_unit_test_library(mdrunutility-test-shared
                           threadaffinitytest.cpp)
+target_link_libraries(mdrunutility-test-shared PRIVATE common)
 target_link_libraries(mdrunutility-test-shared PUBLIC legacy_api)
 
 gmx_add_unit_test(MdrunUtilityUnitTests mdrunutility-test
index ad53c3b6ddb9fa2528a29c0bc9dd616a86073494..a22b6e83cddb15da2218e92301a1cd177b422c92 100644 (file)
@@ -34,6 +34,7 @@
 
 gmx_add_unit_test_library(onlinehelp-test-shared
                           mock_helptopic.cpp)
+target_link_libraries(onlinehelp-test-shared PUBLIC common)
 
 gmx_add_unit_test(OnlineHelpUnitTests onlinehelp-test
     CPP_SOURCE_FILES
index cca089f3142ff98ed90e13d79063cfa6eb832d7c..0cf63094614388f1d0210730f30ab3acd0101f42 100644 (file)
@@ -56,6 +56,7 @@ gmx_add_gtest_executable(trajectoryanalysis-test
         )
 gmx_register_gtest_test(TrajectoryAnalysisUnitTests trajectoryanalysis-test SLOW_TEST)
 target_link_libraries(trajectoryanalysis-test PRIVATE analysisdata-test-shared)
+target_link_libraries(trajectoryanalysis-test PRIVATE common)
 
 add_executable(test_selection ${UNITTEST_TARGET_OPTIONS} test_selection.cpp)
-target_link_libraries(test_selection PRIVATE libgromacs ${GMX_EXE_LINKER_FLAGS})
+target_link_libraries(test_selection PRIVATE common libgromacs ${GMX_EXE_LINKER_FLAGS})
similarity index 98%
rename from src/gmxpre.h
rename to src/include/gmxpre.h
index 10353266f1ab3413e1dc930ef242265c41bb334e..514932f3a024076109fad7db97912d0ee80e9d09 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2014,2018,2019, by the GROMACS development team, led by
+ * Copyright (c) 2014,2018,2019,2020, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
index 5797b1de820b9d43dcc56fe9c1bd9d7208793d8c..343202ca15ff561ca68d4fdc79df48ca0b83b332 100644 (file)
@@ -41,6 +41,7 @@ target_compile_definitions(mdrun_objlib PRIVATE HAVE_CONFIG_H)
 target_include_directories(mdrun_objlib SYSTEM BEFORE PRIVATE ${PROJECT_SOURCE_DIR}/src/external/thread_mpi/include)
 # Should be possible to remove this when resolving #3290
 target_include_directories(mdrun_objlib SYSTEM PRIVATE ${PROJECT_SOURCE_DIR}/src/external)
+target_link_libraries(mdrun_objlib PRIVATE common)
 target_link_libraries(mdrun_objlib PRIVATE legacy_api)
 
 if(GMX_FAHCORE)
@@ -75,8 +76,10 @@ else()
     gmx_target_compile_options(view_objlib)
     target_compile_definitions(view_objlib PRIVATE HAVE_CONFIG_H)
     target_include_directories(view_objlib SYSTEM PRIVATE ${PROJECT_SOURCE_DIR}/src/external)
+    target_link_libraries(view_objlib PRIVATE common)
     target_link_libraries(view_objlib PRIVATE legacy_api)
     add_library(gmx_objlib OBJECT ${GMX_MAIN_SOURCES})
+    target_link_libraries(gmx_objlib PRIVATE common)
     target_link_libraries(gmx_objlib PRIVATE legacy_api)
     target_include_directories(gmx_objlib SYSTEM PRIVATE ${PROJECT_SOURCE_DIR}/src/external)
     target_include_directories(gmx_objlib SYSTEM BEFORE PRIVATE ${PROJECT_SOURCE_DIR}/src/external/thread_mpi/include)
@@ -89,6 +92,7 @@ else()
     target_compile_definitions(gmx PRIVATE HAVE_CONFIG_H)
     target_link_libraries(gmx PRIVATE
                           libgromacs
+                          common
                           ${GMX_COMMON_LIBRARIES}
                           ${GMX_EXE_LINKER_FLAGS})
     if(GMX_X11)
index 2d96c50053ed249cb76ff5b3a1fbe7a7854d5b10..8b4c6f16b286a492ab1345913e963d980b0f0b36 100644 (file)
@@ -96,6 +96,7 @@ gmx_target_compile_options(testutils)
 target_compile_definitions(testutils PRIVATE HAVE_CONFIG_H)
 target_include_directories(testutils SYSTEM BEFORE PRIVATE ${PROJECT_SOURCE_DIR}/src/external/thread_mpi/include)
 target_link_libraries(testutils PRIVATE libgromacs ${GMX_COMMON_LIBRARIES} gmock)
+target_link_libraries(testutils PUBLIC common)
 
 if(HAVE_TINYXML2)
     include_directories(SYSTEM ${TinyXML2_INCLUDE_DIR})
index 70dd60e0364012ebc6ee69948859c61fdf783273..e5c4c33190a20a0464a4b0535d031f72e5b740eb 100644 (file)
@@ -169,7 +169,7 @@ function (gmx_add_gtest_executable EXENAME)
         endif()
 
         target_link_libraries(${EXENAME} PRIVATE
-            testutils libgromacs gmock
+            testutils common libgromacs gmock
             ${GMX_COMMON_LIBRARIES} ${GMX_EXE_LINKER_FLAGS})
 
         if(GMX_CLANG_TIDY)