From 9c71edb25ced6bbea9344a9433b257c8c7a9416e Mon Sep 17 00:00:00 2001 From: "M. Eric Irrgang" Date: Thu, 12 Nov 2020 13:13:20 +0000 Subject: [PATCH] Provide common library headers through new CMake target. Prepare to remove `src/` from global build tree include path. Create `src/include` and `common` target for library-level headers. Ref #3288 --- api/gmxapi/cpp/CMakeLists.txt | 1 + api/nblib/CMakeLists.txt | 1 + docs/dev-manual/build-system.rst | 4 +++- src/CMakeLists.txt | 21 +++++++++++++++---- src/gromacs/CMakeLists.txt | 2 ++ src/gromacs/mdrunutility/tests/CMakeLists.txt | 1 + src/gromacs/onlinehelp/tests/CMakeLists.txt | 1 + .../trajectoryanalysis/tests/CMakeLists.txt | 3 ++- src/{ => include}/gmxpre.h | 2 +- src/programs/CMakeLists.txt | 4 ++++ src/testutils/CMakeLists.txt | 1 + src/testutils/TestMacros.cmake | 2 +- 12 files changed, 35 insertions(+), 8 deletions(-) rename src/{ => include}/gmxpre.h (98%) diff --git a/api/gmxapi/cpp/CMakeLists.txt b/api/gmxapi/cpp/CMakeLists.txt index 52d88c54dc..54e61dbfb7 100644 --- a/api/gmxapi/cpp/CMakeLists.txt +++ b/api/gmxapi/cpp/CMakeLists.txt @@ -84,6 +84,7 @@ set_target_properties(gmxapi PROPERTIES ) target_link_libraries(gmxapi PRIVATE libgromacs) +target_link_libraries(gmxapi PRIVATE common) ################################################ diff --git a/api/nblib/CMakeLists.txt b/api/nblib/CMakeLists.txt index 4c75ae58ad..a514d91077 100644 --- a/api/nblib/CMakeLists.txt +++ b/api/nblib/CMakeLists.txt @@ -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) diff --git a/docs/dev-manual/build-system.rst b/docs/dev-manual/build-system.rst index a35b57f784..d3be576fb9 100644 --- a/docs/dev-manual/build-system.rst +++ b/docs/dev-manual/build-system.rst @@ -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: diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b987bdb5e5..aac191361c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -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-$-$.h + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/include/compilerflaginfo-$-$.h INPUT ${CMAKE_CURRENT_SOURCE_DIR}/compilerflaginfo.h.cmakein CONDITION $ ) @@ -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) diff --git a/src/gromacs/CMakeLists.txt b/src/gromacs/CMakeLists.txt index 962c2b558c..df2147579d 100644 --- a/src/gromacs/CMakeLists.txt +++ b/src/gromacs/CMakeLists.txt @@ -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 $) diff --git a/src/gromacs/mdrunutility/tests/CMakeLists.txt b/src/gromacs/mdrunutility/tests/CMakeLists.txt index 1a95671662..900eee12c5 100644 --- a/src/gromacs/mdrunutility/tests/CMakeLists.txt +++ b/src/gromacs/mdrunutility/tests/CMakeLists.txt @@ -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 diff --git a/src/gromacs/onlinehelp/tests/CMakeLists.txt b/src/gromacs/onlinehelp/tests/CMakeLists.txt index ad53c3b6dd..a22b6e83cd 100644 --- a/src/gromacs/onlinehelp/tests/CMakeLists.txt +++ b/src/gromacs/onlinehelp/tests/CMakeLists.txt @@ -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 diff --git a/src/gromacs/trajectoryanalysis/tests/CMakeLists.txt b/src/gromacs/trajectoryanalysis/tests/CMakeLists.txt index cca089f314..0cf6309461 100644 --- a/src/gromacs/trajectoryanalysis/tests/CMakeLists.txt +++ b/src/gromacs/trajectoryanalysis/tests/CMakeLists.txt @@ -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}) diff --git a/src/gmxpre.h b/src/include/gmxpre.h similarity index 98% rename from src/gmxpre.h rename to src/include/gmxpre.h index 10353266f1..514932f3a0 100644 --- a/src/gmxpre.h +++ b/src/include/gmxpre.h @@ -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. diff --git a/src/programs/CMakeLists.txt b/src/programs/CMakeLists.txt index 5797b1de82..343202ca15 100644 --- a/src/programs/CMakeLists.txt +++ b/src/programs/CMakeLists.txt @@ -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) diff --git a/src/testutils/CMakeLists.txt b/src/testutils/CMakeLists.txt index 2d96c50053..8b4c6f16b2 100644 --- a/src/testutils/CMakeLists.txt +++ b/src/testutils/CMakeLists.txt @@ -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}) diff --git a/src/testutils/TestMacros.cmake b/src/testutils/TestMacros.cmake index 70dd60e036..e5c4c33190 100644 --- a/src/testutils/TestMacros.cmake +++ b/src/testutils/TestMacros.cmake @@ -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) -- 2.22.0