Skip to content

Commit

Permalink
Merge 3a2f30d into a48ab8a
Browse files Browse the repository at this point in the history
  • Loading branch information
benegee committed Oct 10, 2023
2 parents a48ab8a + 3a2f30d commit 8addffe
Show file tree
Hide file tree
Showing 15 changed files with 139 additions and 76 deletions.
26 changes: 15 additions & 11 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ jobs:
cmake .. -DCMAKE_INSTALL_PREFIX=../install \
-DCMAKE_BUILD_TYPE=Release \
-DT8CODE_PREFIX=$PWD/../t8code-local/prefix \
-DENABLE_TESTING=ON -DJULIA_PROJECT_PATH=../libtrixi-julia
-DENABLE_TESTING=ON -DLIBTRIXI_JULIA_PROJECT=../libtrixi-julia
- name: Configure (test_type == 'coverage')
if: ${{ matrix.test_type == 'coverage' }}
Expand All @@ -113,7 +113,7 @@ jobs:
-DCMAKE_Fortran_FLAGS="-cpp --coverage -O0" \
-DCMAKE_EXE_LINKER_FLAGS="--coverage" \
-DCMAKE_SHARED_LINKER_FLAGS="--coverage" \
-DENABLE_TESTING=ON -DJULIA_PROJECT_PATH=../libtrixi-julia
-DENABLE_TESTING=ON -DLIBTRIXI_JULIA_PROJECT=../libtrixi-julia
- name: Build
if: ${{ matrix.test_type == 'regular' || matrix.test_type == 'coverage' }}
Expand Down Expand Up @@ -170,17 +170,21 @@ jobs:
--julia-depot ~/.julia \
--force
- name: Build libtrixi using PackageCompiler
- name: Configure (test_type == 'package-compiler')
if: ${{ matrix.test_type == 'package-compiler' }}
run: |
cd LibTrixi.jl/lib
make
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=../install \
-DCMAKE_BUILD_TYPE=Debug \
-DUSE_PACKAGE_COMPILER=ON \
-DLIBTRIXI_JULIA_PROJECT=$PWD/../libtrixi-julia
- name: Build example
- name: Build
if: ${{ matrix.test_type == 'package-compiler' }}
run: |
cd examples
make -f MakefileCompiled LIBTRIXI_PREFIX=$PWD/../LibTrixi.jl/lib/build
cd build
make -j2
- name: Test external CMake project
if: ${{ matrix.test_type == 'regular' }}
Expand Down Expand Up @@ -227,10 +231,10 @@ jobs:
- name: Run examples
if: ${{ matrix.test_type == 'package-compiler' }}
run: |
cd examples
cd build/examples
mpirun -n 2 simple_trixi_controller_c \
../libtrixi-julia \
../LibTrixi.jl/examples/libelixir_p4est2d_dgsem_euler_sedov.jl
../../libtrixi-julia \
../../LibTrixi.jl/examples/libelixir_p4est2d_dgsem_euler_sedov.jl
env:
LIBTRIXI_DEBUG: all

Expand Down
157 changes: 105 additions & 52 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -47,87 +47,140 @@ find_package( MPI REQUIRED )
# Find Google Test and test-drive on demand
option( ENABLE_TESTING "Build tests using Google Test (C) and test-drive (Fortran)" )
if( ENABLE_TESTING )
if ( NOT DEFINED JULIA_PROJECT_PATH )
message( FATAL_ERROR "JULIA_PROJECT_PATH not set, tests will not work.")
if ( NOT DEFINED LIBTRIXI_JULIA_PROJECT )
message( FATAL_ERROR "LIBTRIXI_JULIA_PROJECT not set, tests will not work.")
endif()
set( JULIA_PROJECT_PATH ${JULIA_PROJECT_PATH} CACHE PATH
set( LIBTRIXI_JULIA_PROJECT ${LIBTRIXI_JULIA_PROJECT} CACHE PATH
"Path to Julia project (typically 'libtrixi-julia').")

find_package( GTest REQUIRED )

set ( TEST_DRIVE_FIND_METHOD fetch )
# option TEST_DRIVE_BUILD_TESTING is hard-coded to ON
# Option TEST_DRIVE_BUILD_TESTING is hard-coded to ON, could be spared
find_package( test-drive REQUIRED )
endif()

# Optionally use PackageCompiler.jl to build standalone libtrixi.so
option( USE_PACKAGE_COMPILER "Build standalone libtrixi.so using PackageCompiler.jl" )

# Fortran mod file location
set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR})

# Library target
add_library ( ${PROJECT_NAME} SHARED
src/api.c
src/api.f90
src/auxiliary.h
src/auxiliary.c
src/trixi.h
)
if( USE_PACKAGE_COMPILER )
if ( NOT DEFINED LIBTRIXI_JULIA_PROJECT )
message( FATAL_ERROR "LIBTRIXI_JULIA_PROJECT needs to be set for PackageCompiler.jl.")
endif()
if ( ENABLE_TESTING )
message( NOTICE "Testing is not supported when PackageCompiler is used.")
endif()

# Include directories, private
target_include_directories ( ${PROJECT_NAME} PRIVATE src )
# Copy source with initialization routines; an object file will be created
file( MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/build-pc )
file( COPY_FILE ${CMAKE_SOURCE_DIR}/LibTrixi.jl/lib/init.c
${CMAKE_BINARY_DIR}/build-pc/init.c
ONLY_IF_DIFFERENT )

# Define PackageCompiler.jl output file
set( PC_LIBTRIXI_SO ${CMAKE_BINARY_DIR}/prefix-pc/lib/libtrixi.so )

# Add a library target (libtrixi), only for Fortran module
add_library( ${PROJECT_NAME} OBJECT
src/api.f90
)

# Custom command to run PackageCompiler.jl to produce libtrixi.so
add_custom_command( OUTPUT ${PC_LIBTRIXI_SO}
COMMENT "Building ${PROJECT_NAME} with PackageCompiler.jl..."
COMMAND ${JULIA_EXECUTABLE}
--project=${CMAKE_SOURCE_DIR}/LibTrixi.jl/lib
${CMAKE_SOURCE_DIR}/LibTrixi.jl/lib/build.jl
${LIBTRIXI_JULIA_PROJECT}
${CMAKE_BINARY_DIR}/prefix-pc
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/build-pc )

# Custom target for PackageCompiler.jl's libtrixi.so
add_custom_target( PC_LIBTRIXI DEPENDS ${PC_LIBTRIXI_SO} )

# Dependency of main library target on PackageCompiler.jl target
add_dependencies( ${PROJECT_NAME} PC_LIBTRIXI )

# Add linking to PackageCompiler.jl's libtrixi.so
target_link_libraries( ${PROJECT_NAME} INTERFACE ${PC_LIBTRIXI_SO} )

# Install configuration
install( DIRECTORY "${CMAKE_BINARY_DIR}/prefix-pc/lib/" TYPE LIB )
install( DIRECTORY "${CMAKE_BINARY_DIR}/prefix-pc/share/julia"
DESTINATION share
PATTERN "cert.pem" EXCLUDE )
else()
# Library target
add_library ( ${PROJECT_NAME} SHARED
src/api.c
src/api.f90
src/auxiliary.h
src/auxiliary.c
src/trixi.h
)

# Version info
set_target_properties ( ${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION} )
# Include directories, private
target_include_directories ( ${PROJECT_NAME} PRIVATE src )

# Version info for the shared object
set_target_properties ( ${PROJECT_NAME} PROPERTIES SOVERSION ${PROJECT_VERSION_MAJOR} )
# Version info
set_target_properties ( ${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION} )

# Include directories, public for actual users
set_target_properties ( ${PROJECT_NAME} PROPERTIES PUBLIC_HEADER src/trixi.h )
# Version info for the shared object
set_target_properties ( ${PROJECT_NAME} PROPERTIES SOVERSION ${PROJECT_VERSION_MAJOR} )

# Fortran mod file location
set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR})


# Include directories
target_include_directories( ${PROJECT_NAME} PRIVATE src ${JULIA_INCLUDE_DIRS} )
if ( T8CODE_FOUND )
target_include_directories( ${PROJECT_NAME} PRIVATE ${T8CODE_INCLUDE_DIR} )
endif()

# Include directories
target_include_directories( ${PROJECT_NAME} PRIVATE src ${JULIA_INCLUDE_DIRS} )
if ( T8CODE_FOUND )
target_include_directories( ${PROJECT_NAME} PRIVATE ${T8CODE_INCLUDE_DIR} )
endif()
# Libraries to link
target_link_libraries( ${PROJECT_NAME} PRIVATE ${JULIA_LIBRARY} )

# Libraries to link
target_link_libraries( ${PROJECT_NAME} PRIVATE ${JULIA_LIBRARY} )
# Set appropriate compile flags
target_compile_options( ${PROJECT_NAME} PUBLIC "-fPIC" )
target_compile_options( ${PROJECT_NAME} PRIVATE -Wall -Wextra -Werror)
# Require C11 standard with GNU extensions for C files
target_compile_options( ${PROJECT_NAME} PRIVATE $<$<COMPILE_LANGUAGE:C>:-std=gnu11>)
# Require Fortran 2018 standard for Fortran files
target_compile_options( ${PROJECT_NAME} PRIVATE $<$<COMPILE_LANGUAGE:Fortran>:-std=f2018>)

# Set appropriate compile flags
target_compile_options( ${PROJECT_NAME} PUBLIC "-fPIC" )
target_compile_options( ${PROJECT_NAME} PRIVATE -Wall -Wextra -Werror)
# Require C11 standard with GNU extensions for C files
target_compile_options( ${PROJECT_NAME} PRIVATE $<$<COMPILE_LANGUAGE:C>:-std=gnu11>)
# Require Fortran 2018 standard for Fortran files
target_compile_options( ${PROJECT_NAME} PRIVATE $<$<COMPILE_LANGUAGE:Fortran>:-std=f2018>)


# Add auxiliary *object* library to support fast thread-local storage (TLS)
add_library ( ${PROJECT_NAME}_tls OBJECT
src/tls.c
)
target_include_directories( ${PROJECT_NAME}_tls PRIVATE ${JULIA_INCLUDE_DIRS} )

# Add auxiliary *object* library to support fast thread-local storage (TLS)
add_library ( ${PROJECT_NAME}_tls OBJECT
src/tls.c
)
target_include_directories( ${PROJECT_NAME}_tls PRIVATE ${JULIA_INCLUDE_DIRS} )
# Add test on demand
if( ENABLE_TESTING )
enable_testing()
add_subdirectory( test/c )
add_subdirectory( test/fortran )
endif()

# Add examples
add_subdirectory( examples )

# Add test on demand
if( ENABLE_TESTING )
enable_testing()
add_subdirectory( test/c )
add_subdirectory( test/fortran )
# Install configuration
install( FILES $<TARGET_OBJECTS:${PROJECT_NAME}_tls> TYPE LIB RENAME lib${PROJECT_NAME}_tls.o )
install( FILES "${CMAKE_BINARY_DIR}/LIBTRIXI_VERSION" DESTINATION share/julia )
endif()


# Install configuration

# Public header for libtrixi
set_target_properties ( ${PROJECT_NAME} PROPERTIES PUBLIC_HEADER src/trixi.h )

# Common install configuration
install( TARGETS ${PROJECT_NAME} )
install( DIRECTORY LibTrixi.jl DESTINATION share/libtrixi PATTERN "lib" EXCLUDE )
install( FILES ${CMAKE_Fortran_MODULE_DIRECTORY}/libtrixi.mod TYPE INCLUDE)
install( FILES $<TARGET_OBJECTS:${PROJECT_NAME}_tls> TYPE LIB RENAME lib${PROJECT_NAME}_tls.o )
install( DIRECTORY LibTrixi.jl DESTINATION share/libtrixi )
install( FILES "${CMAKE_BINARY_DIR}/LIBTRIXI_VERSION" DESTINATION share/julia )
install( PROGRAMS utils/libtrixi-init-julia TYPE BIN )

# Add examples
add_subdirectory( examples )
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ For building, `cmake` and its typical workflow is used.
2. Call cmake

```bash
cmake -DCMAKE_BUILD_TYPE=(debug|release) -DCMAKE_INSTALL_PREFIX=<install_directory> ..
cmake -DCMAKE_BUILD_TYPE=(Debug|Release) -DCMAKE_INSTALL_PREFIX=<install_directory> ..
```

`cmake` should find `MPI` and `Julia` automatically. If not, the directories
Expand Down
2 changes: 1 addition & 1 deletion docs/src/developers.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ For testing the C interface of libtrixi we rely on [GoogleTest](https://google.g
The tests are contained in `cpp`-files located under `test/c`. They are processed by `cmake` and made available via
`ctest`, provided the options
```
-DENABLE_TESTING=ON -DJULIA_PROJECT_PATH=<libtrixi-julia_directory>
-DENABLE_TESTING=ON -DLIBTRIXI_JULIA_PROJECT=<libtrixi-julia_directory>
```
are passed to `cmake` during configuration.
The executables can then be found under `<build_directory>/test/c` (they will not be installed). To run them, execute
Expand Down
2 changes: 1 addition & 1 deletion docs/src/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ For building, `cmake` and its typical workflow is used.
2. Call cmake

```bash
cmake -DCMAKE_BUILD_TYPE=(debug|release) -DCMAKE_INSTALL_PREFIX=<install_directory> ..
cmake -DCMAKE_BUILD_TYPE=(Debug|Release) -DCMAKE_INSTALL_PREFIX=<install_directory> ..
```

`cmake` should find `MPI` and `Julia` automatically. If not, the directories
Expand Down
8 changes: 7 additions & 1 deletion examples/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,11 @@ foreach ( EXAMPLE ${EXAMPLES} )
# set libraries to link
target_link_libraries(
${TARGET_NAME}
PRIVATE MPI::MPI_${EXAMPLE_LANG} ${PROJECT_NAME} ${PROJECT_NAME}_tls
PRIVATE MPI::MPI_${EXAMPLE_LANG} ${PROJECT_NAME}
)
if ( NOT USE_PACKAGE_COMPILER )
target_link_libraries( ${TARGET_NAME} PRIVATE ${PROJECT_NAME}_tls )
endif()
if ( T8CODE_FOUND )
target_link_libraries( ${TARGET_NAME} PRIVATE ${T8CODE_LIBRARIES} )
endif()
Expand All @@ -52,6 +55,9 @@ foreach ( EXAMPLE ${EXAMPLES} )
PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib"
)

# position independent code
target_compile_options( ${TARGET_NAME} PRIVATE "-fPIC" )

# enable warnings
target_compile_options( ${TARGET_NAME} PRIVATE -Wall -Wextra -Werror )

Expand Down
2 changes: 1 addition & 1 deletion test/c/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ foreach ( TEST ${TESTS} )

# pass julia project path
target_compile_definitions( ${TARGET_NAME} PRIVATE
JULIA_PROJECT_PATH=\"${JULIA_PROJECT_PATH}\" )
LIBTRIXI_JULIA_PROJECT=\"${LIBTRIXI_JULIA_PROJECT}\" )

# discover tests
gtest_discover_tests( ${TARGET_NAME} )
Expand Down
2 changes: 1 addition & 1 deletion test/c/auxiliary.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ extern "C" {
}

// Julia project path defined via cmake
const char * julia_project_path = JULIA_PROJECT_PATH;
const char * julia_project_path = LIBTRIXI_JULIA_PROJECT;

const char* default_depot_path = "julia-depot";

Expand Down
2 changes: 1 addition & 1 deletion test/c/interface_c.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ extern "C" {
}

// Julia project path defined via cmake
const char * julia_project_path = JULIA_PROJECT_PATH;
const char * julia_project_path = LIBTRIXI_JULIA_PROJECT;

// Example libexlixir
const char * libelixir_path =
Expand Down
2 changes: 1 addition & 1 deletion test/c/simulation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ extern "C" {
}

// Julia project path defined via cmake
const char * julia_project_path = JULIA_PROJECT_PATH;
const char * julia_project_path = LIBTRIXI_JULIA_PROJECT;

// Example libexlixir
const char * libelixir_path =
Expand Down
2 changes: 1 addition & 1 deletion test/c/t8code.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ extern "C" {
}

// Julia project path defined via cmake
const char * julia_project_path = JULIA_PROJECT_PATH;
const char * julia_project_path = LIBTRIXI_JULIA_PROJECT;

// Example libexlixir
const char * libelixir_path =
Expand Down
2 changes: 1 addition & 1 deletion test/fortran/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ target_compile_options( ${TARGET_NAME} PRIVATE -cpp -Wall -Wextra -Werror -Wno-u

# pass julia project path
target_compile_definitions( ${TARGET_NAME} PRIVATE
JULIA_PROJECT_PATH=\"${JULIA_PROJECT_PATH}\" )
LIBTRIXI_JULIA_PROJECT=\"${LIBTRIXI_JULIA_PROJECT}\" )

# add tests
foreach ( TEST ${TESTS} )
Expand Down
2 changes: 1 addition & 1 deletion test/fortran/juliaCode_suite.f90
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ module juliaCode_suite

public :: collect_juliaCode_suite

character(len=*), parameter, public :: julia_project_path = JULIA_PROJECT_PATH
character(len=*), parameter, public :: julia_project_path = LIBTRIXI_JULIA_PROJECT

contains

Expand Down
2 changes: 1 addition & 1 deletion test/fortran/simulationRun_suite.f90
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ module simulationRun_suite

public :: collect_simulationRun_suite

character(len=*), parameter, public :: julia_project_path = JULIA_PROJECT_PATH
character(len=*), parameter, public :: julia_project_path = LIBTRIXI_JULIA_PROJECT
character(len=*), parameter, public :: libelixir_path = &
"../../../LibTrixi.jl/examples/libelixir_p4est2d_dgsem_euler_sedov.jl"

Expand Down
2 changes: 1 addition & 1 deletion test/fortran/versionInfo_suite.f90
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ module versionInfo_suite

public :: collect_versionInfo_suite

character(len=*), parameter, public :: julia_project_path = JULIA_PROJECT_PATH
character(len=*), parameter, public :: julia_project_path = LIBTRIXI_JULIA_PROJECT

contains

Expand Down

0 comments on commit 8addffe

Please sign in to comment.