From e7fe9432b859fd05be431658fa3887fdfd47b03f Mon Sep 17 00:00:00 2001 From: "Lori A. Burns" Date: Sun, 11 Nov 2018 15:46:38 -0500 Subject: [PATCH 01/14] cmake1 --- CMakeLists.txt | 17 ++++++++++++----- cmake/FindFFTW.cmake | 2 ++ src/CMakeLists.txt | 2 +- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 20aac38..5744310 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,5 @@ -cmake_minimum_required(VERSION 3.3 FATAL_ERROR) +cmake_minimum_required(VERSION 3.12 FATAL_ERROR) +cmake_policy(SET CMP0074 NEW) ################ Options: Overview and Not Otherwise Mentioned ############### # @@ -137,14 +138,20 @@ endif() set(EXTERNAL_LIBRARIES ${FFTW_LIBRARIES} ${cpplib}) # Documentation -find_package(Doxygen) -find_package(Sphinx) -find_package(Latex) -if(DOXYGEN_EXECUTABLE) +if (BUILD_SPHINX) + find_package(Sphinx) + find_package(Latex) +endif() +if (BUILD_DOXYGEN) + find_package(Doxygen) + if (NOT DOXYGEN_FOUND) + message (FATAL_ERROR "Doxygen is needed to build the documentation. Please install it correctly.") + endif() if(SPHINX_EXECUTABLE) add_subdirectory(docs) endif() endif() + add_subdirectory(src) diff --git a/cmake/FindFFTW.cmake b/cmake/FindFFTW.cmake index 4340c86..ce1ed0f 100644 --- a/cmake/FindFFTW.cmake +++ b/cmake/FindFFTW.cmake @@ -16,6 +16,8 @@ # FFTW_INCLUDE_DIR ... fftw include directory # +cmake_policy(SET CMP0074 NEW) + #If environment variable FFTWDIR is specified, it has same effect as FFTW_ROOT if( NOT FFTW_ROOT AND EXISTS "$ENV{FFTW_ROOT}") set( FFTW_ROOT $ENV{FFTW_ROOT} ) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1bc8632..1a7a435 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -3,7 +3,7 @@ set(sources_list ) include_directories(${FFTW_INCLUDES}) -add_library(helpmestatic STATIC ${sources_list}) +add_library(helpmestatic ${sources_list}) target_link_libraries(helpmestatic ${FFTW_LIBRARIES}) if(Fortran_ENABLED AND CMAKE_Fortran_COMPILER_ID MATCHES Intel) From ffb05d067e10c8283f3f8567952bfa28cba094a2 Mon Sep 17 00:00:00 2001 From: "Lori A. Burns" Date: Sun, 11 Nov 2018 16:24:52 -0500 Subject: [PATCH 02/14] cmake2 --- python/setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python/setup.py b/python/setup.py index e506f27..7b89dec 100644 --- a/python/setup.py +++ b/python/setup.py @@ -182,4 +182,5 @@ 'Bug Reports': 'https://github.com/andysim/helpme/issues', 'Source': 'https://github.com/andysim/helpme/', }, + zip_safe=False, ) From 5a7570d08a5a15237c7a819b272d60509f20c42d Mon Sep 17 00:00:00 2001 From: "Lori A. Burns" Date: Mon, 12 Nov 2018 01:54:15 -0500 Subject: [PATCH 03/14] cmake3 --- CMakeLists.txt | 23 +++++++++++++++++------ python/CMakeLists.txt | 32 +++++++++++++++++--------------- python/__init__.py | 11 +++++++++++ src/CMakeLists.txt | 18 ++++++++++++------ test/CMakeLists.txt | 12 ++++++++---- test/fullexample.py | 2 +- 6 files changed, 66 insertions(+), 32 deletions(-) create mode 100644 python/__init__.py diff --git a/CMakeLists.txt b/CMakeLists.txt index 5744310..f0fa6f7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -67,6 +67,15 @@ option_with_flags(ENABLE_TSAN "Enables thread sanitizer" OFF "-fsanitize=thread" "-fno-omit-frame-pointer -pie") option_with_flags(ENABLE_UBSAN "Enables undefined behavior sanitizer" OFF "-fsanitize=undefined" "-fno-omit-frame-pointer") +option_with_default(CMAKE_BUILD_TYPE "Build type (Release or Debug)" Release) +option_with_flags(ENABLE_XHOST "Enables processor-specific optimization" ON + "-xHost" "-march=native") +option_with_default(BUILD_FPIC "Libraries will be compiled with position independent code" ON) +option_with_print(BUILD_SHARED_LIBS "Build final library as shared, not static" ON) +option_with_default(CMAKE_INSTALL_LIBDIR "Directory to which libraries installed" lib) +option_with_default(PYMOD_INSTALL_LIBDIR "Location within CMAKE_INSTALL_LIBDIR to which python modules are installed + Must start with: / . Used to imitate python install: /python3.6/site-packages ." /) +option_with_print(INSTALL_PYMOD "Additionally installs as independent python module in PYMOD_INSTALL_LIBDIR" OFF) set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0") set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0") @@ -119,13 +128,15 @@ else() endif() endif() +include(GNUInstallDirs) # Find Python -set(Python_ADDITIONAL_VERSIONS 3.7 3.6 3.5) -find_package(PythonLibsNew 2.7 REQUIRED) -message(STATUS "${Cyan}Found Python ${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}${ColourReset}: ${PYTHON_EXECUTABLE} (found version ${PYTHON_VERSION_STRING})") -set(Python_ENABLED ON) # For now, we just always assume this is on -add_subdirectory(external/pybind11) -add_subdirectory(python) +if(${INSTALL_PYMOD}) + set(Python_ADDITIONAL_VERSIONS 3.7 3.6 3.5) + find_package(PythonLibsNew 2.7 REQUIRED) + message(STATUS "${Cyan}Found Python ${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}${ColourReset}: ${PYTHON_EXECUTABLE} (found version ${PYTHON_VERSION_STRING})") + add_subdirectory(external/pybind11) + add_subdirectory(python) +endif() # Handle different C++ libraries if(CMAKE_CXX_COMPILER_ID MATCHES "AppleClang") diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 3032dac..50f7c07 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -3,25 +3,27 @@ add_custom_target(update_version ALL WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMENT "Generating version info") -add_custom_target(PythonTest - COMMAND ${PYTHON_EXECUTABLE} setup.py test - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - DEPENDS helpmelib - COMMENT "Testing Python module" -) -add_custom_target(PythonInstall - COMMAND ${PYTHON_EXECUTABLE} setup.py install - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - DEPENDS PythonTest - COMMENT "Installing Python module" -) +#add_custom_target(PythonTest +# COMMAND ${PYTHON_EXECUTABLE} setup.py test +# WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} +# DEPENDS helpmelib +# COMMENT "Testing Python module" +#) +#add_custom_target(PythonInstall +# COMMAND ${PYTHON_EXECUTABLE} setup.py install +# WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} +# DEPENDS PythonTest +# COMMENT "Installing Python module" +#) include_directories(../src) include_directories(${FFTW_INCLUDES}) link_libraries(${FFTW_LIBRARIES}) pybind11_add_module(helpmelib pywrappers.cc) -configure_file(setup.py . COPYONLY) -configure_file(../LICENSE . COPYONLY) -configure_file(Manifest.in . COPYONLY) configure_file(../test/fullexample.py ./tests/TestSerial.py COPYONLY) + +install(FILES $ + __init__.py + ${CMAKE_CURRENT_BINARY_DIR}/metadata.py + DESTINATION ${CMAKE_INSTALL_LIBDIR}${PYMOD_INSTALL_LIBDIR}/helpme) diff --git a/python/__init__.py b/python/__init__.py new file mode 100644 index 0000000..821fa21 --- /dev/null +++ b/python/__init__.py @@ -0,0 +1,11 @@ +// BEGINLICENSE +// +// This file is part of helPME, which is distributed under the BSD 3-clause license, +// as described in the LICENSE file in the top level directory of this project. +// +// Author: Andrew C. Simmonett +// +// ENDLICENSE + +from .helpmelib import * +from .metadata import __version__, version_formatter diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1a7a435..a8cd29b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -12,12 +12,18 @@ if(Fortran_ENABLED AND CMAKE_Fortran_COMPILER_ID MATCHES Intel) target_compile_definitions(helpmestatic PRIVATE -DINTEL_Fortran_ENABLED) endif() -set_target_properties(helpmestatic PROPERTIES OUTPUT_NAME helpme EXPORT_NAME helpme) +set_target_properties(helpmestatic PROPERTIES OUTPUT_NAME helpme + EXPORT_NAME helpme) -# Make sure headers are installed -install(DIRECTORY . DESTINATION include FILES_MATCHING PATTERN "*.h") +set(PN ${PROJECT_NAME}) + +install(DIRECTORY . + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PN} + FILES_MATCHING PATTERN "*.h") install(TARGETS helpmestatic - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib) + EXPORT "${PN}Targets" + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) + diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index c755661..120aab6 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -114,11 +114,14 @@ if(Fortran_ENABLED) endif() # Add python tests -if(Python_ENABLED) +if(${INSTALL_PYMOD}) add_test(NAME PythonWrappers - COMMAND ${PYTHON_EXECUTABLE} setup.py test - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/../python + #COMMAND ${PYTHON_EXECUTABLE} setup.py test + COMMAND ${PYTHON_EXECUTABLE} -m unittest + #WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/../python ) + install(FILES fullexample.py + DESTINATION ${CMAKE_INSTALL_LIBDIR}${PYMOD_INSTALL_LIBDIR}/helpme/tests) endif() # Make sure examples are installed @@ -126,4 +129,5 @@ set(EXAMPLEFILES fullexample.c fullexample.cpp fullexample.F90 fullexample.py) if(HAVE_MPI) set(EXAMPLEFILES ${EXAMPLEFILES} fullexample_parallel.c fullexample_parallel.cpp fullexample_parallel.F90) endif() -install(FILES ${EXAMPLEFILES} DESTINATION examples) +install(FILES ${EXAMPLEFILES} + DESTINATION ${CMAKE_INSTALL_DATADIR}/helpme/examples) diff --git a/test/fullexample.py b/test/fullexample.py index 48a4ab8..ff0f5bb 100644 --- a/test/fullexample.py +++ b/test/fullexample.py @@ -1,6 +1,6 @@ import unittest -import helpmelib as pme +import helpme as pme import numpy as np def print_results(label, e, f, v): From 8bf0ec573a691896eb2e311c6f2a8904f23c3ca3 Mon Sep 17 00:00:00 2001 From: "Lori A. Burns" Date: Mon, 12 Nov 2018 02:07:59 -0500 Subject: [PATCH 04/14] cmake4 --- python/__init__.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/python/__init__.py b/python/__init__.py index 821fa21..baa5978 100644 --- a/python/__init__.py +++ b/python/__init__.py @@ -1,11 +1,11 @@ -// BEGINLICENSE -// -// This file is part of helPME, which is distributed under the BSD 3-clause license, -// as described in the LICENSE file in the top level directory of this project. -// -// Author: Andrew C. Simmonett -// -// ENDLICENSE +# BEGINLICENSE +# +# This file is part of helPME, which is distributed under the BSD 3-clause license, +# as described in the LICENSE file in the top level directory of this project. +# +# Author: Andrew C. Simmonett +# +# ENDLICENSE from .helpmelib import * from .metadata import __version__, version_formatter From 511479e1dc2cdd243dbc0caeb7dd00eca2186f8f Mon Sep 17 00:00:00 2001 From: "Lori A. Burns" Date: Mon, 12 Nov 2018 11:14:40 -0500 Subject: [PATCH 05/14] cmake5 --- CMakeLists.txt | 27 +++++++++------------------ cmake/FindFFTW.cmake | 4 +++- conda/_conda_vers.py | 30 ++++++++++++++++++++++++++++++ src/CMakeLists.txt | 1 + 4 files changed, 43 insertions(+), 19 deletions(-) create mode 100644 conda/_conda_vers.py diff --git a/CMakeLists.txt b/CMakeLists.txt index f0fa6f7..8b0e800 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,4 @@ -cmake_minimum_required(VERSION 3.12 FATAL_ERROR) -cmake_policy(SET CMP0074 NEW) +cmake_minimum_required(VERSION 3.11 FATAL_ERROR) ################ Options: Overview and Not Otherwise Mentioned ############### # @@ -43,11 +42,12 @@ set (CMAKE_CXX_STANDARD 11) # Language bindings options # include(custom_color_messages) -option(ENABLE_fortran "Enables the building of Fortran bindings (needs Fortran compiler)" ON) -if(ENABLE_fortran) +option(ENABLE_Fortran "Enables the building of Fortran bindings (needs Fortran compiler)" ON) +if(ENABLE_Fortran) enable_language(Fortran) set(Fortran_ENABLED ON) endif() +option(INSTALL_PYMOD "Additionally installs as independent python module in PYMOD_INSTALL_LIBDIR" OFF) # # Build options @@ -75,7 +75,6 @@ option_with_print(BUILD_SHARED_LIBS "Build final library as shared, not static" option_with_default(CMAKE_INSTALL_LIBDIR "Directory to which libraries installed" lib) option_with_default(PYMOD_INSTALL_LIBDIR "Location within CMAKE_INSTALL_LIBDIR to which python modules are installed Must start with: / . Used to imitate python install: /python3.6/site-packages ." /) -option_with_print(INSTALL_PYMOD "Additionally installs as independent python module in PYMOD_INSTALL_LIBDIR" OFF) set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0") set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0") @@ -95,20 +94,12 @@ endif() # OpenMP if(ENABLE_OPENMP) - find_package(OpenMP) -endif() + find_package(OpenMP MODULE REQUIRED COMPONENTS CXX) + +include(CMakePrintHelpers) +cmake_print_properties(TARGETS OpenMP::OpenMP_CXX #OpenMP::OpenMP + PROPERTIES INTERFACE_COMPILE_DEFINITIONS INTERFACE_COMPILE_OPTIONS INTERFACE_INCLUDE_DIRS INTERFACE_LINK_LIBRARIES) -if(OPENMP_FOUND) - add_definitions(-DHAVE_OPENMP) - if(DEFINED CMAKE_C_COMPILER_ID) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") - endif() - if(DEFINED CMAKE_CXX_COMPILER_ID) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") - endif() - if(DEFINED CMAKE_Fortran_COMPILER_ID) - set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${OpenMP_Fortran_FLAGS}") - endif() endif() # MPI diff --git a/cmake/FindFFTW.cmake b/cmake/FindFFTW.cmake index ce1ed0f..3780d4f 100644 --- a/cmake/FindFFTW.cmake +++ b/cmake/FindFFTW.cmake @@ -16,7 +16,9 @@ # FFTW_INCLUDE_DIR ... fftw include directory # -cmake_policy(SET CMP0074 NEW) +if(POLICY CMP0074) + cmake_policy(SET CMP0074 NEW) # 3.12 +endif() #If environment variable FFTWDIR is specified, it has same effect as FFTW_ROOT if( NOT FFTW_ROOT AND EXISTS "$ENV{FFTW_ROOT}") diff --git a/conda/_conda_vers.py b/conda/_conda_vers.py new file mode 100644 index 0000000..8ff280c --- /dev/null +++ b/conda/_conda_vers.py @@ -0,0 +1,30 @@ +# BEGINLICENSE +# +# This file is part of helPME, which is distributed under the BSD 3-clause license, +# as described in the LICENSE file in the top level directory of this project. +# +# Author: Andrew C. Simmonett +# +# ENDLICENSE + +"""Dummy setup.py file solely for the purposes of getting an on-the-fly +computed version number into the conda recipe. + +""" +import sys +from distutils.core import setup + +def version_func(): + import subprocess + + command = 'python python/versioner.py --formatonly --format={version}' + process = subprocess.Popen(command.split(), shell=False, stdout=subprocess.PIPE) + (out, err) = process.communicate() + if sys.version_info >= (3, 0): + return out.decode('utf-8').strip() + else: + return out.strip() + +setup( + version=version_func(), +) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a8cd29b..b89261b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -5,6 +5,7 @@ set(sources_list include_directories(${FFTW_INCLUDES}) add_library(helpmestatic ${sources_list}) target_link_libraries(helpmestatic ${FFTW_LIBRARIES}) +target_link_libraries(helpmestatic OpenMP::OpenMP_CXX) if(Fortran_ENABLED AND CMAKE_Fortran_COMPILER_ID MATCHES Intel) #Enable call to for_rtl_init_() which is required if using the From d78491adc38cac9cc041da2f95d173fe5a5d98b3 Mon Sep 17 00:00:00 2001 From: "Lori A. Burns" Date: Mon, 12 Nov 2018 14:49:25 -0500 Subject: [PATCH 06/14] cmake6 --- python/CMakeLists.txt | 4 ++-- python/__init__.py | 2 +- python/pywrappers.cc | 8 +------- src/CMakeLists.txt | 3 ++- 4 files changed, 6 insertions(+), 11 deletions(-) diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 50f7c07..4cbc12e 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -19,11 +19,11 @@ add_custom_target(update_version ALL include_directories(../src) include_directories(${FFTW_INCLUDES}) link_libraries(${FFTW_LIBRARIES}) -pybind11_add_module(helpmelib pywrappers.cc) +pybind11_add_module(helpmecore pywrappers.cc) configure_file(../test/fullexample.py ./tests/TestSerial.py COPYONLY) -install(FILES $ +install(FILES $ __init__.py ${CMAKE_CURRENT_BINARY_DIR}/metadata.py DESTINATION ${CMAKE_INSTALL_LIBDIR}${PYMOD_INSTALL_LIBDIR}/helpme) diff --git a/python/__init__.py b/python/__init__.py index baa5978..9140840 100644 --- a/python/__init__.py +++ b/python/__init__.py @@ -7,5 +7,5 @@ # # ENDLICENSE -from .helpmelib import * +from .helpmecore import * from .metadata import __version__, version_formatter diff --git a/python/pywrappers.cc b/python/pywrappers.cc index 4333523..08edfce 100644 --- a/python/pywrappers.cc +++ b/python/pywrappers.cc @@ -64,7 +64,7 @@ void declarePMEInstance(py::module& mod, std::string const& suffix) { } } // namespace -PYBIND11_MODULE(helpmelib, m) { +PYBIND11_MODULE(helpmecore, m) { m.doc() = R"pbdoc( helpme: an efficient library for particle mesh Ewald ---------- @@ -79,10 +79,4 @@ PYBIND11_MODULE(helpmelib, m) { declarePMEInstance(m, "D"); declarePMEInstance(m, "F"); - -#ifdef VERSION_INFO - m.attr("__version__") = py::str(VERSION_INFO); -#else - m.attr("__version__") = py::str("dev"); -#endif } diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b89261b..fb26ff0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,11 +1,12 @@ set(sources_list helpme.cc + fftw_wrapper.h ) include_directories(${FFTW_INCLUDES}) add_library(helpmestatic ${sources_list}) target_link_libraries(helpmestatic ${FFTW_LIBRARIES}) -target_link_libraries(helpmestatic OpenMP::OpenMP_CXX) +target_link_libraries(helpmestatic PUBLIC OpenMP::OpenMP_CXX) if(Fortran_ENABLED AND CMAKE_Fortran_COMPILER_ID MATCHES Intel) #Enable call to for_rtl_init_() which is required if using the From b2d52fe23c25fd9ef4d2a12dfc72c36996f27c6d Mon Sep 17 00:00:00 2001 From: "Lori A. Burns" Date: Mon, 12 Nov 2018 14:56:14 -0500 Subject: [PATCH 07/14] cmake7 --- src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fb26ff0..4a34148 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -5,7 +5,7 @@ set(sources_list include_directories(${FFTW_INCLUDES}) add_library(helpmestatic ${sources_list}) -target_link_libraries(helpmestatic ${FFTW_LIBRARIES}) +target_link_libraries(helpmestatic PUBLIC ${FFTW_LIBRARIES}) target_link_libraries(helpmestatic PUBLIC OpenMP::OpenMP_CXX) if(Fortran_ENABLED AND CMAKE_Fortran_COMPILER_ID MATCHES Intel) From 87f0e4b1009625b616e8c249c3faad83a0d2b967 Mon Sep 17 00:00:00 2001 From: "Lori A. Burns" Date: Mon, 12 Nov 2018 17:05:13 -0500 Subject: [PATCH 08/14] cmake8 --- CMakeLists.txt | 19 +++++++------------ cmake/FindFFTW.cmake | 41 ++++++++++++++++++++++++++++++++--------- python/CMakeLists.txt | 3 +-- src/CMakeLists.txt | 3 +-- 4 files changed, 41 insertions(+), 25 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8b0e800..b514652 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,24 +82,19 @@ set(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} -O0") # FFTW find_package(FFTW REQUIRED) -if(HAVE_FFTWF) - add_definitions(-DHAVE_FFTWF=1) +if(TARGET fftw::fftwf) + add_compile_definitions($) endif() -if(HAVE_FFTWD) - add_definitions(-DHAVE_FFTWD=1) +if(TARGET fftw::fftwd) + add_compile_definitions($) endif() -if(HAVE_FFTWL) - add_definitions(-DHAVE_FFTWL=1) +if(TARGET fftw::fftwl) + add_compile_definitions($) endif() # OpenMP if(ENABLE_OPENMP) find_package(OpenMP MODULE REQUIRED COMPONENTS CXX) - -include(CMakePrintHelpers) -cmake_print_properties(TARGETS OpenMP::OpenMP_CXX #OpenMP::OpenMP - PROPERTIES INTERFACE_COMPILE_DEFINITIONS INTERFACE_COMPILE_OPTIONS INTERFACE_INCLUDE_DIRS INTERFACE_LINK_LIBRARIES) - endif() # MPI @@ -137,7 +132,7 @@ else() endif() # The C++ library is linked explicitly because exception handling on macOS appears to be broken otherwise. -set(EXTERNAL_LIBRARIES ${FFTW_LIBRARIES} ${cpplib}) +set(EXTERNAL_LIBRARIES fftw::fftw ${cpplib}) # Documentation if (BUILD_SPHINX) diff --git a/cmake/FindFFTW.cmake b/cmake/FindFFTW.cmake index 3780d4f..fd2d492 100644 --- a/cmake/FindFFTW.cmake +++ b/cmake/FindFFTW.cmake @@ -16,9 +16,8 @@ # FFTW_INCLUDE_DIR ... fftw include directory # -if(POLICY CMP0074) - cmake_policy(SET CMP0074 NEW) # 3.12 -endif() +cmake_policy(PUSH) +cmake_policy(SET CMP0074 NEW) # 3.12 #If environment variable FFTWDIR is specified, it has same effect as FFTW_ROOT if( NOT FFTW_ROOT AND EXISTS "$ENV{FFTW_ROOT}") @@ -113,29 +112,53 @@ set( CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_SAV} ) if(FFTWF_LIB) message(STATUS "${Cyan}Found single precision FFTW: ${FFTWF_LIB}${ColourReset}") - set(FFTW_LIBRARIES ${FFTW_LIBRARIES} ${FFTWF_LIB}) - set(HAVE_FFTWF TRUE) + add_library(fftw::fftwf INTERFACE IMPORTED) + set_property(TARGET fftw::fftwf PROPERTY INTERFACE_LINK_LIBRARIES ${FFTWF_LIB}) + set_property(TARGET fftw::fftwf PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${FFTW_INCLUDES}) + set_property(TARGET fftw::fftwf PROPERTY INTERFACE_COMPILE_DEFINITIONS HAVE_FFTWF=1) else() message(STATUS "${Red}Single precision FFTW not found${ColourReset}") endif() if(FFTW_LIB) message(STATUS "${Cyan}Found double precision FFTW: ${FFTW_LIB}${ColourReset}") - set(FFTW_LIBRARIES ${FFTW_LIBRARIES} ${FFTW_LIB}) - set(HAVE_FFTWD TRUE) + add_library(fftw::fftwd INTERFACE IMPORTED) + set_property(TARGET fftw::fftwd PROPERTY INTERFACE_LINK_LIBRARIES ${FFTW_LIB}) + set_property(TARGET fftw::fftwd PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${FFTW_INCLUDES}) + set_property(TARGET fftw::fftwd PROPERTY INTERFACE_COMPILE_DEFINITIONS HAVE_FFTWD=1) else() message(STATUS "${Red}Double precision FFTW not found${ColourReset}") endif() if(FFTWL_LIB) message(STATUS "${Cyan}Found long double precision FFTW: ${FFTWL_LIB}${ColourReset}") - set(FFTW_LIBRARIES ${FFTW_LIBRARIES} ${FFTWL_LIB}) - set(HAVE_FFTWL TRUE) + add_library(fftw::fftwl INTERFACE IMPORTED) + set_property(TARGET fftw::fftwl PROPERTY INTERFACE_LINK_LIBRARIES ${FFTWL_LIB}) + set_property(TARGET fftw::fftwl PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${FFTW_INCLUDES}) + set_property(TARGET fftw::fftwl PROPERTY INTERFACE_COMPILE_DEFINITIONS HAVE_FFTWL=1) else() message(STATUS "${Red}Long double precision FFTW not found${ColourReset}") endif() +# not the official target name and no separate F/D/L targets +# looks like this is done properly upstream, just no one distributes the pkg +# build from cmake +add_library(fftw::fftw INTERFACE IMPORTED) +if(TARGET fftw::fftwd) + set_property(TARGET fftw::fftw PROPERTY INTERFACE_LINK_LIBRARIES fftw::fftwd) + set(FFTW_LIBRARIES ${FFTW_LIBRARIES} $) +endif() +if(TARGET fftw::fftwf) + set_property(TARGET fftw::fftw PROPERTY INTERFACE_LINK_LIBRARIES fftw::fftwf) + set(FFTW_LIBRARIES ${FFTW_LIBRARIES} $) +endif() +if(TARGET fftw::fftwl) + set_property(TARGET fftw::fftw PROPERTY INTERFACE_LINK_LIBRARIES fftw::fftwl) + set(FFTW_LIBRARIES ${FFTW_LIBRARIES} $) +endif() + include(FindPackageHandleStandardArgs) find_package_handle_standard_args(FFTW DEFAULT_MSG FFTW_INCLUDES FFTW_LIBRARIES) mark_as_advanced(FFTW_INCLUDES FFTW_LIBRARIES FFTW_LIB FFTWF_LIB FFTWL_LIB) +cmake_policy(POP) diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 4cbc12e..09534d7 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -17,9 +17,8 @@ add_custom_target(update_version ALL #) include_directories(../src) -include_directories(${FFTW_INCLUDES}) -link_libraries(${FFTW_LIBRARIES}) pybind11_add_module(helpmecore pywrappers.cc) +target_link_libraries(helpmecore PRIVATE fftw::fftw) configure_file(../test/fullexample.py ./tests/TestSerial.py COPYONLY) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4a34148..ead71b8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,11 +1,10 @@ set(sources_list helpme.cc - fftw_wrapper.h ) include_directories(${FFTW_INCLUDES}) add_library(helpmestatic ${sources_list}) -target_link_libraries(helpmestatic PUBLIC ${FFTW_LIBRARIES}) +target_link_libraries(helpmestatic PUBLIC fftw::fftw) target_link_libraries(helpmestatic PUBLIC OpenMP::OpenMP_CXX) if(Fortran_ENABLED AND CMAKE_Fortran_COMPILER_ID MATCHES Intel) From 5d161b63709d32548fcdbc6a5da63ffc82ff7f2f Mon Sep 17 00:00:00 2001 From: "Lori A. Burns" Date: Tue, 13 Nov 2018 23:54:47 -0500 Subject: [PATCH 09/14] cmake9 --- CMakeLists.txt | 13 ++---- cmake/FindFFTW.cmake | 6 +-- cmake/helpmeConfig.cmake.in | 63 +++++++++++++++++++++++++++ python/CMakeLists.txt | 49 ++++++++++++++------- python/Manifest.in | 3 -- python/__init__.py | 2 +- python/pywrappers.cc | 2 +- python/setup.py | 2 + python/versioner.py | 28 +++++++----- src/CMakeLists.txt | 65 +++++++++++++++++++++------ test/CMakeLists.txt | 72 ++++++++---------------------- test/test_helpme.py | 87 +++++++++++++++++++++++++++++++++++++ 12 files changed, 282 insertions(+), 110 deletions(-) create mode 100644 cmake/helpmeConfig.cmake.in delete mode 100644 python/Manifest.in create mode 100644 test/test_helpme.py diff --git a/CMakeLists.txt b/CMakeLists.txt index b514652..f848859 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,9 @@ cmake_minimum_required(VERSION 3.11 FATAL_ERROR) +if(POLICY CMP0074) + cmake_policy(SET CMP0074 NEW) # 3.12 +endif() + ################ Options: Overview and Not Otherwise Mentioned ############### # # <<< CMake build overview >>> @@ -82,15 +86,6 @@ set(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} -O0") # FFTW find_package(FFTW REQUIRED) -if(TARGET fftw::fftwf) - add_compile_definitions($) -endif() -if(TARGET fftw::fftwd) - add_compile_definitions($) -endif() -if(TARGET fftw::fftwl) - add_compile_definitions($) -endif() # OpenMP if(ENABLE_OPENMP) diff --git a/cmake/FindFFTW.cmake b/cmake/FindFFTW.cmake index fd2d492..52d21bb 100644 --- a/cmake/FindFFTW.cmake +++ b/cmake/FindFFTW.cmake @@ -145,15 +145,15 @@ endif() # build from cmake add_library(fftw::fftw INTERFACE IMPORTED) if(TARGET fftw::fftwd) - set_property(TARGET fftw::fftw PROPERTY INTERFACE_LINK_LIBRARIES fftw::fftwd) + set_property(TARGET fftw::fftw APPEND PROPERTY INTERFACE_LINK_LIBRARIES fftw::fftwd) set(FFTW_LIBRARIES ${FFTW_LIBRARIES} $) endif() if(TARGET fftw::fftwf) - set_property(TARGET fftw::fftw PROPERTY INTERFACE_LINK_LIBRARIES fftw::fftwf) + set_property(TARGET fftw::fftw APPEND PROPERTY INTERFACE_LINK_LIBRARIES fftw::fftwf) set(FFTW_LIBRARIES ${FFTW_LIBRARIES} $) endif() if(TARGET fftw::fftwl) - set_property(TARGET fftw::fftw PROPERTY INTERFACE_LINK_LIBRARIES fftw::fftwl) + set_property(TARGET fftw::fftw APPEND PROPERTY INTERFACE_LINK_LIBRARIES fftw::fftwl) set(FFTW_LIBRARIES ${FFTW_LIBRARIES} $) endif() diff --git a/cmake/helpmeConfig.cmake.in b/cmake/helpmeConfig.cmake.in new file mode 100644 index 0000000..19e5eda --- /dev/null +++ b/cmake/helpmeConfig.cmake.in @@ -0,0 +1,63 @@ +# helpmeConfig.cmake +# ------------------ +# +# helPME cmake module. +# This module sets the following variables in your project:: +# +# helpme_FOUND - true if helPME and all required components found on the system +# helpme_VERSION - helPME version in format Major.Minor.Release +# helpme_PYMOD - path to helPME python modules +# +# +# Available components:: +# +# Python - Python module installed, so helpme::python is available. +# +# +# Exported targets:: +# +# If helPME is found, this module defines the following :prop_tgt:`IMPORTED` +## target. Target is always shared _or_ static, so, for both, use separate, not +## overlapping, installations. :: +# +# helpme::pymod - the main Python module library. +# helpme::helpme - the main helPME C++ library with FFTW attached. +# helpme::intf_C - interface target for C linkage with main helpme library attached. +# helpme::intf_CXX - +# helpme::intf_Fortran +# +# +# Suggested usage:: +# +# find_package(helpme) +# find_package(helpme 0.1 EXACT CONFIG REQUIRED COMPONENTS Python) +# +# +# The following variables can be set to guide the search for this package:: +# +# helpme_DIR - CMake variable, set to directory containing this Config file +# CMAKE_PREFIX_PATH - CMake variable, set to root directory of this package +## PATH - environment variable, set to bin directory of this package +# CMAKE_DISABLE_FIND_PACKAGE_helpme - CMake variable, disables +# find_package(helpm3) when not REQUIRED, perhaps to force internal build + +@PACKAGE_INIT@ + +set(PN helpme) + +set(${PN}_PYMOD "${PACKAGE_PREFIX_DIR}/@CMAKE_INSTALL_LIBDIR@@PYMOD_INSTALL_LIBDIR@") + +if(@INSTALL_PYMOD@) + set(${PN}_Python_FOUND 1) +endif() + +check_required_components(${PN}) + +#----------------------------------------------------------------------------- +# Don't include targets if this file is being picked up by another +# project which has already built this as a subproject +#----------------------------------------------------------------------------- +if(NOT TARGET ${PN}::helpme) + include("${CMAKE_CURRENT_LIST_DIR}/${PN}Targets.cmake") +endif() + diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 09534d7..23a7ba6 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -1,28 +1,47 @@ +include(GNUInstallDirs) +include(CMakePackageConfigHelpers) +# GNUInstallDirs "DATADIR" wrong here; CMake search path wants "share". +set(CMAKECONFIG_INSTALL_DIR "share/cmake/helpme") + add_custom_target(update_version ALL COMMAND ${PYTHON_EXECUTABLE} versioner.py --metaout ${CMAKE_CURRENT_BINARY_DIR}/metadata.py + --cmakeout ${CMAKE_CURRENT_BINARY_DIR}/metadata.cmake + COMMAND ${CMAKE_COMMAND} -DWTO="${CMAKE_CURRENT_BINARY_DIR}" + -DPN="helpme" + -P ${CMAKE_CURRENT_BINARY_DIR}/metadata.cmake WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMENT "Generating version info") -#add_custom_target(PythonTest -# COMMAND ${PYTHON_EXECUTABLE} setup.py test -# WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} -# DEPENDS helpmelib -# COMMENT "Testing Python module" -#) -#add_custom_target(PythonInstall -# COMMAND ${PYTHON_EXECUTABLE} setup.py install -# WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} -# DEPENDS PythonTest -# COMMENT "Installing Python module" -#) +# <<< Build >>> include_directories(../src) -pybind11_add_module(helpmecore pywrappers.cc) -target_link_libraries(helpmecore PRIVATE fftw::fftw) +pybind11_add_module(pymod pywrappers.cc) +target_link_libraries(pymod PRIVATE fftw::fftw) configure_file(../test/fullexample.py ./tests/TestSerial.py COPYONLY) -install(FILES $ +set(PN helpme) +install(TARGETS pymod + EXPORT "${PN}Targets" + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}${PYMOD_INSTALL_LIBDIR}/helpme) +install(EXPORT "${PN}Targets" + NAMESPACE "${PN}::" + DESTINATION ${CMAKECONFIG_INSTALL_DIR}) + +# <<< Install >>> + +install(FILES #$ __init__.py ${CMAKE_CURRENT_BINARY_DIR}/metadata.py + ${CMAKE_CURRENT_SOURCE_DIR}/../LICENSE DESTINATION ${CMAKE_INSTALL_LIBDIR}${PYMOD_INSTALL_LIBDIR}/helpme) + +# <<< Export Config >>> + +configure_package_config_file( + ${CMAKE_CURRENT_SOURCE_DIR}/../cmake/${PN}Config.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/${PN}Config.cmake + INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR}) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PN}Config.cmake + ${CMAKE_CURRENT_BINARY_DIR}/${PN}ConfigVersion.cmake + DESTINATION ${CMAKECONFIG_INSTALL_DIR}) diff --git a/python/Manifest.in b/python/Manifest.in deleted file mode 100644 index 1825e86..0000000 --- a/python/Manifest.in +++ /dev/null @@ -1,3 +0,0 @@ -include LICENSE - -include helpmelib* diff --git a/python/__init__.py b/python/__init__.py index 9140840..34df61d 100644 --- a/python/__init__.py +++ b/python/__init__.py @@ -7,5 +7,5 @@ # # ENDLICENSE -from .helpmecore import * +from .pymod import * from .metadata import __version__, version_formatter diff --git a/python/pywrappers.cc b/python/pywrappers.cc index 08edfce..ed47591 100644 --- a/python/pywrappers.cc +++ b/python/pywrappers.cc @@ -64,7 +64,7 @@ void declarePMEInstance(py::module& mod, std::string const& suffix) { } } // namespace -PYBIND11_MODULE(helpmecore, m) { +PYBIND11_MODULE(pymod, m) { m.doc() = R"pbdoc( helpme: an efficient library for particle mesh Ewald ---------- diff --git a/python/setup.py b/python/setup.py index 7b89dec..612c7ec 100644 --- a/python/setup.py +++ b/python/setup.py @@ -4,6 +4,8 @@ https://github.com/pypa/sampleproject """ +# LAB: note this file is not presently used + # Always prefer setuptools over distutils from setuptools import setup, find_packages # To use a consistent encoding diff --git a/python/versioner.py b/python/versioner.py index c090384..13d7301 100755 --- a/python/versioner.py +++ b/python/versioner.py @@ -9,7 +9,7 @@ # # Psi4: an open-source quantum chemistry software package # -# Copyright (c) 2007-2017 The Psi4 Developers. +# Copyright (c) 2007-2018 The Psi4 Developers. # # The copyrights for code used from other parties are included in # the corresponding files. @@ -40,16 +40,6 @@ import subprocess -# with open('../psi4-config.tmp', 'r') as handle: -# f = handle.read() -# with open('../psi4-config', 'w') as handle: -# handle.write(f) -# handle.write(' psiver = "%s"\n' % (mmp)) -# handle.write(' githash = "{%s} %s %s"\n' % (branch, ghash, status)) -# handle.write(' sys.exit(main(sys.argv))\n\n') -# os.chmod('../psi4-config', 0o755) - - def collect_version_input_from_fallback(meta_file='metadata.py'): """From *meta_file*, collect lines matching ``_version_{key} = {value}`` and return as dictionary. @@ -297,6 +287,20 @@ def version_formatter(formatstring='{version}'): handle.write(main_fn) +def write_new_cmake_metafile(versdata, outfile='metadata.out.cmake'): + main_fn = """ +include(CMakePackageConfigHelpers) + +write_basic_package_version_file( + ${{WTO}}/${{PN}}ConfigVersion.cmake + VERSION {ver} + COMPATIBILITY AnyNewerVersion) +""" + + with open(os.path.abspath(outfile), 'w') as handle: + handle.write(main_fn.format(ver=versdata['__version_cmake'])) + + def version_formatter(versdata, formatstring="""{version}"""): """Return version information string with data from *versdata* when supplied with *formatstring* suitable for ``formatstring.format()``. @@ -325,11 +329,13 @@ def version_formatter(versdata, formatstring="""{version}"""): parser = argparse.ArgumentParser(description='Script to extract Psi4 version from source. Use psi4.version_formatter(fmt_string) after build.') parser.add_argument('--metaout', default='metadata.out.py', help='file to which the computed version info written') + parser.add_argument('--cmakeout', default='metadata.out.cmake', help='file to which the CMake ConfigVersion generator written') parser.add_argument('--format', default='all', help='string like "{version} {githash}" to be filled in and returned') parser.add_argument('--formatonly', action='store_true', help='print only the format string, not the detection info') args = parser.parse_args() ans = reconcile_and_compute_version_output(quiet=args.formatonly) write_new_metafile(ans, args.metaout) + write_new_cmake_metafile(ans, args.cmakeout) ans2 = version_formatter(ans, formatstring=args.format) print(ans2) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ead71b8..1940261 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,30 +1,69 @@ -set(sources_list - helpme.cc - ) +set(PN ${PROJECT_NAME}) + +set(sources_list helpme.cc) -include_directories(${FFTW_INCLUDES}) -add_library(helpmestatic ${sources_list}) -target_link_libraries(helpmestatic PUBLIC fftw::fftw) -target_link_libraries(helpmestatic PUBLIC OpenMP::OpenMP_CXX) +add_library(helpmelib ${sources_list}) +target_link_libraries(helpmelib PUBLIC fftw::fftw) +target_link_libraries(helpmelib PUBLIC OpenMP::OpenMP_CXX) +target_include_directories(helpmelib INTERFACE $ + $) +set_target_properties(helpmelib PROPERTIES OUTPUT_NAME helpme + EXPORT_NAME helpme) if(Fortran_ENABLED AND CMAKE_Fortran_COMPILER_ID MATCHES Intel) #Enable call to for_rtl_init_() which is required if using the #Intel fortran compiler - target_compile_definitions(helpmestatic PRIVATE -DINTEL_Fortran_ENABLED) + target_compile_definitions(helpmelib PRIVATE -DINTEL_Fortran_ENABLED) endif() -set_target_properties(helpmestatic PROPERTIES OUTPUT_NAME helpme - EXPORT_NAME helpme) +set(interface_sources_list + cartesiantransform.h + fftw_wrapper.h + gamma.h + gridsize.h + helpme.h + lapack_wrapper.h + matrix.h + memory.h + mpi_wrapper.h + powers.h + splines.h + string_utils.h +) + +add_custom_target(SingleHeader ALL + COMMAND ${PYTHON_EXECUTABLE} inline_headers.py + DEPENDS ${interface_sources_list} + WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}/tools" + COMMENT "Generating single header...") -set(PN ${PROJECT_NAME}) + +add_library(intf_C INTERFACE) +target_link_libraries(intf_C INTERFACE helpmelib) +#set_target_properties(RunCWrapper PROPERTIES LINKER_LANGUAGE CXX) + +add_library(intf_CXX INTERFACE) +target_include_directories(intf_CXX INTERFACE $ + $ + $) +target_link_libraries(intf_CXX INTERFACE fftw::fftw) +target_link_libraries(intf_CXX INTERFACE OpenMP::OpenMP_CXX) + +add_library(intf_Fortran INTERFACE) +target_sources(intf_Fortran INTERFACE $ + $) +target_link_libraries(intf_Fortran INTERFACE helpmelib ${cpplib}) +#set_target_properties(intf_Fortran PROPERTIES LINKER_LANGUAGE Fortran) install(DIRECTORY . DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PN} FILES_MATCHING PATTERN "*.h") +install(FILES ${PROJECT_SOURCE_DIR}/single_include/helpme_standalone.h + ${PROJECT_SOURCE_DIR}/src/helpme.F90 + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PN}) -install(TARGETS helpmestatic +install(TARGETS helpmelib intf_C intf_CXX intf_Fortran EXPORT "${PN}Targets" RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) - diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 120aab6..189cd34 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,69 +1,32 @@ add_subdirectory(unittests) -# Add any new sources here -set(SOURCES_HELPME - cartesiantransform.h - fftw_wrapper.h - gamma.h - gridsize.h - helpme.h - lapack_wrapper.h - matrix.h - memory.h - mpi_wrapper.h - powers.h - splines.h - string_utils.h -) - -foreach(SOURCE_FILE ${SOURCES_HELPME}) - list (APPEND HELPME_INPUT_SOURCES "${PROJECT_SOURCE_DIR}/src/${SOURCE_FILE}") -endforeach() - -include_directories(${PROJECT_SOURCE_DIR}/src) -include_directories(${PROJECT_SOURCE_DIR}/single_include) -include_directories(${FFTW_INCLUDES}) - if(HAVE_MPI) link_libraries(${MPI_CXX_LIBRARIES}) endif() -# Ensure headers are inlined every time a build is triggered -add_custom_command( - OUTPUT StandaloneHeader - COMMAND ${PYTHON_EXECUTABLE} inline_headers.py - DEPENDS ${HELPME_INPUT_SOURCES} - WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}/tools" - COMMENT "Generating single header..." -) - -add_custom_target(SingleHeader - DEPENDS StandaloneHeader -) - # C example -add_executable (RunCWrapper fullexample.c) -add_dependencies(RunCWrapper helpmestatic) -target_link_libraries(RunCWrapper helpmestatic) -set_target_properties(RunCWrapper PROPERTIES LINKER_LANGUAGE CXX) +#set_target_properties(RunCWrapper PROPERTIES LINKER_LANGUAGE CXX) +add_executable(RunCWrapper fullexample.c) +target_link_libraries(RunCWrapper intf_C) add_test(NAME CWrapperTest COMMAND RunCWrapper) # CXX DHFR benchmark example add_executable (DHFRBenchmark dhfr_benchmark.cpp) -target_link_libraries(DHFRBenchmark ${EXTERNAL_LIBRARIES}) +target_link_libraries(DHFRBenchmark intf_CXX) configure_file(data/dhfr_charges.txt . COPYONLY) configure_file(data/dhfr_c6s.txt . COPYONLY) configure_file(data/dhfr_coords.txt . COPYONLY) # CXX example add_executable (RunCXXWrapper fullexample.cpp) -target_link_libraries(RunCXXWrapper ${EXTERNAL_LIBRARIES}) +target_link_libraries(RunCXXWrapper intf_CXX) add_test(NAME CXXWrapperTest COMMAND RunCXXWrapper) # CXX example using standalone header file add_executable (RunCXXWrapperStandalone fullexample.cpp) -add_dependencies(RunCXXWrapperStandalone SingleHeader) -target_link_libraries(RunCXXWrapperStandalone ${EXTERNAL_LIBRARIES}) +target_link_libraries (RunCXXWrapperStandalone intf_CXX) +#add_dependencies(RunCXXWrapperStandalone SingleHeader) +#target_link_libraries(RunCXXWrapperStandalone ${EXTERNAL_LIBRARIES}) target_compile_definitions(RunCXXWrapperStandalone PRIVATE "BUILD_STANDALONE=1") add_test(NAME CXXWrapperStandaloneTest COMMAND RunCXXWrapperStandalone) @@ -81,7 +44,7 @@ if(HAVE_MPI) # C example add_executable (RunCMPIWrapper fullexample_parallel.c) - target_link_libraries(RunCMPIWrapper helpmestatic) + target_link_libraries(RunCMPIWrapper helpmelib) set_target_properties(RunCMPIWrapper PROPERTIES LINKER_LANGUAGE CXX) add_test(NAME CMPIWrapperTestX COMMAND ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} 2 ${MPIEXEC_PREFLAGS} ./RunCMPIWrapper 2 1 1 ${MPIEXEC_POSTFLAGS}) @@ -95,7 +58,7 @@ if(HAVE_MPI) link_libraries(${MPI_Fortran_LIBRARIES}) add_executable(RunFortranMPIWrapper ${PROJECT_SOURCE_DIR}/src/helpme.F90 fullexample_parallel.F90 ) set_target_properties(RunFortranMPIWrapper PROPERTIES LINKER_LANGUAGE Fortran) - target_link_libraries(RunFortranMPIWrapper helpmestatic ${cpplib}) + target_link_libraries(RunFortranMPIWrapper helpmelib ${cpplib}) add_test(NAME FortranMPIWrapperTestX COMMAND ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} 2 ${MPIEXEC_PREFLAGS} ./RunFortranMPIWrapper 2 1 1 ${MPIEXEC_POSTFLAGS}) add_test(NAME FortranMPIWrapperTestY @@ -107,23 +70,24 @@ endif() # Fortran example if(Fortran_ENABLED) - add_executable(RunFortranWrapper ${PROJECT_SOURCE_DIR}/src/helpme.F90 fullexample.F90 ) - target_link_libraries(RunFortranWrapper helpmestatic ${cpplib}) - set_target_properties(RunFortranWrapper PROPERTIES LINKER_LANGUAGE Fortran) + add_executable(RunFortranWrapper fullexample.F90) + target_link_libraries(RunFortranWrapper intf_Fortran) add_test(NAME FortranWrapper COMMAND RunFortranWrapper) + #target_link_libraries(RunFortranWrapper helpmelib ${cpplib}) + #set_target_properties(RunFortranWrapper PROPERTIES LINKER_LANGUAGE Fortran) endif() # Add python tests if(${INSTALL_PYMOD}) add_test(NAME PythonWrappers - #COMMAND ${PYTHON_EXECUTABLE} setup.py test - COMMAND ${PYTHON_EXECUTABLE} -m unittest - #WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/../python + COMMAND ${PYTHON_EXECUTABLE} -m pytest -rws -v --capture=sys ${CMAKE_CURRENT_SOURCE_DIR} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/../python ) - install(FILES fullexample.py + install(FILES test_helpme.py DESTINATION ${CMAKE_INSTALL_LIBDIR}${PYMOD_INSTALL_LIBDIR}/helpme/tests) endif() + # Make sure examples are installed set(EXAMPLEFILES fullexample.c fullexample.cpp fullexample.F90 fullexample.py) if(HAVE_MPI) diff --git a/test/test_helpme.py b/test/test_helpme.py new file mode 100644 index 0000000..8589c24 --- /dev/null +++ b/test/test_helpme.py @@ -0,0 +1,87 @@ +import pytest + +import numpy as np + +@pytest.mark.parametrize("tol,dtype", [ + pytest.param(1.e-8, np.float64, id='double'), + pytest.param(1.e-4, np.float32, id='float'), +]) +def test_helpme(tol, dtype): + + try: + import helpme as pme + except ImportError: + import pymod as pme + + def print_results(label, e, f, v): + np.set_printoptions(precision=10, linewidth=100) + print(label) + print("Energy = {:16.10f}".format(e)) + print("Forces:") + print(f) + print("Virial:") + print(v) + print() + + expectedEnergy = 5.864957414; + expectedForces = np.array([[-1.20630693, -1.49522843, 12.65589187], + [ 1.00695882, 0.88956328, -5.08428301], + [ 0.69297661, 1.09547848, -5.22771480], + [-2.28988057, -2.10832506, 10.18914165], + [ 0.81915340, 0.92013663, -6.43738026], + [ 0.97696467, 0.69833887, -6.09492437]]); + expectedVirial = np.array([[0.65613058, 0.49091167, 0.61109732, + 2.26906257, 2.31925449, -10.04901641]]); + expectedPotential = np.array([[ 1.18119329, -0.72320559, -0.89641992, 7.58746515], + [ 7.69247982, -1.20738468, -1.06662264, 6.09626260], + [ 8.73449635, -0.83090721, -1.31352336, 6.26824317], + [-9.98483179, -1.37283008, -1.26398385, 6.10859811], + [-3.50591589, -0.98219832, -1.10328133, 7.71868137], + [-2.39904512, -1.17142047, -0.83733677, 7.30806279]]); + + # Instantiate single or double precision PME object + coords = np.array([ + [ 2.00000, 2.00000, 2.00000], + [ 2.50000, 2.00000, 3.00000], + [ 1.50000, 2.00000, 3.00000], + [ 0.00000, 0.00000, 0.00000], + [ 0.50000, 0.00000, 1.00000], + [-0.50000, 0.00000, 1.00000] + ], dtype=dtype) + charges = np.array([[-0.834, 0.417, 0.417, -0.834, 0.417, 0.417]], dtype=dtype).T + + energy = 0 + forces = np.zeros((6,3), dtype=dtype) + virial = np.zeros((1,6), dtype=dtype) + potentialAndGradient = np.zeros((6,4), dtype=dtype) + + if dtype == np.float64: + pmei = pme.PMEInstanceD() + mat = pme.MatrixD + elif dtype == np.float32: + pmei = pme.PMEInstanceF() + mat = pme.MatrixF + else: + raise KeyError('undef helPME mode') + + pmei.setup(1, 0.3, 5, 32, 32, 32, 332.0716, 1) + pmei.set_lattice_vectors(20, 20, 20, 90, 90, 90, pmei.LatticeType.XAligned) + # Compute just the energy + print_results("Before pmei.compute_E_rec", energy, forces, virial) + energy = pmei.compute_E_rec(0, mat(charges), mat(coords)) + print_results("After pmei.compute_E_rec", energy, forces, virial) + # Compute the energy and forces + energy = pmei.compute_EF_rec(0, mat(charges), mat(coords), mat(forces)) + print_results("After pmei.compute_EF_rec", energy, forces, virial) + # Compute the energy, forces and virial + energy = pmei.compute_EFV_rec(0, mat(charges), mat(coords), mat(forces), mat(virial)) + print_results("After pmei.compute_EFV_rec", energy, forces, virial) + # Compute the reciprocal space potential and its gradient + pmei.compute_P_rec(0, mat(charges), mat(coords), mat(coords), 1, mat(potentialAndGradient)) + print("Potential and its gradient:") + print(potentialAndGradient, "\n") + + assert np.allclose([expectedEnergy], [energy], atol=tol) + assert np.allclose(expectedForces, forces, atol=tol) + assert np.allclose(expectedVirial, virial, atol=tol) + assert np.allclose(expectedPotential, potentialAndGradient, atol=tol) From 2be07ffcd2a7c7e58c9f7059509f9bce82d8564a Mon Sep 17 00:00:00 2001 From: Andy Simmonett Date: Wed, 14 Nov 2018 08:28:24 -0500 Subject: [PATCH 10/14] Tell Travis to get a recent CMake --- .travis.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 28bdc3b..45f306d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,12 +35,14 @@ jobs: - python -V - python -c 'import numpy; print(numpy.version.version)' - cd ${TRAVIS_BUILD_DIR} + - curl https://cmake.org/files/v3.12/cmake-3.12.4-Linux-x86_64.tar.gz --output cmake.tgz + - tar -xzvf cmake.tgz - export CTEST_OUTPUT_ON_FAILURE=1 - ${CXX_COMPILER} --version - ${Fortran_COMPILER} --version - ${C_COMPILER} --version - > - cmake -Bbuild -H. + ./cmake-3.12.4-Linux-x86_64/bin/cmake -Bbuild -H. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DCMAKE_CXX_COMPILER=${CXX_COMPILER} -DCMAKE_C_COMPILER=${C_COMPILER} From 70e6db0704bae5c1a4b6d4cea283f9dd98bc2898 Mon Sep 17 00:00:00 2001 From: "Lori A. Burns" Date: Fri, 16 Nov 2018 08:56:08 -0500 Subject: [PATCH 11/14] new cmake for all --- .travis.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 45f306d..56778aa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -48,6 +48,7 @@ jobs: -DCMAKE_C_COMPILER=${C_COMPILER} -DCMAKE_Fortran_COMPILER=${Fortran_COMPILER} -DPYTHON_EXECUTABLE=`which python` + -DINSTALL_PYMOD=ON - cd build - make -j 2 script: ctest -j 2 -VV @@ -79,17 +80,20 @@ jobs: - python -V - python -c 'import numpy; print(numpy.version.version)' - cd ${TRAVIS_BUILD_DIR} + - curl https://cmake.org/files/v3.12/cmake-3.12.4-Linux-x86_64.tar.gz --output cmake.tgz + - tar -xzvf cmake.tgz - export CTEST_OUTPUT_ON_FAILURE=1 - ${CXX_COMPILER} --version - ${Fortran_COMPILER} --version - ${C_COMPILER} --version - > - cmake -Bbuild -H. + ./cmake-3.12.4-Linux-x86_64/bin/cmake -Bbuild -H. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DCMAKE_CXX_COMPILER=${CXX_COMPILER} -DCMAKE_C_COMPILER=${C_COMPILER} -DCMAKE_Fortran_COMPILER=${Fortran_COMPILER} -DPYTHON_EXECUTABLE=`which python` + -DINSTALL_PYMOD=ON - cd build - make -j 2 script: ctest -j 2 -VV @@ -122,19 +126,22 @@ jobs: - python -V - python -c 'import numpy; print(numpy.version.version)' - cd ${TRAVIS_BUILD_DIR} + - curl https://cmake.org/files/v3.12/cmake-3.12.4-Linux-x86_64.tar.gz --output cmake.tgz + - tar -xzvf cmake.tgz - export CTEST_OUTPUT_ON_FAILURE=1 - export PATH=${TRAVIS_BUILD_DIR}:${PATH} - ${CXX_COMPILER} --version - ${Fortran_COMPILER} --version - ${C_COMPILER} --version - > - cmake -Bbuild -H. + ./cmake-3.12.4-Linux-x86_64/bin/cmake -Bbuild -H. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DENABLE_CODE_COVERAGE=ON -DCMAKE_CXX_COMPILER=${CXX_COMPILER} -DCMAKE_C_COMPILER=${C_COMPILER} -DCMAKE_Fortran_COMPILER=${Fortran_COMPILER} -DPYTHON_EXECUTABLE=`which python` + -DINSTALL_PYMOD=ON - cd build - cat CMakeCache.txt - make VERBOSE=1 -j 2 From 90d44c033f2e1d656e8ce1362aa555197806b0ea Mon Sep 17 00:00:00 2001 From: "Lori A. Burns" Date: Fri, 16 Nov 2018 11:08:32 -0500 Subject: [PATCH 12/14] try clang-3.7 --- .travis.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 56778aa..a8981ec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,17 +18,17 @@ jobs: addons: apt: sources: - - llvm-toolchain-precise-3.6 + - llvm-toolchain-precise-3.7 - ubuntu-toolchain-r-test packages: - liblapack-dev - libfftw3-dev - - clang-3.6 + - clang-3.7 - gfortran env: - NAME='clang' - - CXX_COMPILER='/usr/bin/clang++-3.6' - - C_COMPILER='/usr/bin/clang-3.6' + - CXX_COMPILER='/usr/bin/clang++-3.7' + - C_COMPILER='/usr/bin/clang-3.7' - Fortran_COMPILER='/usr/bin/gfortran' - BUILD_TYPE='Release' before_script: From 1e45b171bda588cf04d07561163465f43fae4abb Mon Sep 17 00:00:00 2001 From: "Lori A. Burns" Date: Fri, 16 Nov 2018 11:25:04 -0500 Subject: [PATCH 13/14] clang 3.8 --- .travis.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index a8981ec..6596511 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,7 +10,7 @@ jobs: script: ./tools/check_style.sh # - # Serial Py36 / Clang36 / Release + # Serial Py36 / Clang38 / Release # - stage: build and test python: "3.6" @@ -18,17 +18,17 @@ jobs: addons: apt: sources: - - llvm-toolchain-precise-3.7 + - llvm-toolchain-precise-3.8 - ubuntu-toolchain-r-test packages: - liblapack-dev - libfftw3-dev - - clang-3.7 + - clang-3.8 - gfortran env: - NAME='clang' - - CXX_COMPILER='/usr/bin/clang++-3.7' - - C_COMPILER='/usr/bin/clang-3.7' + - CXX_COMPILER='/usr/bin/clang++-3.8' + - C_COMPILER='/usr/bin/clang-3.8' - Fortran_COMPILER='/usr/bin/gfortran' - BUILD_TYPE='Release' before_script: From da5b43d3b760a1d59d5cbeaac3bca4b19fa3145c Mon Sep 17 00:00:00 2001 From: "Lori A. Burns" Date: Fri, 16 Nov 2018 11:37:45 -0500 Subject: [PATCH 14/14] omp pkg --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 6596511..310c5d6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,6 +25,7 @@ jobs: - libfftw3-dev - clang-3.8 - gfortran + - libiomp-dev env: - NAME='clang' - CXX_COMPILER='/usr/bin/clang++-3.8'