Skip to content

Commit 74df386

Browse files
committed
Adding CMake files to build libcaffeine and native-multi-image test.
This commit contains the necessary files to build libcaffeine with CMake. It also builds required dependencies such as libassert and GASNet-ex if they are not found. The native-mult-image test is also built if the LLVMFlang compiler is used (currently it is the only one that supports PRIF lowering).
1 parent 5fb6b0e commit 74df386

File tree

4 files changed

+511
-0
lines changed

4 files changed

+511
-0
lines changed

CMakeLists.txt

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
cmake_minimum_required(VERSION 3.20.0)
2+
3+
project(caffeine LANGUAGES C CXX Fortran)
4+
include(ExternalProject)
5+
6+
if(NOT DEFINED BUILD_SHARED_LIBS)
7+
set(BUILD_SHARED_LIBS ON CACHE BOOL "Build shared libraries" FORCE)
8+
endif()
9+
10+
add_subdirectory(src)
11+
12+
# ---------------------------------------------------------
13+
# Dependencies
14+
# ---------------------------------------------------------
15+
if (NOT DEFINED CMAKE_INSTALL_PREFIX)
16+
set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/install)
17+
endif()
18+
19+
target_include_directories(caffeine PUBLIC ${CMAKE_BINARY_DIR}/include)
20+
target_include_directories(caffeine PUBLIC ${CMAKE_SOURCE_DIR}/include)
21+
22+
message(STATUS "CMAKE_Fortran_COMPILER_ID: ${CMAKE_Fortran_COMPILER_ID}")
23+
if(CMAKE_Fortran_COMPILER_ID STREQUAL "LLVMFlang")
24+
set(Fortran_COMPILER "flang-new")
25+
endif()
26+
27+
# --------
28+
# Assert
29+
# --------
30+
SET(ASSERT_GIT "https://github.com/berkeleylab/assert.git")
31+
SET(ASSERT_TAG "3.0.2")
32+
ExternalProject_Add(assert_lib
33+
GIT_REPOSITORY ${ASSERT_GIT}
34+
GIT_TAG ${ASSERT_TAG}
35+
CONFIGURE_COMMAND ""
36+
INSTALL_DIR ${CMAKE_BINARY_DIR}
37+
BUILD_COMMAND fpm build --compiler ${Fortran_COMPILER}
38+
INSTALL_COMMAND
39+
fpm install --prefix=<INSTALL_DIR> --compiler ${Fortran_COMPILER} &&
40+
${CMAKE_COMMAND} -E make_directory <INSTALL_DIR> &&
41+
${CMAKE_COMMAND} -E copy_directory <SOURCE_DIR>/include <INSTALL_DIR>/include
42+
BUILD_IN_SOURCE 1
43+
)
44+
45+
add_library(assert_lib_external STATIC IMPORTED)
46+
set_target_properties(assert_lib_external PROPERTIES
47+
IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/lib/libassert.a
48+
INTERFACE_INCLUDE_DIRECTORIES $<INSTALL_INTERFACE:${CMAKE_BINARY_DIR}/include>
49+
)
50+
add_dependencies(assert_lib_external assert_lib)
51+
target_link_libraries(caffeine PRIVATE assert_lib_external)
52+
53+
# -----------
54+
# GASNet-EX
55+
# -----------
56+
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
57+
if (NOT DEFINED GASNet_THREADING)
58+
set(GASNet_THREADING seq)
59+
endif()
60+
if (NOT DEFINED GASNet_PREFERRED_CONDUITS)
61+
set(GASNet_PREFERRED_CONDUITS smp)
62+
endif()
63+
64+
find_package(GASNet QUIET)
65+
if (NOT GASNet_FOUND)
66+
set(GASNet_TAG "2025.8.0")
67+
set(GASNet_MD5 "7f61c16c6d06e9789157b3b6804e1927")
68+
message(STATUS "Cannot find GASNet-Ex, maybe GASNet_ROOT variable is not set.")
69+
message(STATUS "Configuration and building of GASNet-Ex from release ${GASNet_TAG}.")
70+
if(BUILD_SHARED_LIBS)
71+
if(NOT CMAKE_C_FLAGS MATCHES "-fPIC")
72+
set(CMAKE_C_FLAGS "-fPIC ${CMAKE_C_FLAGS}")
73+
endif()
74+
if(NOT CMAKE_CXX_FLAGS MATCHES "-fPIC")
75+
set(CMAKE_CXX_FLAGS "-fPIC ${CMAKE_CXX_FLAGS}")
76+
endif()
77+
endif()
78+
ExternalProject_Add(gasnet_ex
79+
URL https://gasnet.lbl.gov/EX/GASNet-${GASNet_TAG}.tar.gz
80+
URL_HASH MD5=${GASNet_MD5}
81+
INSTALL_DIR ${CMAKE_BINARY_DIR}/gasnet
82+
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
83+
DOWNLOAD_NO_EXTRACT FALSE
84+
CONFIGURE_COMMAND
85+
<SOURCE_DIR>/configure --prefix=<INSTALL_DIR> --enable-static --enable-seq --with-cflags=${CMAKE_C_FLAGS} --with-cppflags=${CMAKE_CXX_FLAGS}
86+
BUILD_COMMAND make -j
87+
INSTALL_COMMAND make install
88+
BUILD_IN_SOURCE 1
89+
)
90+
set(GASNET_INSTALL ${CMAKE_BINARY_DIR}/gasnet)
91+
add_library(gasnet_lib STATIC IMPORTED)
92+
set_target_properties(gasnet_lib PROPERTIES
93+
INTERFACE_COMPILE_DEFINITIONS "GASNET_CONDUIT_SMP;GASNET_SEQ"
94+
IMPORTED_LOCATION ${GASNET_INSTALL}/lib/libgasnet-smp-seq.a
95+
INTERFACE_INCLUDE_DIRECTORIES $<INSTALL_INTERFACE:${GASNET_INSTALL}/include>
96+
)
97+
add_dependencies(gasnet_lib gasnet_ex)
98+
target_link_libraries(caffeine PUBLIC gasnet_lib)
99+
target_include_directories(caffeine PUBLIC ${GASNET_INSTALL}/include)
100+
target_include_directories(caffeine PUBLIC ${GASNET_INSTALL}/include/smp-conduit)
101+
else()
102+
target_link_libraries(caffeine PUBLIC GASNet::GASNet)
103+
endif()
104+
105+
# ---------------------------------------------------------
106+
# Installation
107+
# ---------------------------------------------------------
108+
install(TARGETS caffeine
109+
DESTINATION "${CMAKE_INSTALL_LIBDIR}"
110+
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
111+
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
112+
)
113+
114+
# ---------------------------------------------------------
115+
# Test using App
116+
# ---------------------------------------------------------
117+
if(CMAKE_Fortran_COMPILER_ID STREQUAL "LLVMFlang")
118+
# If you want to view the test logs, please run : make test ARGS="--verbose"
119+
enable_testing()
120+
add_executable(test_native_multi_image app/native-multi-image.F90)
121+
122+
target_compile_options(test_native_multi_image PRIVATE "-fcoarray" "-cpp" "-DHAVE_MULTI_IMAGE")
123+
target_link_libraries(test_native_multi_image PRIVATE caffeine)
124+
125+
add_test(NAME TestNativeMultiImage COMMAND test_native_multi_image)
126+
else()
127+
message(STATUS "${CMAKE_Fortran_COMPILER_ID} doesn't support lowering to PRIF, not test can't be built.")
128+
endif()

0 commit comments

Comments
 (0)