Open wavefunction91 opened 5 years ago
+1 will work on this for the next release.
Quasi putting this into the 2.0 release. The main item that I ran into is that the generated source files in this way require a new CMakeLists.txt
along the lines of:
cmake_minimum_required(VERSION 3.1 FATAL_ERROR)
project(gau2grid
VERSION 1.3.1
LANGUAGES C)
set(gau2grid_AUTHORS "Daniel G. A. Smith")
set(gau2grid_DESCRIPTION "Fast computation of a gaussian and its derivative on a grid")
set(gau2grid_URL "https://github.com/dgasmith/gau2grid")
set(gau2grid_LICENSE "BSD 3-clause")
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
############################# Options: Build How? #############################
include(psi4OptionsTools)
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(ENABLE_GENERIC "Enables mostly static linking of system libraries for shared library" OFF)
# Warnings
if((${BUILD_SHARED_LIBS}) AND NOT ${BUILD_FPIC})
message(FATAL_ERROR "BUILD_SHARED_LIBS ON and BUILD_FPIC OFF are incompatible, as shared library requires position independent code")
endif()
# Install
option_with_default(CMAKE_INSTALL_LIBDIR "Directory to which libraries installed" lib)
option_with_default(NATIVE_PYTHON_INSTALL "For INSTALL_PYMOD=ON, install in Python manner to PYTHON_EXECUTABLE's site-packages rather than Linux manner to prefix. Overrides CMAKE_INSTALL_PREFIX, CMAKE_INSTALL_LIBDIR, PYMOD_INSTALL_LIBDIR. Only Py module installed." OFF)
######################## Process & Validate Options ##########################
include(custom_color_messages)
include(custom_static_library)
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
set(CMAKE_INSTALL_PREFIX "/usr/local/gau2grid" CACHE PATH "Install path" FORCE)
endif()
message(STATUS "gau2grid install: ${CMAKE_INSTALL_PREFIX}")
################################ Main Project ################################
set(sources_list src/gau2grid_phi.c
src/gau2grid_orbital.c
src/gau2grid_deriv1.c
src/gau2grid_deriv2.c
src/gau2grid_deriv3.c
src/gau2grid_transform.c
src/gau2grid_helper.c)
add_library(gg ${sources_list})
if ("${CMAKE_C_COMPILER_ID}" STREQUAL "PGI")
set_target_properties(gg PROPERTIES COMPILE_FLAGS "-c11")
else()
set_target_properties(gg PROPERTIES COMPILE_FLAGS "-std=c11")
endif()
set_target_properties(gg PROPERTIES POSITION_INDEPENDENT_CODE ${BUILD_FPIC}
SOVERSION 1) # bump whenever interface has changes or removals
if(${BUILD_SHARED_LIBS})
target_link_libraries(gg PRIVATE ${LIBC_INTERJECT})
endif()
################################### Install ##################################
include(GNUInstallDirs)
include(CMakePackageConfigHelpers)
set(PN ${PROJECT_NAME})
target_include_directories(gg INTERFACE
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
# GNUInstallDirs "DATADIR" wrong here; CMake search path wants "share".
set(CMAKECONFIG_INSTALL_DIR "share/cmake/${PN}")
configure_package_config_file(cmake/${PN}Config.cmake.in
"${CMAKE_CURRENT_BINARY_DIR}/${PN}Config.cmake"
INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR})
write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/${PN}ConfigVersion.cmake
VERSION ${${PN}_VERSION}
COMPATIBILITY AnyNewerVersion)
# Install our files
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/gau2grid.h
${CMAKE_CURRENT_BINARY_DIR}/gau2grid_pragma.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PN})
install(TARGETS gg
EXPORT "${PN}Targets"
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PN}Config.cmake
${CMAKE_CURRENT_BINARY_DIR}/${PN}ConfigVersion.cmake
DESTINATION ${CMAKECONFIG_INSTALL_DIR})
install(EXPORT "${PN}Targets"
NAMESPACE "${PN}::"
DESTINATION ${CMAKECONFIG_INSTALL_DIR})
I want to get the v2.0 out today, but will work on this for say a 2.0.1.
[...Extending an offline discussion...]
Currently, the build requires numpy to generate the C interface. Since there''s not currently any arch deduction (mu-arch, cache sizes, etc) in the CMake build and all optimizations are handled by
#pragma simd
etc, it should be possible to distribute pregenerated C source source code to avoid the generation step for each release. I'm kind of envisioning something that resembles the release structure generated by Libint where the "compiler" (code generation) and exported libs are separate