Skip to content

Commit

Permalink
CMake Refactor (#2403)
Browse files Browse the repository at this point in the history
* cmake: Made EspressoConfig into separate target.

* cmake: Limit scope of gsl dependency

* core: Moved fft to electrostatics_magnetostatics

* cmake: Limit scope of fftw3 dependency

* cmake: Limit scope of scafacos dependency

* Missing files

* Formatting

* config: Fixed python import path

* cmake: Fixed version symbols

* Fixed regression

* core: throw from Scafacos instead of runtimeError

* scafacos...

* ...

* core: Removed Shapes::Maze

* doc: Removed Maze docs

* cmake: Explicit dependencies for unit tests.

* shapes: Made Shape::SlitPore middle plain settable

* script_interface: Removed interface fore Shapes::Maze

* cmake: Removed 'LIBRARIES'

* cmake: Move up definition of 'unit_test'

* cmake: Removed core sublibraries with cyclic deps

* cmake: Removed core sublibraries with cyclic deps (cuda)

* Formatting

* cmake: Build cpp files in cuda modules with host compiler.

* cmake: Require cmake 3.10

* cmake: Guard h5md linking. Moved Vector to utils folder

* Formatting

* cmake: Single target for core including CXX and CUDA

* core: Split up serialization into core and utils

* cmake: Formatting and buidl cuda interface only when CUDA

* cmake: Cleanup

* Formatting

* cmake: Removed binary dir include dir

* cmake: scafacos needs mpi

* cmake: Removed last include_directories

* core: Moved Scafacos out of core.

* core: Fixed regression

* Formatting

* testsuite: Fixed unit test include paths/deps

* cmake: Support MPI imported target on older cmake.

* cmake: Reduce required version to 3.4

* cmake: Reintrooduce MPI bug workaround.

* cmake: Fixed build on ubuntu:xenial

* cmake: Added FindCUDA from cmake 3.9 for imported target support.

* cmake: Fixed dependency for unit tests

* cmake: Added add_gpu_library abstraction for all ways to build cuda.

* cmake: Fixed gpu arch when building cuda with clang.

* cmake: Removed no longer needed FindHDF5

* cmake: Fixed regression

* cmake: Removed cmake version requirement in subdir.

* doc: Document SlitPore.dividing_plane

* cmake: Moved stuff around
  • Loading branch information
fweik committed Jan 22, 2019
1 parent 9ba67ea commit f8f33a4
Show file tree
Hide file tree
Showing 168 changed files with 3,223 additions and 1,723 deletions.
134 changes: 58 additions & 76 deletions CMakeLists.txt
Expand Up @@ -18,14 +18,14 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#

cmake_minimum_required(VERSION 3.0)
cmake_minimum_required(VERSION 3.4)
include(FeatureSummary)
project(ESPResSo)
include(cmake/FindPythonModule.cmake)

enable_language(CXX)

set(PROJECT_VERSION "4.0-dev")
set(PROJECT_VERSION "4.1-dev")
string(REGEX REPLACE "^([1-9]+)\\.[0-9]+.*$" "\\1" SOVERSION "${PROJECT_VERSION}")
if (NOT ${SOVERSION} MATCHES "^[1-9]+$")
message(FATAL_ERROR "Could not determind SOVERSION from ${PROJECT_VERSION}")
Expand All @@ -38,27 +38,10 @@ endif (NOT ${SOVERSION} MATCHES "^[1-9]+$")
# Cmake modules/macros are in a subdirectory to keep this file cleaner
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)

# If the version is smaller than 3.4, use custom find HDF5 module
# else, use prefer parallel feature of default module.
if(CMAKE_VERSION VERSION_LESS 3.4)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
${CMAKE_CURRENT_SOURCE_DIR}/cmake/hdf5)
else()
set(HDF5_PREFER_PARALLEL 1)
endif()

if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)
endif(NOT CMAKE_BUILD_TYPE)

# Parse repository info from git if available
include(version)

configure_file(
${CMAKE_SOURCE_DIR}/src/version.hpp.in
${CMAKE_BINARY_DIR}/src/version.hpp
)

# On Mac OS X, first look for other packages, then frameworks
set(CMAKE_FIND_FRAMEWORK LAST)

Expand All @@ -68,14 +51,14 @@ set(CMAKE_FIND_FRAMEWORK LAST)

set(WITH_PYTHON yes)

option(WITH_GSL "Build with GSL support" ON)
option(WITH_GSL "Build with GSL support" ON)
option(WITH_CUDA "Build with GPU support" ON)
option(WITH_HDF5 "Build with HDF5 support" ON)
option(WITH_TESTS "Enable tests" ON)
option(WITH_SCAFACOS "Build with Scafacos support" OFF)
option(WITH_BENCHMARKS "Enable benchmarks" OFF)
option(WITH_VALGRIND_INSTRUMENTATION "Build with valgrind instrumentation markers" OFF)
if( CMAKE_VERSION VERSION_GREATER 3.5.2 AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang" )
if(CMAKE_VERSION VERSION_GREATER 3.5.2 AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
option(WITH_CLANG_TIDY "Run Clang-Tidy during compilation" OFF)
endif()
if( CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU" )
Expand All @@ -93,12 +76,7 @@ if(WITH_CCACHE)
find_program(CCACHE ccache)
if(CCACHE)
message(STATUS "Found ccache ${CCACHE}")
if(CMAKE_VERSION VERSION_LESS 3.4)
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE})
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE})
else()
set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE} CACHE STRING "ccache executable")
endif()
set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE} CACHE STRING "ccache executable")
else()
message(FATAL_ERROR "ccache not found.")
endif(CCACHE)
Expand Down Expand Up @@ -153,19 +131,9 @@ if (WITH_CUDA)
endif()
find_library(CUDART_LIBRARY NAMES cudart PATHS ${CUDA_DIR}/lib64 ${CUDA_DIR}/lib /usr/local/nvidia/lib NO_DEFAULT_PATH)
find_library(CUFFT_LIBRARY NAMES cufft PATHS ${CUDA_DIR}/lib64 ${CUDA_DIR}/lib /usr/local/nvidia/lib NO_DEFAULT_PATH)
list(APPEND LIBRARIES ${CUDART_LIBRARY})
list(APPEND LIBRARIES ${CUFFT_LIBRARY})
set(CUDA 1)

set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} --cuda-gpu-arch=sm_30")
if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 3.8.9)
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} --cuda-gpu-arch=sm_52")
endif()

function(cuda_include_directories)
include_directories(${ARGV})
endfunction()
function(cuda_add_library)
function(add_gpu_library)
set(options STATIC SHARED MODULE EXCLUDE_FROM_ALL)
set(oneValueArgs)
set(multiValueArgs)
Expand All @@ -174,10 +142,18 @@ if (WITH_CUDA)
set_source_files_properties(${ARG_UNPARSED_ARGUMENTS} PROPERTIES LANGUAGE "CXX" COMPILE_FLAGS "${CUDA_NVCC_FLAGS}")
add_library(${ARGV})
set_target_properties(${ARGV0} PROPERTIES LINKER_LANGUAGE "CXX")
target_link_libraries(${ARGV0} ${CUDA_LIBRARY} ${CUDART_LIBRARY})
endfunction()
function(CUDA_ADD_CUFFT_TO_TARGET target)
target_link_libraries(${target} ${CUFFT_LIBRARY})
target_link_libraries(${ARGV0} PRIVATE ${CUDA_LIBRARY} ${CUDART_LIBRARY})
target_link_libraries(${ARGV0} PRIVATE ${CUFFT_LIBRARY})

foreach(file ${ARG_UNPARSED_ARGUMENTS})
if(${file} MATCHES "\\.cu$")
if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 3.8.9)
set_source_files_properties(${file} PROPERTIES COMPILE_FLAGS "--cuda-gpu-arch=sm_30 --cuda-gpu-arch=sm_52")
else()
set_source_files_properties(${file} PROPERTIES COMPILE_FLAGS "--cuda-gpu-arch=sm_30")
endif()
endif()
endforeach()
endfunction()
else()
list(APPEND CMAKE_MODULE_PATH "/opt/rocm/hip/cmake")
Expand All @@ -188,30 +164,26 @@ if (WITH_CUDA)
message(STATUS "Found HIP compiler: ${HIP_HIPCC_EXECUTABLE}")
set(CUDA 1)
list(APPEND HIP_HCC_FLAGS "-Wno-macro-redefined -Wno-duplicate-decl-specifier")
HIP_INCLUDE_DIRECTORIES("${CMAKE_BINARY_DIR}/src/core" "${CMAKE_SOURCE_DIR}/src/core")
function(cuda_include_directories)
HIP_INCLUDE_DIRECTORIES(${ARGV})
endfunction()
function(cuda_add_library)
HIP_ADD_LIBRARY(${ARGV})
set_target_properties(${ARGV0} PROPERTIES LINKER_LANGUAGE HIP)
endfunction()

find_library(ROCFFT_LIB name "rocfft" PATHS "${HIP_ROOT_DIR}/lib")
function(CUDA_ADD_CUFFT_TO_TARGET target)
target_link_libraries(${target} "${ROCFFT_LIB}")

function(add_gpu_library)
hip_add_library(${ARGV})
set_target_properties(${ARGV0} PROPERTIES LINKER_LANGUAGE HIP)
target_link_libraries(${ARGV0} PRIVATE "${ROCFFT_LIB}")
endfunction()
else()
find_package(CUDA 7.0)
if(CUDA_FOUND)
list(APPEND LIBRARIES ${CUDA_CUFFT_LIBRARIES})
list(APPEND LIBRARIES ${CUDA_LIBRARIES})
if(NOT CUDA_NVCC_EXECUTABLE STREQUAL "${CUDA_TOOLKIT_ROOT_DIR}/bin/nvcc")
get_filename_component(NVCC_EXECUTABLE_DIRNAME "${CUDA_NVCC_EXECUTABLE}" DIRECTORY)
get_filename_component(NVCC_EXECUTABLE_DIRNAME "${NVCC_EXECUTABLE_DIRNAME}" DIRECTORY)
message(WARNING "Your nvcc (${CUDA_NVCC_EXECUTABLE}) does not appear to match your CUDA libraries (in ${CUDA_TOOLKIT_ROOT_DIR}). While Espresso will still compile, you might get unexpected crashes. Please point CUDA_TOOLKIT_ROOT_DIR to your CUDA toolkit path, e.g. by adding -DCUDA_TOOLKIT_ROOT_DIR=${NVCC_EXECUTABLE_DIRNAME} to your cmake command.")
endif()
set(CUDA 1)

set(CUDA_LINK_LIBRARIES_KEYWORD PUBLIC)

set(CUDA_NVCC_FLAGS_DEBUG "${CUDA_NVCC_FLAGS_DEBUG} -g -G")
set(CUDA_NVCC_FLAGS_RELEASE "${CUDA_NVCC_FLAGS_RELEASE} -O3 -DNDEBUG")
set(CUDA_NVCC_FLAGS_MINSIZEREL "${CUDA_NVCC_FLAGS_MINSIZEREL} -Os -DNDEBUG")
Expand All @@ -226,6 +198,13 @@ if (WITH_CUDA)
if (CMAKE_OSX_SYSROOT)
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -Xcompiler -isysroot -Xcompiler ${CMAKE_OSX_SYSROOT}")
endif()

function(add_gpu_library)
cuda_add_library(${ARGV})
set_property(TARGET ${ARGV0} PROPERTY CUDA_SEPARABLE_COMPILATION ON)
target_link_libraries(${ARGV0} PRIVATE ${CUDA_CUFFT_LIBRARIES})
endfunction()

endif(CUDA_FOUND)
endif()
endif()
Expand Down Expand Up @@ -258,26 +237,22 @@ endif(WITH_PYTHON)

find_package(FFTW3)
if (FFTW3_FOUND)
include_directories(SYSTEM ${FFTW3_INCLUDE_DIR})
list(APPEND LIBRARIES ${FFTW3_LIBRARIES})
set(FFTW 3)
endif(FFTW3_FOUND)


# If we build either interface turn on script interface
if (WITH_PYTHON)
set(WITH_SCRIPT_INTERFACE ON)
endif()

# We need the parallel hdf5 version!
if (WITH_HDF5)
set(HDF5_PREFER_PARALLEL 1)
find_package(HDF5 "1.8" COMPONENTS C)
if(HDF5_IS_PARALLEL)
set(H5MD 1)
include(FindPythonModule)
find_python_module(h5py)
list(APPEND LIBRARIES ${HDF5_LIBRARIES})
include_directories(SYSTEM ${HDF5_INCLUDE_DIRS})
add_feature_info(HDF5 ON "parallel")
else()
unset(H5MD)
Expand Down Expand Up @@ -327,18 +302,33 @@ if(WITH_VALGRIND_INSTRUMENTATION)
endif(WITH_VALGRIND_INSTRUMENTATION)

#######################################################################
# Process MPI settings
# MPI
#######################################################################

find_package(MPI REQUIRED)
# Workaround for https://gitlab.kitware.com/cmake/cmake/issues/18349
foreach(_MPI_FLAG ${MPI_CXX_COMPILE_FLAGS})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_MPI_FLAG}")
endforeach()
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${MPI_LINK_FLAGS}")
include_directories(SYSTEM ${MPI_INCLUDE_PATH})
list(APPEND LIBRARIES ${MPI_LIBRARIES})
add_definitions(-DH5XX_USE_MPI)

# CMake < 3.9
if(NOT TARGET MPI::MPI_CXX)
add_library(MPI::MPI_CXX IMPORTED INTERFACE)

# Workaround for https://gitlab.kitware.com/cmake/cmake/issues/18349
foreach(_MPI_FLAG ${MPI_CXX_COMPILE_FLAGS})
set_property(TARGET MPI::MPI_CXX
PROPERTY INTERFACE_COMPILE_OPTIONS ${_MPI_FLAG})
endforeach()

set_property(TARGET MPI::MPI_CXX
PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${MPI_CXX_INCLUDE_PATH}")

# Workaround for https://gitlab.kitware.com/cmake/cmake/issues/18349
foreach(_MPI_FLAG ${MPI_CXX_LINK_FLAGS})
set_property(TARGET MPI::MPI_CXX
PROPERTY INTERFACE_LINK_LIBRARIES ${_MPI_FLAG})
endforeach()

set_property(TARGET MPI::MPI_CXX
PROPERTY INTERFACE_LINK_LIBRARIES ${MPI_CXX_LIBRARIES})
endif()

#######################################################################
# Boost
Expand All @@ -361,8 +351,6 @@ else()
endif()

find_package(Boost ${BOOST_MINIMUM_VERSION} REQUIRED ${BOOST_COMPONENTS})
include_directories(SYSTEM ${Boost_INCLUDE_DIRS})
list(APPEND LIBRARIES ${Boost_LIBRARIES})

if(Boost_VERSION VERSION_GREATER 106399 AND Boost_VERSION VERSION_LESS 106500)
# Boost 1.64 has incompatible Serialization and MPI modules, see https://svn.boost.org/trac10/ticket/12723 .
Expand Down Expand Up @@ -392,10 +380,6 @@ set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${PYTHON_INSTDIR}/espressomd")
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
if(CMAKE_VERSION VERSION_LESS 3.1)
include(RequireCXX11)
endif()


if(APPLE)
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -undefined dynamic_lookup")
Expand Down Expand Up @@ -472,7 +456,6 @@ if(WITH_TESTS)
enable_testing()
if(Boost_UNIT_TEST_FRAMEWORK_FOUND)
set(WITH_UNIT_TESTS ON)
list(APPEND LIBRARIES ${Boost_LIBRARIES})
endif(Boost_UNIT_TEST_FRAMEWORK_FOUND)
add_custom_target(check)
add_subdirectory(testsuite)
Expand All @@ -489,7 +472,6 @@ endif(WITH_BENCHMARKS)

add_subdirectory(doc)
add_subdirectory(src)
add_subdirectory(config)

#######################################################################
# Feature summary
Expand Down

0 comments on commit f8f33a4

Please sign in to comment.