Skip to content

Commit

Permalink
Merge pull request #18 from SeisSol/lukas/improve-cmake
Browse files Browse the repository at this point in the history
Fix cmake installation and add semantic versioning
  • Loading branch information
krenzland committed Jan 24, 2022
2 parents 69dd89a + ccbc36b commit 3437721
Show file tree
Hide file tree
Showing 10 changed files with 170 additions and 73 deletions.
188 changes: 125 additions & 63 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,30 +1,58 @@
project (easi)
cmake_minimum_required (VERSION 3.13)
project(easi)
cmake_minimum_required(VERSION 3.13)
set(EASI_VERSION_MAJOR 1)
set(EASI_VERSION_MINOR 0)
set(EASI_VERSION_PATCH 0)

include (GNUInstallDirs)
include (CMakePackageConfigHelpers)

enable_language (CXX)
enable_language (Fortran)
include(GNUInstallDirs)
include(CMakePackageConfigHelpers)

option (ASAGI "Enable support for ASAGI" ON)
enable_language(CXX)
enable_language(Fortran)

### external packages ###
option(ASAGI "Enable support for ASAGI" ON)

find_package (yaml-cpp REQUIRED)
find_package (impalajit REQUIRED)
find_package (OpenMP)
option(IMPALAJIT "Use ImpalaJIT" ON)
set(IMPALAJIT_BACKEND original CACHE STRING "Which backend to use")
set(IMPALAJIT_BACKEND_OPTIONS original llvm)
set_property(CACHE IMPALAJIT_BACKEND PROPERTY STRINGS ${IMPALAJIT_BACKEND_OPTIONS})

if (ASAGI)
function(check_parameter parameter_name value options)

list(FIND options ${value} INDEX)

set(WRONG_PARAMETER -1)
if (${INDEX} EQUAL ${WRONG_PARAMETER})
message(FATAL_ERROR "${parameter_name} is wrong. Specified \"${value}\". Allowed: ${options}")
endif()

endfunction()
check_parameter("IMPALAJIT_BACKEND" "${IMPALAJIT_BACKEND}" "${IMPALAJIT_BACKEND_OPTIONS}")

### external packages ###

find_package(yaml-cpp 0.6 REQUIRED)
find_package(OpenMP)

if(IMPALAJIT)
if (IMPALAJIT_BACKEND STREQUAL llvm)
find_package(ImpalaJIT-LLVM 1.0 REQUIRED)
else()
find_package (impalajit REQUIRED)
endif()
endif()

if(ASAGI)
find_package (PkgConfig REQUIRED)
find_package (HDF5 REQUIRED COMPONENTS C HL)
pkg_check_modules (NETCDF REQUIRED IMPORTED_TARGET netcdf)
pkg_check_modules (ASAGI REQUIRED IMPORTED_TARGET asagi)
endif ()
endif()

### easi lib ###

set (EASI_SOURCES
set(EASI_SOURCES
src/component/AffineMap.cpp
src/component/AndersonianStress.cpp
src/component/Composite.cpp
Expand All @@ -45,39 +73,51 @@ set (EASI_SOURCES
src/Query.cpp
src/YAMLParser.cpp
)
if (ASAGI)
list (APPEND EASI_SOURCES
if(ASAGI)
list(APPEND EASI_SOURCES
src/component/ASAGI.cpp
src/util/AsagiReader.cpp
)
endif ()
endif()

add_library (easi ${EASI_SOURCES})
target_compile_features (easi PUBLIC cxx_std_14)
add_library(easi ${EASI_SOURCES})
target_compile_features(easi PUBLIC cxx_std_14)
set_target_properties(easi PROPERTIES
CXX_STANDARD 14
CXX_STANDARD_REQUIRED ON
CXX_EXTENSIONS OFF
)
target_link_libraries (easi
target_link_libraries(easi
PUBLIC
yaml-cpp
PRIVATE
impalajit::impalajit
)
if (${OpenMP_CXX_FOUND})
target_link_libraries (easi PRIVATE OpenMP::OpenMP_CXX)
endif ()
if (ASAGI)
target_link_libraries (easi
PRIVATE
if(${OpenMP_CXX_FOUND})
target_link_libraries(easi PRIVATE OpenMP::OpenMP_CXX)
endif()
if(ASAGI)
find_package(MPI REQUIRED)
target_link_libraries(easi
PUBLIC
${HDF5_C_HL_LIBRARIES} ${HDF5_C_LIBRARIES}
PkgConfig::ASAGI
PkgConfig::NETCDF
)
target_compile_definitions (easi PUBLIC -DUSE_ASAGI)
endif ()
target_include_directories (easi
target_link_libraries(easi
PRIVATE
MPI::MPI_CXX
)
target_compile_definitions(easi PRIVATE -DEASI_USE_ASAGI)
endif()
if (IMPALAJIT)
if (IMPALAJIT_LLVM)
target_link_libraries(easi PRIVATE llvm::impalajit)
else()
target_link_libraries(easi PRIVATE impalajit::impalajit)
endif()
target_compile_definitions(easi PRIVATE -DEASI_USE_IMPALAJIT)
endif()

target_include_directories(easi
PUBLIC
$<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
Expand All @@ -86,70 +126,92 @@ target_include_directories (easi
)

# installation
set_target_properties(easi PROPERTIES INSTALL_RPATH_USE_LINK_PATH True)

set(CONFIG_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/easi)

install (TARGETS easi EXPORT easi-targets
install(TARGETS easi EXPORT easi-targets
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
install (DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install (EXPORT easi-targets
install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(EXPORT easi-targets
FILE easiTargets.cmake
NAMESPACE easi::
DESTINATION ${CONFIG_DESTINATION}
)

configure_package_config_file (
cmake/easiConfig.cmake.in

# Replace variables in script
# Note: Configure file also replaces @PACKAGE_INIT@, we don't want that
set(PACKAGE_INIT_OLD "${PACKAGE_INIT}")
set(PACKAGE_INIT "@PACKAGE_INIT@")
configure_file(cmake/easiConfig.cmake.in cmake/easiConfig.cmake @ONLY)
set(PACKAGE_INIT "${PACKAGE_INIT_OLD}")
unset(PACKAGE_INIT_OLD)

configure_package_config_file(
"${CMAKE_CURRENT_BINARY_DIR}/cmake/easiConfig.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/easiConfig.cmake"
INSTALL_DESTINATION ${CONFIG_DESTINATION}
)
install (
FILES "${CMAKE_CURRENT_BINARY_DIR}/easiConfig.cmake"

write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/easiConfigVersion.cmake"
VERSION ${EASI_VERSION_MAJOR}.${EASI_VERSION_MINOR}.${EASI_VERSION_PATCH}
COMPATIBILITY SameMajorVersion
)
install(
FILES
"${CMAKE_CURRENT_BINARY_DIR}/easiConfig.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/easiConfigVersion.cmake"
DESTINATION ${CONFIG_DESTINATION}
)


### easicube ###

if (ASAGI)
if(ASAGI)
add_executable (easicube tools/easicube.cpp)
target_link_libraries(easicube PRIVATE easi)
set_target_properties (easicube PROPERTIES
INSTALL_RPATH_USE_LINK_PATH TRUE
)
install (TARGETS easicube)
endif ()
endif()


### tests ###

enable_testing ()
add_library (easitest
enable_testing()
add_library(easitest
tests/easitest.cpp
tests/special.f90
)
target_link_libraries(easitest PUBLIC easi)

function (easi_add_test name)
add_executable (${name} tests/${name}.cpp)
target_link_libraries (${name} PRIVATE easitest)
string (TOUPPER ${name} NAME_UP)
add_test (${NAME_UP}_TEST ${name} ${CMAKE_CURRENT_SOURCE_DIR}/examples/${name}.yaml)
endfunction (easi_add_test)

easi_add_test (0_constant)
easi_add_test (1_groups)
easi_add_test (2_prem)
easi_add_test (3_layered_linear)
easi_add_test (5_function)
easi_add_test (26_function)
easi_add_test (33_layered_constant)
if (ASAGI)
easi_add_test (101_asagi)
easi_add_test (101_asagi_nearest)
function(easi_add_test name)
add_executable(${name} tests/${name}.cpp)
target_link_libraries(${name} PRIVATE easitest)
string(TOUPPER ${name} NAME_UP)
add_test(${NAME_UP}_TEST ${name} ${CMAKE_CURRENT_SOURCE_DIR}/examples/${name}.yaml)
endfunction(easi_add_test)

easi_add_test(0_constant)
easi_add_test(1_groups)
easi_add_test(3_layered_linear)
easi_add_test(33_layered_constant)

if(IMPALA)
easi_add_test(2_prem)
easi_add_test(5_function)
easi_add_test(26_function)
easi_add_test(f_16_scec)
easi_add_test(f_120_sumatra)
easi_add_test(supplied_parameters)
endif()

if(ASAGI)
easi_add_test(101_asagi)
easi_add_test(101_asagi_nearest)
endif ()
easi_add_test (f_16_scec)
easi_add_test (f_120_sumatra)
easi_add_test (supplied_parameters)

26 changes: 22 additions & 4 deletions cmake/easiConfig.cmake.in
Original file line number Diff line number Diff line change
@@ -1,8 +1,26 @@
include (CMakeFindDependencyMacro)
@PACKAGE_INIT@
set(EASI_IMPALAJIT_BACKEND @IMPALAJIT_BACKEND@)
set(EASI_IMPALAJIT @IMPALAJIT@)
set(EASI_ASAGI @ASAGI@)

find_dependency (yaml-cpp REQUIRED)
find_dependency (impalajit REQUIRED)
find_dependency (OpenMP)
include(CMakeFindDependencyMacro)

find_dependency(OpenMP)
find_dependency(yaml-cpp 0.6 REQUIRED)

if (EASI_IMPALAJIT)
if (EASI_IMPALAJIT_BACKEND STREQUAL llvm)
find_package(ImpalaJIT-LLVM 1.0 REQUIRED)
else()
find_package (impalajit REQUIRED)
endif()
endif()

if (EASI_ASAGI)
find_dependency(PkgConfig)
pkg_check_modules(ASAGI REQUIRED IMPORTED_TARGET asagi)
pkg_check_modules(NETCDF REQUIRED IMPORTED_TARGET netcdf)
endif()

if (NOT TARGET easi::easi)
include ("${CMAKE_CURRENT_LIST_DIR}/easiTargets.cmake")
Expand Down
3 changes: 3 additions & 0 deletions include/easi/component/FunctionMap.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#ifndef EASI_COMPONENT_FUNCTIONMAP_H_
#define EASI_COMPONENT_FUNCTIONMAP_H_

#ifdef EASI_USE_IMPALAJIT
#include "easi/component/Map.h"
#include "easi/util/FunctionWrapper.h"
#include "easi/util/Matrix.h"
Expand Down Expand Up @@ -31,4 +32,6 @@ class FunctionMap : public Map {

} // namespace easi

#endif // EASI_USE_IMPALAJIT

#endif
6 changes: 4 additions & 2 deletions include/easi/parser/YAMLComponentParsers.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
#include "easi/parser/YAMLAbstractParser.h"
#include "easi/parser/YAMLHelpers.h"

#ifdef USE_ASAGI
#ifdef EASI_USE_ASAGI
#include "easi/component/ASAGI.h"
#endif

Expand Down Expand Up @@ -53,13 +53,15 @@ void parse_ConstantMap(ConstantMap* component, YAML::Node const& node,
std::set<std::string> const& in, YAMLAbstractParser* parser);
void parse_AffineMap(AffineMap* component, YAML::Node const& node, std::set<std::string> const& in,
YAMLAbstractParser* parser);
#ifdef EASI_USE_IMPALAJIT
void parse_FunctionMap(FunctionMap* component, YAML::Node const& node,
std::set<std::string> const& in, YAMLAbstractParser* parser);
#endif
void parse_PolynomialMap(PolynomialMap* component, YAML::Node const& node,
std::set<std::string> const& in, YAMLAbstractParser* parser);
void parse_SCECFile(SCECFile* component, YAML::Node const& node, std::set<std::string> const& in,
YAMLAbstractParser* parser);
#ifdef USE_ASAGI
#ifdef EASI_USE_ASAGI
void parse_ASAGI(ASAGI* component, YAML::Node const& node, std::set<std::string> const& in,
YAMLAbstractParser* parser);
#endif
Expand Down
2 changes: 2 additions & 0 deletions include/easi/util/FunctionWrapper.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#ifndef EASI_UTIL_FUNCTIONWRAPPER_H_
#define EASI_UTIL_FUNCTIONWRAPPER_H_

#ifdef EASI_USE_IMPALAJIT
#include <impalajit/types.hh>

namespace easi {
Expand All @@ -11,5 +12,6 @@ typedef double (*function_wrapper_t)(dasm_gen_func, Matrix<double> const&, unsig
function_wrapper_t getFunctionWrapper(unsigned dimDomain);

} // namespace easi
#endif // EASI_USE_IMPALAJIT

#endif
6 changes: 4 additions & 2 deletions src/YAMLParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#include "easi/component/Special.h"
#include "easi/parser/YAMLComponentParsers.h"

#ifdef USE_ASAGI
#ifdef EASI_USE_ASAGI
#include "easi/util/AsagiReader.h"
#else
namespace easi {
Expand All @@ -31,9 +31,11 @@ YAMLParser::YAMLParser(unsigned dimDomain, AsagiReader* externalAsagiReader, cha
registerType("!AxisAlignedCuboidalDomainFilter", parse_AxisAlignedCuboidalDomainFilter);
registerType("!SphericalDomainFilter", parse_SphericalDomainFilter);
registerType("!AffineMap", parse_AffineMap);
#ifdef EASI_USE_IMPALAJIT
registerType("!FunctionMap", parse_FunctionMap);
#endif
registerType("!SCECFile", parse_SCECFile);
#ifdef USE_ASAGI
#ifdef EASI_USE_ASAGI
registerType("!ASAGI", parse_ASAGI);
#endif
registerType("!LayeredModel", create_LayeredModel);
Expand Down
2 changes: 2 additions & 0 deletions src/component/FunctionMap.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#ifdef EASI_USE_IMPALAJIT
#include "easi/component/FunctionMap.h"

#include <impalajit.hh>
Expand Down Expand Up @@ -63,3 +64,4 @@ void FunctionMap::setMap(std::set<std::string> const& in, OutMap const& function
}

} // namespace easi
#endif // EASI_USE_IMPALAJIT

0 comments on commit 3437721

Please sign in to comment.