diff --git a/external/class.cmake b/external/class.cmake index ab2e691..0a3f3c2 100644 --- a/external/class.cmake +++ b/external/class.cmake @@ -1,75 +1,139 @@ -# initialize the class submodule if necessary -if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/class/Makefile") - message(STATUS "class submodule is initialized.") -else() - message(STATUS "class submodule is NOT initialized: executing git command") - execute_process(COMMAND git submodule update --init -- external/class - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) -endif() +option(ENABLE_CLASS "Enable CLASS support (as a submodule)." ON) -set(CLASS_INCLUDE_DIR ${CMAKE_CURRENT_LIST_DIR}/class/include) -set(CLASS_INCLUDE_CPP_DIR ${CMAKE_CURRENT_LIST_DIR}/class/cpp) +if(ENABLE_CLASS) -# list of object files generated by class -set(CLASS_OBJECT_FILES - ${CMAKE_CURRENT_LIST_DIR}/class/build/arrays.o - ${CMAKE_CURRENT_LIST_DIR}/class/build/background.o - ${CMAKE_CURRENT_LIST_DIR}/class/build/common.o - ${CMAKE_CURRENT_LIST_DIR}/class/build/dei_rkck.o - ${CMAKE_CURRENT_LIST_DIR}/class/build/evolver_ndf15.o - ${CMAKE_CURRENT_LIST_DIR}/class/build/evolver_rkck.o - ${CMAKE_CURRENT_LIST_DIR}/class/build/growTable.o - ${CMAKE_CURRENT_LIST_DIR}/class/build/helium.o - ${CMAKE_CURRENT_LIST_DIR}/class/build/history.o - ${CMAKE_CURRENT_LIST_DIR}/class/build/hydrogen.o - ${CMAKE_CURRENT_LIST_DIR}/class/build/hyperspherical.o - ${CMAKE_CURRENT_LIST_DIR}/class/build/hyrectools.o - ${CMAKE_CURRENT_LIST_DIR}/class/build/input.o - ${CMAKE_CURRENT_LIST_DIR}/class/build/lensing.o - ${CMAKE_CURRENT_LIST_DIR}/class/build/nonlinear.o - ${CMAKE_CURRENT_LIST_DIR}/class/build/output.o - ${CMAKE_CURRENT_LIST_DIR}/class/build/parser.o - ${CMAKE_CURRENT_LIST_DIR}/class/build/perturbations.o - ${CMAKE_CURRENT_LIST_DIR}/class/build/primordial.o - ${CMAKE_CURRENT_LIST_DIR}/class/build/quadrature.o - ${CMAKE_CURRENT_LIST_DIR}/class/build/sparse.o - ${CMAKE_CURRENT_LIST_DIR}/class/build/spectra.o - ${CMAKE_CURRENT_LIST_DIR}/class/build/thermodynamics.o - ${CMAKE_CURRENT_LIST_DIR}/class/build/transfer.o -) + # initialize the class submodule if necessary + if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/class/Makefile") + message(STATUS "class submodule is initialized.") + else() + message(STATUS "class submodule is NOT initialized: executing git command") + execute_process(COMMAND git submodule update --init -- external/class + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) + endif() -# python3 -find_package(Python3 REQUIRED COMPONENTS Interpreter) + # include directories + set(CLASS_INCLUDE_DIR ${CMAKE_CURRENT_LIST_DIR}/class/include) + set(CLASS_INCLUDE_CPP_DIR ${CMAKE_CURRENT_LIST_DIR}/class/cpp) -# command to build class using its own makefile -add_custom_command(OUTPUT ${CLASS_OBJECT_FILES} - COMMAND PYTHON=${Python3_EXECUTABLE} CC=${CMAKE_C_COMPILER} make - WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/class -) + # build method for class + option(USE_CLASS_MAKEFILE "Build CLASS using its own Makefile." OFF) -# target for class objects -add_custom_target(class_objects DEPENDS ${CLASS_OBJECT_FILES}) + if(USE_CLASS_MAKEFILE) + # list of object files generated by class + set(CLASS_OBJECT_FILES + ${CMAKE_CURRENT_LIST_DIR}/class/build/arrays.o + ${CMAKE_CURRENT_LIST_DIR}/class/build/background.o + ${CMAKE_CURRENT_LIST_DIR}/class/build/common.o + ${CMAKE_CURRENT_LIST_DIR}/class/build/dei_rkck.o + ${CMAKE_CURRENT_LIST_DIR}/class/build/evolver_ndf15.o + ${CMAKE_CURRENT_LIST_DIR}/class/build/evolver_rkck.o + ${CMAKE_CURRENT_LIST_DIR}/class/build/growTable.o + ${CMAKE_CURRENT_LIST_DIR}/class/build/helium.o + ${CMAKE_CURRENT_LIST_DIR}/class/build/history.o + ${CMAKE_CURRENT_LIST_DIR}/class/build/hydrogen.o + ${CMAKE_CURRENT_LIST_DIR}/class/build/hyperspherical.o + ${CMAKE_CURRENT_LIST_DIR}/class/build/hyrectools.o + ${CMAKE_CURRENT_LIST_DIR}/class/build/input.o + ${CMAKE_CURRENT_LIST_DIR}/class/build/lensing.o + ${CMAKE_CURRENT_LIST_DIR}/class/build/nonlinear.o + ${CMAKE_CURRENT_LIST_DIR}/class/build/output.o + ${CMAKE_CURRENT_LIST_DIR}/class/build/parser.o + ${CMAKE_CURRENT_LIST_DIR}/class/build/perturbations.o + ${CMAKE_CURRENT_LIST_DIR}/class/build/primordial.o + ${CMAKE_CURRENT_LIST_DIR}/class/build/quadrature.o + ${CMAKE_CURRENT_LIST_DIR}/class/build/sparse.o + ${CMAKE_CURRENT_LIST_DIR}/class/build/spectra.o + ${CMAKE_CURRENT_LIST_DIR}/class/build/thermodynamics.o + ${CMAKE_CURRENT_LIST_DIR}/class/build/transfer.o + ) -# library for class cpp wrappers -add_library(class_cpp - ${CMAKE_CURRENT_LIST_DIR}/class/cpp/Engine.cc - ${CMAKE_CURRENT_LIST_DIR}/class/cpp/ClassEngine.cc) -target_include_directories(class_cpp - PRIVATE ${CMAKE_CURRENT_LIST_DIR}/class/include) + # python3 + find_package(Python3 REQUIRED COMPONENTS Interpreter) + + # command to build class using its own makefile + add_custom_command(OUTPUT ${CLASS_OBJECT_FILES} + COMMAND PYTHON=${Python3_EXECUTABLE} CC=${CMAKE_C_COMPILER} make + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/class + ) + + # target for class objects + add_custom_target(class_objects DEPENDS ${CLASS_OBJECT_FILES}) + + # library for class cpp wrappers + add_library(class_cpp + ${CMAKE_CURRENT_LIST_DIR}/class/cpp/Engine.cc + ${CMAKE_CURRENT_LIST_DIR}/class/cpp/ClassEngine.cc) + target_include_directories(class_cpp + PRIVATE ${CMAKE_CURRENT_LIST_DIR}/class/include) + else(USE_CLASS_MAKEFILE) + + # list of CLASS source files + set(CLASS_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/class/tools/growTable.c + ${CMAKE_CURRENT_LIST_DIR}/class/tools/dei_rkck.c + ${CMAKE_CURRENT_LIST_DIR}/class/tools/sparse.c + ${CMAKE_CURRENT_LIST_DIR}/class/tools/evolver_rkck.c + ${CMAKE_CURRENT_LIST_DIR}/class/tools/evolver_ndf15.c + ${CMAKE_CURRENT_LIST_DIR}/class/tools/arrays.c + ${CMAKE_CURRENT_LIST_DIR}/class/tools/parser.c + ${CMAKE_CURRENT_LIST_DIR}/class/tools/quadrature.c + ${CMAKE_CURRENT_LIST_DIR}/class/tools/hyperspherical.c + ${CMAKE_CURRENT_LIST_DIR}/class/tools/common.c + ${CMAKE_CURRENT_LIST_DIR}/class/source/input.c + ${CMAKE_CURRENT_LIST_DIR}/class/source/background.c + ${CMAKE_CURRENT_LIST_DIR}/class/source/thermodynamics.c + ${CMAKE_CURRENT_LIST_DIR}/class/source/perturbations.c + ${CMAKE_CURRENT_LIST_DIR}/class/source/primordial.c + ${CMAKE_CURRENT_LIST_DIR}/class/source/nonlinear.c + ${CMAKE_CURRENT_LIST_DIR}/class/source/transfer.c + ${CMAKE_CURRENT_LIST_DIR}/class/source/spectra.c + ${CMAKE_CURRENT_LIST_DIR}/class/source/lensing.c + ${CMAKE_CURRENT_LIST_DIR}/class/hyrec/hyrectools.c + ${CMAKE_CURRENT_LIST_DIR}/class/hyrec/helium.c + ${CMAKE_CURRENT_LIST_DIR}/class/hyrec/hydrogen.c + ${CMAKE_CURRENT_LIST_DIR}/class/hyrec/history.c + ${CMAKE_CURRENT_LIST_DIR}/class/source/output.c + ${CMAKE_CURRENT_LIST_DIR}/class/cpp/Engine.cc + ${CMAKE_CURRENT_LIST_DIR}/class/cpp/ClassEngine.cc + ) + + # create the library + add_library(class ${CLASS_SOURCE_FILES}) + target_include_directories(class PRIVATE ${CLASS_INCLUDE_DIR}) + target_include_directories(class PRIVATE ${CLASS_INCLUDE_CPP_DIR}) + target_compile_options(class PRIVATE "-ffast-math") + target_compile_options(class PRIVATE "-D__CLASSDIR__=\"${CMAKE_CURRENT_LIST_DIR}/class\"") + set_property(TARGET class PROPERTY POSITION_INDEPENDENT_CODE ON) + target_include_directories(class PRIVATE ${CMAKE_CURRENT_LIST_DIR}/class/hyrec) + target_compile_options(class PRIVATE "-DHYREC") + set_target_properties(class PROPERTIES CXX_STANDARD 14 C_STANDARD 11) + # target_compile_options(class PRIVATE "-Wall") + # target_compile_options(class PRIVATE "-Wextra") + # target_compile_options(class PRIVATE "-pedantic") + endif(USE_CLASS_MAKEFILE) +endif(ENABLE_CLASS) # macro to setup include dir and link libraries for target using class macro(target_setup_class target_name) - target_include_directories(${target_name} - PRIVATE ${CLASS_INCLUDE_DIR}) - target_include_directories(${target_name} - PRIVATE ${CLASS_INCLUDE_CPP_DIR}) - target_link_libraries(${target_name} ${CLASS_OBJECT_FILES}) - target_link_libraries(${target_name} class_cpp) - add_dependencies(${target_name} class_objects) + if(ENABLE_CLASS) + target_include_directories(${target_name} + PRIVATE ${CLASS_INCLUDE_DIR}) + target_include_directories(${target_name} + PRIVATE ${CLASS_INCLUDE_CPP_DIR}) + if(USE_CLASS_MAKEFILE) + target_link_libraries(${target_name} ${CLASS_OBJECT_FILES}) + target_link_libraries(${target_name} class_cpp) + add_dependencies(${target_name} class_objects) + else(USE_CLASS_MAKEFILE) + target_link_libraries(${target_name} class) + endif(USE_CLASS_MAKEFILE) + target_compile_options(${target_name} PRIVATE "-DUSE_CLASS") + endif(ENABLE_CLASS) endmacro(target_setup_class) - -# test executable -add_executable(testTk - ${CMAKE_CURRENT_LIST_DIR}/class/cpp/testTk.cc) -target_setup_class(testTk) \ No newline at end of file +if(ENABLE_CLASS) + # test executable + add_executable(testTk + ${CMAKE_CURRENT_LIST_DIR}/class/cpp/testTk.cc) + target_setup_class(testTk) +endif(ENABLE_CLASS) \ No newline at end of file