Skip to content

Commit

Permalink
Improve cMake and docker builds
Browse files Browse the repository at this point in the history
  • Loading branch information
pthibaud authored and Nimish Telang committed Feb 16, 2023
1 parent a6414d7 commit 2b5518c
Show file tree
Hide file tree
Showing 19 changed files with 316 additions and 564 deletions.
53 changes: 53 additions & 0 deletions .github/workflows/compile.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
name: Sparselizard Compilation

on: [push]

jobs:
Compilation-Actions:
runs-on: ubuntu-22.04

env:
CCACHE_COMPRESS: "true"
CCACHE_MAXSIZE: 500M
CC: gcc-12
CXX: g++-12
OMPI_CC: gcc-12
OMPI_CXX: g++-12

steps:
- name: Check out repository code
uses: actions/checkout@v2
- run: echo "The ${{ github.repository }} repository has been cloned to the runner."
- run: echo "The workflow is now ready to test the code on the runner."

- name: install ccache
run: sudo apt-get install ccache

- name: identify machine architecture
run: |
gcc -### -E -march=native - &> machine-type.txt
cat machine-type.txt
- name: restore cache
uses: actions/cache@v2
with:
path: ~/.ccache
key: ccache-${{ hashFiles('machine-type.txt') }}-${{ github.sha }}
restore-keys: ccache-${{ hashFiles('machine-type.txt') }}-

- name: Install mandatory packages
run: sudo apt-get install -y libomp-dev ninja-build cmake libopenblas-dev libmetis-dev libopenmpi-dev libmumps-dev petsc-dev slepc-dev libgmsh-dev

- name: build
run: |
export PATH="/usr/lib/ccache:$PATH"
mkdir build
cmake -G Ninja -S . -B build
cmake --build build -- -j $(getconf _NPROCESSORS_ONLN)
- name: show ccache stats
run: |
ccache --show-stats
ccache --zero-stats
- run: echo "🍏 This job's status is ${{ job.status }}."
41 changes: 41 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,44 @@ build/

# CCLS cache
.ccls-cache/
machine-type.txt

CMakeLists.txt.user
CMakeCache.txt
CMakeFiles
CMakeScripts
Testing
Makefile
cmake_install.cmake
install_manifest.txt
compile_commands.json
CTestTestfile.cmake
_deps

# General
.DS_Store
.AppleDouble
.LSOverride

# Icon must end with two \r
Icon


# Thumbnails
._*

# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent

# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
120 changes: 92 additions & 28 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,43 +1,107 @@
# Thanks to S. Matsievskiy for bringing cmake to the project.

cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
cmake_minimum_required(VERSION 3.23 FATAL_ERROR)

project(Sparselizard LANGUAGES CXX)

set(DEFAULT_BUILD_TYPE "Release")
set(CMAKE_BUILD_TYPE "${DEFAULT_BUILD_TYPE}" CACHE STRING "Choose the type of build" FORCE)

set(PETSC_PATH "~/SLlibs/petsc" CACHE STRING "Provide the path to the petsc folder")
set(GMSH_PATH "~/SLlibs/gmsh" CACHE STRING "Provide the path to the gmsh folder")
set(MPI_PATH "" CACHE STRING "Provide the path to the mpi folder")

# Place library in build folder:
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
SET(CMAKE_CXX_STANDARD 17)
SET(CMAKE_CXX_FLAGS_DEBUG "-g -Og -Wall -Wextra -Wpedantic")
SET(CMAKE_CXX_FLAGS_RELEASE "-O3")

if(NOT BLA_VENDOR)
set(BLA_VENDOR CACHE STRING OpenBLAS)
endif()

# Default flags:
set(BLAS_FOUND NO)
set(GMSH_FOUND NO)
set(METIS_FOUND NO)
set(MPI_FOUND NO)
set(MUMPS_FOUND NO)
set(PETSC_FOUND NO)
set(SLEPC_FOUND NO)
if(NOT PETSC_DIR AND NOT(APPLE))
set(PETSC_DIR CACHE STRING /usr/lib/petscdir)
endif()

# Add cmake packages
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
list(APPEND CMAKE_PREFIX_PATH $<$<BOOL:${APPLE}>:/opt/homebrew/opt/openblas> ${PETSC_DIR})

# Installation definitions
include(GNUInstallDirs)
# Aux functions
include(cMake/functions.cmake)
include(cMake/SetupBLAS.cmake)
include(cMake/SetupGMSH.cmake)
include(cMake/SetupMETIS.cmake)
include(cMake/SetupMPI.cmake)
include(cMake/SetupMUMPS.cmake)
include(cMake/SetupPETSC.cmake)
include(cMake/SetupSLEPC.cmake)

# Add libsparselizard target
add_subdirectory(src)

# Add simulations targets
add_subdirectory(simulations)

# this is not the cmake-official way but it's a lot easier
set(INCLUDE_DIRS
src
src/mesh
src/gausspoint
src/io
src/io/paraview
src/io/nastran
src/io/gmsh
src/field
src/resolution
src/geometry
src/expression
src/expression/operation
src/shapefunction
src/shapefunction/hierarchical
src/shapefunction/hierarchical/h1
src/shapefunction/hierarchical/hcurl
src/shapefunction/lagrange
src/formulation
)
file(GLOB_RECURSE SRC_FILES "src/*.cpp")
file(GLOB_RECURSE SRC_HEADERS "src/*.h")
add_library(sparselizard SHARED ${SRC_FILES})
# Note: the following would allow hierarchical install, but sparselizard acts as if it's flattened
# target_sources(sparselizard PUBLIC FILE_SET HEADERS FILES ${SRC_HEADERS} BASE_DIRS src)
target_precompile_headers(sparselizard PUBLIC ${SRC_HEADERS})
target_include_directories(sparselizard PUBLIC ${INCLUDE_DIRS})
set_target_properties(sparselizard PROPERTIES PUBLIC_HEADER "${SRC_HEADERS}")

target_compile_options(sparselizard PUBLIC -fPIC -O3)

find_package(OpenMP REQUIRED)
target_link_libraries(sparselizard PUBLIC OpenMP::OpenMP_CXX)

find_package(MPI REQUIRED)
target_link_libraries(sparselizard PUBLIC MPI::MPI_CXX)

find_package(BLAS REQUIRED)
target_link_libraries(sparselizard PUBLIC BLAS::BLAS)

find_package(PETSC REQUIRED)
target_link_libraries(sparselizard PUBLIC PETSC::PETSC)

find_package(SLEPC)
target_link_libraries(sparselizard PUBLIC SLEPC::SLEPC)

find_package(GMSH)
if(GMSH_FOUND)
target_link_libraries(sparselizard PUBLIC GMSH::GMSH)
target_compile_definitions(sparselizard PRIVATE -DHAVE_GMSH)
endif()

find_package(METIS)

if(METIS_FOUND)
target_link_libraries(sparselizard PUBLIC METIS::METIS)
target_compile_definitions(sparselizard PRIVATE -DHAVE_METIS)
endif()

target_link_libraries(sparselizard PUBLIC cmumps)
target_compile_definitions(sparselizard PRIVATE
-DHAVE_BLAS
-DHAVE_MPI
-DHAVE_MUMPS
-DHAVE_PETSC
-DHAVE_SLEPC
)

install(TARGETS sparselizard LIBRARY PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_PREFIX}/include/sparselizard)

set(BUILD_SIMULATIONS YES)

if(BUILD_SIMULATIONS)
add_subdirectory(simulations)
message(STATUS "Building simulations")
endif()
45 changes: 45 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
FROM debian:testing-slim as build

LABEL maintainer="[email protected]"
LABEL version="0.2"
LABEL description="Sparselizard on docker. See https://github.com/pthibaud/dockerlizard"

# Disable prompt during packages installation
ARG DEBIAN_FRONTEND=noninteractive

# Update ubuntu software repository
# Install additional repository
RUN apt-get update && \
apt-get -y upgrade && \
apt-get -y dist-upgrade && \
apt-get install -y apt-utils build-essential cmake \
libopenblas-dev \
libopenmpi-dev \
libmumps-dev \
libmetis-dev \
petsc-dev \
slepc-dev \
libgmsh-dev \
libomp-dev \
ninja-build

# Clean the installation
RUN apt-get clean


WORKDIR /sparselizard
COPY CMakeLists.txt .
COPY src src
COPY cmake cmake
COPY simulations simulations
RUN mkdir build
# Prepare compilation environment
RUN cmake -G Ninja -S . -B build
RUN cmake --build build -- -j 8

RUN mkdir -p /usr/local
RUN cmake --install build -v --prefix /usr/local

# Install the library and headers; Put the env variables
# RUN make install
ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
72 changes: 0 additions & 72 deletions Makefile

This file was deleted.

Loading

0 comments on commit 2b5518c

Please sign in to comment.