Skip to content

Commit

Permalink
Merge pull request OpenChemistry#1264 from cryos/cmake-modern
Browse files Browse the repository at this point in the history
CMake modernization
  • Loading branch information
cryos authored Apr 19, 2023
2 parents d444d4e + f8b6937 commit 795e549
Show file tree
Hide file tree
Showing 67 changed files with 220 additions and 167 deletions.
6 changes: 2 additions & 4 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
cmake_minimum_required(VERSION 3.23 FATAL_ERROR)

project(AvogadroLibs)

Expand Down Expand Up @@ -42,9 +42,6 @@ if(MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zc:__cplusplus")
endif()

include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_BINARY_DIR})

option(ENABLE_TESTING "Enable testing and building the tests." OFF)
option(TEST_QTGL "Build the Qt OpenGL test application" OFF)
option(ENABLE_TRANSLATIONS "Enable building translations with Qt5 Linguist" OFF)
Expand Down Expand Up @@ -122,5 +119,6 @@ if (NOT SKBUILD)
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/Findlibmsym.cmake"
DESTINATION "${INSTALL_LIBRARY_DIR}/cmake/avogadrolibs")
install(EXPORT "AvogadroLibsTargets"
NAMESPACE Avogadro::
DESTINATION "${INSTALL_LIBRARY_DIR}/cmake/avogadrolibs")
endif()
51 changes: 34 additions & 17 deletions avogadro/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,52 +1,69 @@
include(GenerateExportHeader)

# May want to adjust the name, this more performs boilerplate library stuff now.
function(avogadro_add_library name)
add_library(${name} ${ARGN})
# Add an alias target to expose to other targets.
add_library(Avogadro::${name} ALIAS ${name})
# Use the new AUTOMOC support for Qt libraries (CMake 2.8.6).
if(${name} MATCHES "^AvogadroQt")
if(${name} MATCHES "^Qt")
set_target_properties(${name} PROPERTIES AUTOMOC TRUE)
endif()
if(BUILD_SHARED_LIBS)
set_target_properties(${name} PROPERTIES VERSION "${AvogadroLibs_VERSION_MAJOR}.${AvogadroLibs_VERSION_MINOR}.${AvogadroLibs_VERSION_PATCH}"
SOVERSION ${AvogadroLibs_VERSION_MAJOR})
set_target_properties(${name}
PROPERTIES
OUTPUT_NAME Avogadro${name}
VERSION "${AvogadroLibs_VERSION_MAJOR}.${AvogadroLibs_VERSION_MINOR}.${AvogadroLibs_VERSION_PATCH}"
SOVERSION ${AvogadroLibs_VERSION_MAJOR})
endif()
string(TOLOWER ${name} lowerName)
string(TOLOWER ${name} _lower_name)
string(TOUPPER ${name} _upper_name)
# Generate the necessary export headers.
generate_export_header(${name} EXPORT_FILE_NAME ${lowerName}export.h)
list(APPEND HEADERS "${CMAKE_CURRENT_BINARY_DIR}/${lowerName}export.h")
generate_export_header(${name}
BASE_NAME AVOGADRO${_upper_name}
EXPORT_FILE_NAME avogadro${_lower_name}export.h)
target_sources(${name} PUBLIC FILE_SET HEADERS
FILES "${CMAKE_CURRENT_BINARY_DIR}/avogadro${_lower_name}export.h")
# Set up the build and install include directories for the target.
target_include_directories(${name}
PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>"
"$<INSTALL_INTERFACE:${INSTALL_INCLUDE_DIR}>")
# Now install everything.
string(REGEX REPLACE "^avogadro" "" module ${lowerName})
PUBLIC
"$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>"
"$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>"
"$<INSTALL_INTERFACE:${INSTALL_INCLUDE_DIR}>")

# Now install everything.
# SKBUILD is set for binary wheel
if (NOT SKBUILD)
install(FILES ${HEADERS}
DESTINATION "${INSTALL_INCLUDE_DIR}/avogadro/${module}")
else()
if (SKBUILD)
# For MACOSX
set_target_properties(${name} PROPERTIES INSTALL_NAME_DIR "@rpath")
set(INSTALL_RUNTIME_DIR avogadro)
set(INSTALL_LIBRARY_DIR avogadro)
set(INSTALL_ARCHIVE_DIR avogadro)
endif()

# Install the target and its headers.
install(TARGETS ${name}
EXPORT "AvogadroLibsTargets"
FILE_SET HEADERS DESTINATION "${INSTALL_INCLUDE_DIR}"
RUNTIME DESTINATION "${INSTALL_RUNTIME_DIR}"
LIBRARY DESTINATION "${INSTALL_LIBRARY_DIR}"
ARCHIVE DESTINATION "${INSTALL_ARCHIVE_DIR}"
INCLUDES DESTINATION "${INSTALL_INCLUDE_DIR}")
endfunction()

# Simple wrapper to collect boilerplate for adding headers to targets.
function(avogadro_headers _name)
target_sources(${_name} PUBLIC
FILE_SET HEADERS
BASE_DIRS ${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR}
FILES ${ARGN})
endfunction()

add_subdirectory(core)
add_subdirectory(calc)
add_subdirectory(io)
add_subdirectory(quantumio)
# SKBUILD is set for binary wheel
if (NOT SKBUILD)
if(NOT SKBUILD)
add_subdirectory(command)
endif()
if(USE_OPENGL)
Expand Down
12 changes: 7 additions & 5 deletions avogadro/calc/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,21 @@ find_package(Eigen3 REQUIRED)
# compilers that support that notion.
include_directories(SYSTEM "${EIGEN3_INCLUDE_DIR}")

set(HEADERS
add_library(Calc)

avogadro_headers(Calc
chargemodel.h
chargemanager.h
defaultmodel.h
)

set(SOURCES
target_sources(Calc PRIVATE
chargemodel.cpp
chargemanager.cpp
defaultmodel.cpp
)

avogadro_add_library(AvogadroCalc ${HEADERS} ${SOURCES})
avogadro_add_library(Calc)

target_link_libraries(AvogadroCalc
PUBLIC AvogadroCore)
target_link_libraries(Calc
PUBLIC Avogadro::Core)
6 changes: 3 additions & 3 deletions avogadro/command/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ find_package(Eigen3 REQUIRED)
include_directories(SYSTEM "${EIGEN3_INCLUDE_DIR}")

add_executable(avocjsontocml cjsontocml.cpp)
target_link_libraries(avocjsontocml AvogadroIO)
target_link_libraries(avocjsontocml Avogadro::IO)

add_executable(avobabel avobabel.cpp)
target_link_libraries(avobabel AvogadroIO)
target_link_libraries(avobabel Avogadro::IO)

add_executable(qube qube.cpp)
target_link_libraries(qube AvogadroQuantumIO AvogadroIO)
target_link_libraries(qube Avogadro::QuantumIO)
62 changes: 40 additions & 22 deletions avogadro/core/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,42 @@ endif()
configure_file("${PROJECT_SOURCE_DIR}/cmake/version.h.in"
"${CMAKE_CURRENT_BINARY_DIR}/version.h")

set(HEADERS
angletools.h
angleiterator.h
array.h
# Separate out header only components into an interface library.
add_library(Headers INTERFACE)
add_library(Avogadro::Headers ALIAS Headers)
target_include_directories(Headers
INTERFACE
"$<INSTALL_INTERFACE:${INSTALL_INCLUDE_DIR}>")

target_sources(Headers PUBLIC
FILE_SET HEADERS
BASE_DIRS ${PROJECT_SOURCE_DIR}
FILES
angletools.h
angleiterator.h
array.h
avogadrocore.h
color3f.h
coordinateset.h
matrix.h
types.h
utilities.h
vector.h
)
install(TARGETS Headers
EXPORT "AvogadroLibsTargets"
FILE_SET HEADERS DESTINATION "${INSTALL_INCLUDE_DIR}")

# Now add the main core library for Avogadro.
add_library(Core)

avogadro_headers(Core
atom.h
atomtyper.h
atomtyper-inline.h
atomutilities.h
avogadrocore.h
basisset.h
bond.h
color3f.h
coordinateset.h
coordinateblockgenerator.h
crystaltools.h
cube.h
Expand All @@ -35,7 +58,6 @@ set(HEADERS
graph.h
layer.h
layermanager.h
matrix.h
mesh.h
molecule.h
mutex.h
Expand All @@ -48,17 +70,14 @@ set(HEADERS
slatersettools.h
spacegroups.h
symbolatomtyper.h
types.h
unitcell.h
utilities.h
variant.h
variant-inline.h
variantmap.h
vector.h
"${CMAKE_CURRENT_BINARY_DIR}/version.h"
)

set(SOURCES
target_sources(Core PRIVATE
angleiterator.cpp
atomutilities.cpp
coordinateblockgenerator.cpp
Expand Down Expand Up @@ -91,23 +110,22 @@ set(SOURCES

# We currently build core without shared_mutex for Python wheels.
if(NOT PYTHON_WHEEL_BUILD)
list(APPEND HEADERS sharedmutex.h)
list(APPEND SOURCES sharedmutex.cpp)
avogadro_headers(Core sharedmutex.h)
target_sources(Core PRIVATE sharedmutex.cpp)
endif()

if(USE_SPGLIB)
list(APPEND HEADERS avospglib.h)
list(APPEND SOURCES avospglib.cpp)
avogadro_headers(Core avospglib.h)
target_sources(Core PRIVATE avospglib.cpp)
endif()

# The std::shared_mutex class needs pthreads on Linux.
if(UNIX AND NOT APPLE AND NOT PYTHON_WHEEL_BUILD)
find_package(Threads)
set(EXTRA_LINK_LIB ${CMAKE_THREAD_LIBS_INIT})
else()
set(EXTRA_LINK_LIB "")
target_link_libraries(Core PRIVATE ${CMAKE_THREAD_LIBS_INIT})
endif()

avogadro_add_library(AvogadroCore ${HEADERS} ${SOURCES})
target_link_libraries(AvogadroCore
PRIVATE ${SPGLIB_LIBRARY} ${EXTRA_LINK_LIB})
avogadro_add_library(Core)
target_link_libraries(Core
PUBLIC Avogadro::Headers
PRIVATE ${SPGLIB_LIBRARY})
26 changes: 13 additions & 13 deletions avogadro/io/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@ if(DEFINED AvogadroLibs_MEMORY_INCLUDE_DIRS)
include_directories(SYSTEM ${AvogadroLibs_MEMORY_INCLUDE_DIRS})
endif()

set(HEADERS
add_library(IO)

avogadro_headers(IO
cjsonformat.h
cmlformat.h
dcdformat.h
Expand All @@ -45,7 +47,7 @@ set(HEADERS
lammpsformat.h
)

set(SOURCES
target_sources(IO PRIVATE
cjsonformat.cpp
cmlformat.cpp
dcdformat.cpp
Expand All @@ -62,23 +64,21 @@ set(SOURCES
)

if(USE_HDF5)
list(APPEND HEADERS hdf5dataformat.h)
list(APPEND SOURCES hdf5dataformat.cpp)
avogadro_headers(IO hdf5dataformat.h)
target_sources(IO PRIVATE hdf5dataformat.cpp)
target_link_libraries(IO PRIVATE ${HDF5_LIBRARIES})
endif()

if(USE_MMTF)
list(APPEND HEADERS mmtfformat.h)
list(APPEND SOURCES mmtfformat.cpp)
avogadro_headers(IO mmtfformat.h)
target_sources(IO PRIVATE mmtfformat.cpp)
endif()

avogadro_add_library(AvogadroIO ${HEADERS} ${SOURCES})
avogadro_add_library(IO)

target_link_libraries(AvogadroIO
PUBLIC AvogadroCore
target_link_libraries(IO
PUBLIC Avogadro::Core
PRIVATE struct)
if(USE_HDF5)
target_link_libraries(AvogadroIO PRIVATE ${HDF5_LIBRARIES})
endif()
if(WIN32)
target_link_libraries(AvogadroIO PRIVATE ws2_32)
target_link_libraries(IO PRIVATE ws2_32)
endif()
16 changes: 9 additions & 7 deletions avogadro/molequeue/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ else()
find_package(Qt5 COMPONENTS Widgets Network REQUIRED)
endif()

set(HEADERS
add_library(MoleQueue)

avogadro_headers(MoleQueue
batchjob.h
inputgenerator.h
inputgeneratordialog.h
Expand All @@ -20,7 +22,7 @@ set(HEADERS
molequeuewidget.h
)

set(SOURCES
target_sources(MoleQueue PRIVATE
batchjob.cpp
inputgenerator.cpp
inputgeneratordialog.cpp
Expand All @@ -41,11 +43,11 @@ set(UIS
molequeuewidget.ui
)
qt_wrap_ui(UI_SOURCES ${UIS})
list(APPEND SOURCES ${UI_SOURCES})
target_sources(MoleQueue PRIVATE ${UI_SOURCES})

avogadro_add_library(AvogadroMoleQueue ${HEADERS} ${SOURCES})
set_target_properties(AvogadroMoleQueue PROPERTIES AUTOMOC TRUE)
target_link_libraries(AvogadroMoleQueue PUBLIC AvogadroQtGui Qt::Widgets Qt::Network)
avogadro_add_library(MoleQueue ${HEADERS} ${SOURCES})
set_target_properties(MoleQueue PROPERTIES AUTOMOC TRUE)
target_link_libraries(MoleQueue PUBLIC Avogadro::QtGui Qt::Widgets Qt::Network)
if(QT_VERSION EQUAL 6)
target_link_libraries(AvogadroMoleQueue PRIVATE Qt6::Core5Compat)
target_link_libraries(MoleQueue PRIVATE Qt6::Core5Compat)
endif()
16 changes: 9 additions & 7 deletions avogadro/qtgui/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@ static const char *pythonInterpreterPath = \"${PYTHON_EXECUTABLE}\";
configure_file("${CMAKE_CURRENT_BINARY_DIR}/avogadropython.h.in"
"${CMAKE_CURRENT_BINARY_DIR}/avogadropython.h")

set(HEADERS
add_library(QtGui)

avogadro_headers(QtGui
backgroundfileformat.h
colorbutton.h
containerwidget.h
Expand Down Expand Up @@ -68,7 +70,7 @@ set(HEADERS
viewfactory.h
)

set(SOURCES
target_sources(QtGui PRIVATE
backgroundfileformat.cpp
colorbutton.cpp
containerwidget.cpp
Expand Down Expand Up @@ -107,16 +109,16 @@ set(UIS
customelementdialog.ui
)
qt_wrap_ui(UI_SOURCES ${UIS})
list(APPEND SOURCES ${UI_SOURCES})
target_sources(QtGui PRIVATE ${UI_SOURCES})

set(RCS
qtgui.qrc
)
qt_add_resources(RC_SOURCES ${RCS})
list(APPEND SOURCES ${RC_SOURCES})
target_sources(QtGui PRIVATE ${RC_SOURCES})

avogadro_add_library(AvogadroQtGui ${HEADERS} ${SOURCES})
target_link_libraries(AvogadroQtGui PUBLIC AvogadroIO Qt::Widgets)
avogadro_add_library(QtGui)
target_link_libraries(QtGui PUBLIC Avogadro::IO Qt::Widgets)
if(QT_VERSION EQUAL 6)
target_link_libraries(AvogadroQtGui PRIVATE Qt6::Core5Compat)
target_link_libraries(QtGui PRIVATE Qt6::Core5Compat)
endif()
Loading

0 comments on commit 795e549

Please sign in to comment.