Skip to content

Commit 8df4fa7

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 8df4fa7

4 files changed

Lines changed: 540 additions & 0 deletions

File tree

CMakeLists.txt

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

0 commit comments

Comments
 (0)