Skip to content

Commit

Permalink
add build_libint
Browse files Browse the repository at this point in the history
take 2

try 3

try 4

try 5

try 6

try 7

libint_maybe_unused

build src

split
  • Loading branch information
loriab committed Dec 29, 2023
1 parent ae9f528 commit 57fa38f
Show file tree
Hide file tree
Showing 13 changed files with 446 additions and 6 deletions.
121 changes: 121 additions & 0 deletions .github/workflows/ci_cmake.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
name: BuildCM

on:
push:
branches:
- master
pull_request:

jobs:
build_repo:
strategy:
fail-fast: false
matrix:
build_type : [ Release, Debug ]
os : [ macos-latest, ubuntu-20.04 ]
include:
- os: ubuntu-20.04
cxx: g++-10
cc: gcc-10
- os: macos-latest
cxx: clang++
cc: clang

name: "Repo • ${{ matrix.os }}: ${{ matrix.cxx }} ${{ matrix.build_type }}"
runs-on: ${{ matrix.os }}
env:
CC: ${{ matrix.cc }}
CXX : ${{ matrix.cxx }}
CCACHE_DIR : ${{github.workspace}}/build/.ccache
CCACHE_COMPRESS : true
CCACHE_COMPRESSLEVEL : 6
BUILD_CONFIG : >
-G Ninja
-DCMAKE_BUILD_TYPE=${{ matrix.build_type }}
-DBUILD_SHARED_LIBS=OFF
-DMPIEXEC_PREFLAGS='--bind-to;none;--allow-run-as-root'
-DCMAKE_INSTALL_PREFIX=${{github.workspace}}/build/library
-DWITH_MAX_AM=2;2
-DWITH_ERI_MAX_AM=2;2
-DWITH_ERI3_MAX_AM=3;2
-DENABLE_ERI=1
-DENABLE_ERI3=1
-DENABLE_ONEBODY=1
-DDISABLE_ONEBODY_PROPERTY_DERIVS=ON
-DMULTIPOLE_MAX_ORDER=2
-DLIBINT2_ENABLE_PYTHON=ON
outputs:
should_skip: ${{ steps.skip_check.outputs.should_skip }}

steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
# fetch-depth: 0 for git history to compute version

- id: skip_check
name: Check if can skip
uses: fkirc/skip-duplicate-actions@v5
with:
cancel_others: 'true'

- name: Create Build Environment
if: ${{ steps.skip_check.outputs.should_skip != 'true' }}
# Some projects don't allow in-source building, so create a separate build directory
# We'll use this as our working directory for all subsequent commands
run: |
cmake -E make_directory ${{github.workspace}}/build/compiler
cmake -E make_directory ${{github.workspace}}/build/library
cmake -E make_directory ${{github.workspace}}/build/library_test
- name: Install prerequisite MacOS packages
if: ${{ steps.skip_check.outputs.should_skip != 'true' && matrix.os == 'macos-latest' }}
run: |
brew install ninja gcc@10 boost eigen ccache [email protected] numpy scipy
echo "FC=/usr/local/bin/gfortran-10" >> $GITHUB_ENV
echo "EIGEN3_INCLUDE_DIR=/usr/local/include/eigen3" >> $GITHUB_ENV
- name: Install prerequisite Ubuntu packages
if: ${{ steps.skip_check.outputs.should_skip != 'true' && matrix.os == 'ubuntu-20.04' }}
run: |
sudo apt-get update
sudo apt-get install ninja-build g++-10 gfortran-10 liblapack-dev libboost-dev libeigen3-dev ccache python3-numpy python3-scipy
echo "FC=/usr/bin/gfortran-10" >> $GITHUB_ENV
echo "EIGEN3_INCLUDE_DIR=/usr/include/eigen3" >> $GITHUB_ENV
- name: Prepare ccache timestamp
if: ${{ steps.skip_check.outputs.should_skip != 'true' }}
id: ccache_cache_timestamp
shell: cmake -P {0}
run: |
string(TIMESTAMP current_date "%Y-%m-%d-%H;%M;%S" UTC)
message("\"timestamp=${current_date}\" >> $GITHUB_OUTPUT")
- name: Setup ccache cache files
if: ${{ steps.skip_check.outputs.should_skip != 'true' }}
uses: actions/cache@v3
with:
path: ${{github.workspace}}/build/.ccache
key: ${{ matrix.config.name }}-ccache-${{ steps.ccache_cache_timestamp.outputs.timestamp }}
restore-keys: |
${{ matrix.config.name }}-ccache-
- name: Generate Libint generator
if: ${{ steps.skip_check.outputs.should_skip != 'true' }}
# Use a bash shell so we can use the same syntax for environment variable
# access regardless of the host operating system
shell: bash
working-directory: ${{github.workspace}}/build/compiler
run: |
git describe --tags
cmake -S ../.. -B build $BUILD_CONFIG --log-level=DEBUG
cmake --build build --target check-libint2compiler
- name: Generate Libint library
if: ${{ steps.skip_check.outputs.should_skip != 'true' }}
shell: bash
working-directory: ${{github.workspace}}/build/compiler
run: |
cmake --build build --target libint-library-generate
2 changes: 1 addition & 1 deletion .github/workflows/cmake.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ on:
push:
branches:
- master
pull_request:
#pull_request:

jobs:
build_repo:
Expand Down
14 changes: 10 additions & 4 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0")
# Avoid warning about DOWNLOAD_EXTRACT_TIMESTAMP in CMake 3.24:
cmake_policy(SET CMP0135 NEW)
endif()
if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.25.0")
# needed by DynamicVersion
cmake_policy(SET CMP0140 NEW)
endif()

############################# Version and Metadata #############################

Expand Down Expand Up @@ -103,9 +107,6 @@ option_with_default(LIBINT2_ENABLE_PYTHON
option_with_default(LIBINT2_PREFIX_PYTHON_INSTALL
"For LIBINT2_ENABLE_PYTHON=ON, whether to install the Python module in the Linux manner to CMAKE_INSTALL_PREFIX or to not install it. See target libint2-python-wheel for alternate installation in the Python manner to Python_EXECUTABLE's site-packages." OFF)

option_with_print(LIBINT2_ENABLE_MPFR
"Use GNU MPFR library for high-precision testing (EXPERTS ONLY). Consumed at library build-time." OFF)
## next one defined by `include(CTest)`

# <<< Which Integrals Classes, Which Derivative Levels >>>

Expand Down Expand Up @@ -262,10 +263,15 @@ option_with_print(LIBINT_FLOP_COUNT
"Support (approximate) FLOP counting by the library. (Generated code will require C++11!)" OFF)
option_with_print(LIBINT_PROFILE
"Turn on profiling instrumentation of the library. (Generated code will require C++11!)" OFF)
option_with_print(LIBINT2_ENABLE_MPFR
"Use GNU MPFR library for high-precision testing (EXPERTS ONLY). Consumed at library build-time." OFF)
# next one defined by `include(CTest)`
message(STATUS "Showing option BUILD_TESTING: ${BUILD_TESTING}")


# <<< Path >>>

######################## Process & Validate Options ###########################
include(autocmake_safeguards)
include(CheckFunctionExists)
include(CheckIncludeFileCXX)
include(FeatureSummary)
Expand Down
23 changes: 23 additions & 0 deletions INSTALL.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,29 @@ The Libint build is structured into three parts:
- (7) optional Python build alongside library or afterwards. optional testing requires library install


Command-line synopsis. See [table](#Build-Targets) for `--target` choices (steps refer to numbered bullets above) and [section](#Configuring-Libint) for `-D options` choices.

```bash
>>> git clone https://github.com/evaleev/libint.git && cd libint
>>> ls
cmake/ COPYING src/ tests/ ...
>>> cmake -S. -Bbuild -GNinja -DCMAKE_INSTALL_PREFIX=/path/to/future/install-libint -D options ...
...
-- Generating done
-- Build files have been written to: /current/dir/build
>>> cmake --build build --target install
```

### Build Targets

| `--target ...` | incl. | steps | ( | see | above | ) | | (TARBALL) `--target ...` [^25] |
| -------------- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ------------------------------ |
| `build_libint` | 1 | - | - | - | - | - | - | n/a |
| `check-libint2compiler` | 1 | 2 | - | - | - | - | - | n/a |

[^25]: (TARBALL) targets can include steps 4 onwards; the starting tarball itself is the product of step 3.


-----------------------------------------------------------------------------

# Prerequisites
Expand Down
46 changes: 46 additions & 0 deletions cmake/modules/AddCustomTargetSubproject.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Copyright 2020 Eduard F Valeyev
# Distributed under the OSI-approved BSD 3-Clause License.
# See https://opensource.org/licenses/BSD-3-Clause for details.

# copy of https://github.com/BTAS/BTAS/blob/master/cmake/modules/AddCustomTargetSubproject.cmake
#
# add_custom_target_subproject(proj X ...) defines custom target X-proj and
# - if target X already exists, makes it depend on X-proj
# - else creates target X depending on X-proj
#
# use case: if custom target names (e.g. "check", "doc", etc.) clash
# with other project's target when used as a subproject
#
# example: add_custom_target_subproject(myproject check USES_TERMINAL COMMAND ${CMAKE_CTEST_COMMAND} -V)
#

macro(add_custom_target_subproject _subproj _name)

set(extra_args "${ARGN}")
add_custom_target(${_name}-${_subproj} ${extra_args})

# does the newly-created target get compiled by default?
list(FIND extra_args "ALL" extra_args_has_all)
if (NOT (extra_args_has_all EQUAL -1))
set (target_built_by_default ON)
endif()

if (TARGET ${_name})
# is existing target ${_name} also compiled by default?
# warn if not, but this project's target is since that
# may indicate inconsistent creation of generic targets
get_target_property(supertarget_not_built_by_default ${_name} EXCLUDE_FROM_ALL)
if (target_built_by_default AND supertarget_not_built_by_default)
message(WARNING "Created target ${_name}-${_subproj} is built by default but \"super\"-target ${_name} is not; perhaps it should be?")
endif()
add_dependencies(${_name} ${_name}-${_subproj})
else (TARGET ${_name})
# use ALL if given
if (target_built_by_default)
add_custom_target(${_name} ALL DEPENDS ${_name}-${_subproj})
else (target_built_by_default)
add_custom_target(${_name} DEPENDS ${_name}-${_subproj})
endif(target_built_by_default)
endif (TARGET ${_name})

endmacro()
27 changes: 27 additions & 0 deletions cmake/modules/autocmake_safeguards.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Downloaded from
# https://github.com/coderefinery/autocmake/blob/master/modules/safeguards.cmake
# * changed text of in-source message

#.rst:
#
# Provides safeguards against in-source builds and bad build types.
#
# Variables used::
#
# PROJECT_SOURCE_DIR
# PROJECT_BINARY_DIR
# CMAKE_BUILD_TYPE

if(${PROJECT_SOURCE_DIR} STREQUAL ${PROJECT_BINARY_DIR})
message(FATAL_ERROR "In-source builds not allowed. Please run CMake from top directory and specify a build directory (e.g., cmake -S. -Bbuild).")
endif()

string(TOLOWER "${CMAKE_BUILD_TYPE}" cmake_build_type_tolower)
string(TOUPPER "${CMAKE_BUILD_TYPE}" cmake_build_type_toupper)

if(NOT cmake_build_type_tolower STREQUAL "debug" AND
NOT cmake_build_type_tolower STREQUAL "release" AND
NOT cmake_build_type_tolower STREQUAL "minsizerel" AND
NOT cmake_build_type_tolower STREQUAL "relwithdebinfo")
message(FATAL_ERROR "Unknown build type \"${CMAKE_BUILD_TYPE}\". Allowed values are Debug, Release, MinSizeRel, RelWithDebInfo (case-insensitive).")
endif()
16 changes: 16 additions & 0 deletions include/libint2/config.h.cmake.in
Original file line number Diff line number Diff line change
Expand Up @@ -326,6 +326,22 @@
#define LIBINT_DEPRECATED(msg) LIBINT_XPRAGMA( LIBINT_CONCAT(message, msg) )
#endif

#ifdef __has_cpp_attribute
#if __has_cpp_attribute(maybe_unused)
#define LIBINT_MAYBE_UNUSED [[maybe_unused]]
#endif
#endif // __has_cpp_attribute
#ifndef LIBINT_MAYBE_UNUSED
#if defined __has_attribute
# if __has_attribute (unused)
# define LIBINT_MAYBE_UNUSED __attribute__ ((unused))
# endif
#endif // __has_attribute
#endif // LIBINT_MAYBE_UNUSED
#ifndef LIBINT_MAYBE_UNUSED // fallback
#define LIBINT_MAYBE_UNUSED
#endif

#if @_EXPORT_MODE@
#include "libint2/config2.h"
#endif
Expand Down
1 change: 1 addition & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
add_subdirectory(bin)
add_subdirectory(lib)
15 changes: 15 additions & 0 deletions src/bin/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
add_subdirectory(libint)

include(AddCustomTargetSubproject)
add_custom_target_subproject(
libint2compiler
check
USES_TERMINAL
COMMAND ${CMAKE_CTEST_COMMAND} -V -R "libint2/compiler"
)

if (BUILD_TESTING)
add_subdirectory(test_eri)
# borrows main libint/test.cc from libtool layout
add_subdirectory(profile)
endif()
Loading

0 comments on commit 57fa38f

Please sign in to comment.