From c66953b4b85bbb7f2cbdd2dac09d780226a43146 Mon Sep 17 00:00:00 2001 From: Thomas Purcell <purcell@fhi-berlin.mpg.de> Date: Sat, 4 Jul 2020 09:38:33 +0200 Subject: [PATCH] CMake added to build python libraries It works, but not perfect --- CMakeLists.txt | 123 ++++++++++++++++++ src/CMakeLists.txt | 60 +++++++++ .../node/operator_nodes/OperatorNode.cpp | 1 + .../node/operator_nodes/functions.cpp | 21 --- src/python/_sisso.cpp | 2 +- 5 files changed, 185 insertions(+), 22 deletions(-) create mode 100644 CMakeLists.txt create mode 100644 src/CMakeLists.txt delete mode 100644 src/feature_creation/node/operator_nodes/functions.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..bea2b7af --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,123 @@ +cmake_minimum_required(VERSION 3.10) + +# set the project name +project(sisso++ VERSION 0.1 LANGUAGES CXX) + +# Cmake modules/macros are in a subdirectory to keep this file cleaner +set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) + +enable_testing() + +# Compiler tests +include(CheckCXXCompilerFlag) + +# Check for C++14 standard +set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +# Check python settings +find_package(PythonInterp 3 REQUIRED) +execute_process(COMMAND ${PYTHON_EXECUTABLE} + -c "import distutils.sysconfig as cg; print(cg.get_python_inc())" + OUTPUT_VARIABLE PYTHON_INCLUDE_PATH + OUTPUT_STRIP_TRAILING_WHITESPACE) + +set(PYTHON_INCLUDE_PATH ${PYTHON_INCLUDE_PATH} CACHE PATH "Python Include Directory") +mark_as_advanced(PYTHON_INCLUDE_PATH) + +include_directories(${PYTHON_INCLUDE_PATH}) + +if(NOT PYTHON_INSTDIR) +execute_process(COMMAND ${PYTHON_EXECUTABLE} + -c "import distutils.sysconfig as cg; print(cg.get_python_lib(1,0,prefix='${CMAKE_INSTALL_EXEC_PREFIX}'))" + OUTPUT_VARIABLE PYTHON_INSTDIR OUTPUT_STRIP_TRAILING_WHITESPACE) +endif() + +execute_process(COMMAND ${PYTHON_EXECUTABLE} + -c "import sys; print('{}{}'.format(sys.version_info[0], sys.version_info[1]))" + OUTPUT_VARIABLE BOOST_PYTHON_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE) + +execute_process(COMMAND ${PYTHON_EXECUTABLE} + -c "import sys; print(sys.version[:3])" + OUTPUT_VARIABLE PYTHON_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE) + +execute_process(COMMAND ${PYTHON_EXECUTABLE} + -c "import distutils.sysconfig as cg; print(cg.get_config_var('LIBDIR'))" + OUTPUT_VARIABLE PYTHON_LIBDIR + OUTPUT_STRIP_TRAILING_WHITESPACE) + +message(STATUS "PYTHON_LIBDIR = ${PYTHON_LIBDIR}") + +find_library(PYTHON_LIBRARIES + NAMES python${PYTHON_VERSION}m + PATHS ${PYTHON_LIBDIR} ) + +if(NOT PYTHON_LIBRARIES) + message(FATAL_ERROR "Python libraries not found!") +endif(NOT PYTHON_LIBRARIES) +message(STATUS "PYTHON_LIBRARIES = ${PYTHON_LIBRARIES}") + +mark_as_advanced(PYTHON_INCLUDE_PATH PYTHON_LIBRARIES) + +# Check for Boost +find_package(Boost REQUIRED COMPONENTS filesystem system mpi serialization) +set(Boost_LIBS ${Boost_LIBRARIES}) + +if(${Boost_VERSION} VERSION_LESS 106700) + find_package(Boost ${NEEDED_Boost_VERSION} REQUIRED COMPONENTS python) +else() + find_package(Boost ${NEEDED_Boost_VERSION} REQUIRED COMPONENTS python${BOOST_PYTHON_VERSION}) +endif() + + +# Append Python library to the list of Boost libraries. +list(APPEND Boost_LIBS ${Boost_LIBRARIES}) +set(Boost_LIBRARIES ${Boost_LIBS}) + +if(NOT Boost_FOUND) + message(FATAL_ERROR "Boost not found.") +endif(NOT Boost_FOUND) +include_directories(${Boost_INCLUDE_DIRS}) + +mark_as_advanced(PYTHON_INCLUDE_PATH Boost_LIBS) + +# Check BLAS/LAPACK +find_package(MKL REQUIRED) +if(MKL_FOUND) + include_directories(${MKL_INCLUDE_DIRS}) + set(LAPACK_LIBRARIES ${MKL_LIBRARIES}) +else() + find_package(LAPACK) + if(LPACK_FOUND) + set(LAPACK_LIBRARIES ${LAPACK_LIBRARIES}) + else() + message(FATAL_ERROR "LAPACK/BLAS not found") + endif() + target_link_libraries(mytest ${BLAS_LIBRARIES}) +endif() + +# Check MPI +find_package(MPI) +if(MPI_CXX_FOUND) + include_directories(MPI_CXX_INCLUDE_DIRS) + set(MPI_LIBRARIES, MPI_CXX_LIBRARIES) +else() + message(FATAL_ERROR "MPI not found.") +endif() + +include_directories(${CMAKE_CURRENT_LIST_DIR}/src) + + +add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/src) + +# # add the executable +# add_executable(sisso++ src/main.cpp) +# target_link_libraries(sisso++ ${LAPACK_LIBRARIES} ${MPI_LIBRARIES} ${PYTHON_LIBRARIES} ${Boost_LIBS} ${PROJECT_NAME}) + + +# # # add the library for python bindings +# # add_library(sisso++ SHARED src/python/bindings.cpp) +# # target_link_libraries(sisso++ ${Boost_LIBRARIES} ${PROJECT_NAME}) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 00000000..78a801ca --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,60 @@ +file(GLOB_RECURSE SISSOPP_SOURCES *.cpp) +file(GLOB_RECURSE SISSOLIB_SOURCES *.cpp) + +file(GLOB_RECURSE NOT_SISSOPP_SOURCES python/*.cpp) + +list(REMOVE_ITEM SISSOPP_SOURCES ${NOT_SISSOPP_SOURCES}) +list(REMOVE_ITEM SISSOLIB_SOURCES main.cpp) + +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/sisso++_config.hpp.in ${CMAKE_CURRENT_BINARY_DIR}/sisso++_config.hpp) + +add_executable(sisso++ ${SISSOPP_SOURCES}) + +add_library(_sisso SHARED ${SISSOLIB_SOURCES}) + + +include_directories(${CMAKE_CURRENT_LIST_DIR}/descriptor_identifier/) +include_directories(${CMAKE_CURRENT_LIST_DIR}/descriptor_identifier/Model) +include_directories(${CMAKE_CURRENT_LIST_DIR}/feature_creation/node/) +include_directories(${CMAKE_CURRENT_LIST_DIR}/feaure_creation/node/) +include_directories(${CMAKE_CURRENT_LIST_DIR}/feaure_creation/node/operator_nodes/) +include_directories(${CMAKE_CURRENT_LIST_DIR}/feaure_creation/node/value_storage/) +include_directories(${CMAKE_CURRENT_LIST_DIR}/feature_creation/units/) +include_directories(${CMAKE_CURRENT_LIST_DIR}/feature_creation/feature_space/) +include_directories(${CMAKE_CURRENT_LIST_DIR}/feature_creation/) +include_directories(${CMAKE_CURRENT_LIST_DIR}/inputs/) +include_directories(${CMAKE_CURRENT_LIST_DIR}/mpi_interface/) +include_directories(${CMAKE_CURRENT_LIST_DIR}/python/) +include_directories(${CMAKE_CURRENT_LIST_DIR}/utils/) + +# target_link_libraries(sisso ${LAPACK_LIBRARIES} ${MPI_LIBRARIES} ${PYTHON_LIBRARIES} ${Boost_LIBS}) + +# set_target_properties(sisso PROPERTIES PREFIX "" SUFFIX ".so" LIBRARY_OUTPUT_DIRECTORY ..) +# install(TARGETS sisso LIBRARY DESTINATION ${PYTHON_INSTDIR} ARCHIVE DESTINATION ${PYTHON_INSTDIR}) +# install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/ DESTINATION ${PYTHON_INSTDIR}/sisso +# FILES_MATCHING PATTERN "*.py" +# PATTERN "CMakeFiles" EXCLUDE) + +set_target_properties( sisso++ + PROPERTIES + ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" +) +target_link_libraries(sisso++ ${LAPACK_LIBRARIES} ${MPI_LIBRARIES} ${PYTHON_LIBRARIES} ${Boost_LIBS}) + +set_target_properties( _sisso + PROPERTIES + ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" + PREFIX "" + SUFFIX ".so" +) +target_link_libraries(_sisso ${LAPACK_LIBRARIES} ${MPI_LIBRARIES} ${PYTHON_LIBRARIES} ${Boost_LIBS}) +configure_file(__init__.py ${CMAKE_CURRENT_LIST_DIR}/python/__init__.py COPYONLY) +# install(TARGETZS _sisso ${CMAKE_CURRENT_LIST_DIR}/python/__init__.py DESTINATION "${PYTHON_INSTALL_PATH}") + + + + diff --git a/src/feature_creation/node/operator_nodes/OperatorNode.cpp b/src/feature_creation/node/operator_nodes/OperatorNode.cpp index f524fa1c..b5a5ac2a 100644 --- a/src/feature_creation/node/operator_nodes/OperatorNode.cpp +++ b/src/feature_creation/node/operator_nodes/OperatorNode.cpp @@ -1,3 +1,4 @@ #include <feature_creation/node/operator_nodes/OperatorNode.hpp> BOOST_SERIALIZATION_ASSUME_ABSTRACT(OperatorNode) + diff --git a/src/feature_creation/node/operator_nodes/functions.cpp b/src/feature_creation/node/operator_nodes/functions.cpp deleted file mode 100644 index 22c8022a..00000000 --- a/src/feature_creation/node/operator_nodes/functions.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include <feature_creation/node/operator_nodes/functions.hpp> - -std::map<NODE_TYPE, node_functions> node_function_map; - -node_function_map[NODE_TYPE::ADD] = std::make_tuple(allowed_op_funcs::add, allowed_expr_funcs::add, allowed_unit_funcs::add); -node_function_map[NODE_TYPE::SUB] = std::make_tuple(allowed_op_funcs::sub, allowed_expr_funcs::sub, allowed_unit_funcs::sub); -node_function_map[NODE_TYPE::ABS_DIFF] = std::make_tuple(allowed_op_funcs::abs_diff, allowed_expr_funcs::abs_diff, allowed_unit_funcs::abs_diff); -node_function_map[NODE_TYPE::MULT] = std::make_tuple(allowed_op_funcs::mult, allowed_expr_funcs::mult, allowed_unit_funcs::mult); -node_function_map[NODE_TYPE::DIV] = std::make_tuple(allowed_op_funcs::div, allowed_expr_funcs::div, allowed_unit_funcs::div); -node_function_map[NODE_TYPE::EXP] = std::make_tuple(allowed_op_funcs::exp, allowed_expr_funcs::exp, allowed_unit_funcs::exp); -node_function_map[NODE_TYPE::NEG_EXP] = std::make_tuple(allowed_op_funcs::neg_exp, allowed_expr_funcs::neg_exp, allowed_unit_funcs::neg_exp); -node_function_map[NODE_TYPE::INV] = std::make_tuple(allowed_op_funcs::inv, allowed_expr_funcs::inv, allowed_unit_funcs::inv); -node_function_map[NODE_TYPE::SQ] = std::make_tuple(allowed_op_funcs::sq, allowed_expr_funcs::sq, allowed_unit_funcs::sq); -node_function_map[NODE_TYPE::CB] = std::make_tuple(allowed_op_funcs::cb, allowed_expr_funcs::cb, allowed_unit_funcs::cb); -node_function_map[NODE_TYPE::SIX_POW] = std::make_tuple(allowed_op_funcs::sixth_pow, allowed_expr_funcs::sixth_pow, allowed_unit_funcs::sixth_pow); -node_function_map[NODE_TYPE::SQRT] = std::make_tuple(allowed_op_funcs::sqrt, allowed_expr_funcs::sqrt, allowed_unit_funcs::sqrt); -node_function_map[NODE_TYPE::CBRT] = std::make_tuple(allowed_op_funcs::cbrt, allowed_expr_funcs::cbrt, allowed_unit_funcs::cbrt); -node_function_map[NODE_TYPE::LOG] = std::make_tuple(allowed_op_funcs::log, allowed_expr_funcs::log, allowed_unit_funcs::log); -node_function_map[NODE_TYPE::ABS] = std::make_tuple(allowed_op_funcs::abs, allowed_expr_funcs::abs, allowed_unit_funcs::abs); -node_function_map[NODE_TYPE::SIN] = std::make_tuple(allowed_op_funcs::sin, allowed_expr_funcs::sin, allowed_unit_funcs::sin); -node_function_map[NODE_TYPE::COS] = std::make_tuple(allowed_op_funcs::cos, allowed_expr_funcs::cos, allowed_unit_funcs::cos); diff --git a/src/python/_sisso.cpp b/src/python/_sisso.cpp index 86653ab4..0209be86 100644 --- a/src/python/_sisso.cpp +++ b/src/python/_sisso.cpp @@ -1,5 +1,5 @@ #include <python/bindings.hpp> -#include <utils/MPI_Interface.hpp> +#include <mpi_interface/MPI_Interface.hpp> #include <Python.h> static void finalize(); -- GitLab