Skip to content

Commit 2c359a8

Browse files
committed
Add macro for CMake build system.
1 parent bed581e commit 2c359a8

7 files changed

Lines changed: 471 additions & 97 deletions

File tree

CMakeLists.cmake

Lines changed: 333 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,333 @@
1+
cmake_minimum_required(VERSION 3.20 FATAL_ERROR)
2+
# project(MyProject LANGUAGES CXX)
3+
4+
include(CMakePrintHelpers)
5+
6+
# set(CMAKE_VERBOSE_MAKEFILE ON)
7+
8+
if(UNIX AND NOT APPLE)
9+
set(LINUX TRUE)
10+
endif()
11+
12+
set(PROJECT_ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
13+
set(PROJECT_BINARY_DIR "${CMAKE_BINARY_DIR}")
14+
set(PROJECT_CACHE_DIR "${PROJECT_ROOT_DIR}/.cache")
15+
set(LIBTORCH_DIR "${PROJECT_ROOT_DIR}/libtorch")
16+
# set(LIBTORCH_STATIC_INSTALL_DIR "${PROJECT_ROOT_DIR}/libtorch_static")
17+
set(BRIDGE_DIR "${PROJECT_ROOT_DIR}/bridge")
18+
set(Torch_DIR "${PROJECT_ROOT_DIR}/libtorch")
19+
20+
find_package(chpl REQUIRED HINTS ${PROJECT_ROOT_DIR}/cmake/chapel)
21+
list(APPEND CMAKE_MODULE_PATH "${PROJECT_ROOT_DIR}/cmake")
22+
list(APPEND CMAKE_MODULE_PATH "${PROJECT_ROOT_DIR}/cmake/chapel")
23+
24+
project(MyProject LANGUAGES CXX C CHPL)
25+
message(STATUS "Using chpl: ${CMAKE_CHPL_COMPILER}")
26+
27+
28+
if(APPLE)
29+
set(CMAKE_C_COMPILER "/usr/bin/clang")
30+
set(CMAKE_CXX_COMPILER "/usr/bin/clang++")
31+
endif()
32+
set(CMAKE_CXX_STANDARD 20)
33+
34+
35+
include(LibTorchDL)
36+
download_libtorch(
37+
CACHE_DIR ${PROJECT_CACHE_DIR}
38+
DESTINATION ${LIBTORCH_DIR}
39+
)
40+
41+
list(APPEND CMAKE_PREFIX_PATH "${LIBTORCH_DIR}/share/cmake")
42+
find_package(Torch REQUIRED)
43+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++23 -lm -ldl ${TORCH_CXX_FLAGS}")
44+
45+
46+
cmake_print_variables(TORCH_LIBRARIES)
47+
cmake_print_variables(TORCH_INCLUDE_DIRS)
48+
cmake_print_variables(TORCH_INSTALL_PREFIX)
49+
cmake_print_variables(TORCH_CXX_FLAGS)
50+
cmake_print_variables(TORCH_LIBRARY)
51+
52+
53+
file(GLOB CHAI_LIB_FILES "${PROJECT_ROOT_DIR}/lib/*.chpl")
54+
55+
# file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/resources_dummy.c "int main(int argc, const char **argv){ return 1; }\n")
56+
# add_executable(ChAI ${CMAKE_CURRENT_BINARY_DIR}/resources_dummy.c)
57+
# # file(GLOB RESOURCE_FILES *.bmp *.wav moose.dat utf8.txt)
58+
# foreach(RESOURCE_FILE ${CHAI_LIB_FILES})
59+
# add_custom_command(
60+
# TARGET ChAI
61+
# POST_BUILD
62+
# COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${RESOURCE_FILE} $<TARGET_FILE_DIR:ChAI>
63+
# )
64+
# endforeach(RESOURCE_FILE)
65+
66+
# file(COPY ${CHAI_LIB_FILES} DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
67+
68+
69+
70+
71+
add_custom_target(
72+
ChAI
73+
ALL
74+
DEPENDS ${PROJECT_SOURCE_DIR}/lib
75+
# SOURCES ${CHAI_LIB_FILES}
76+
# COMMAND ${CMAKE_COMMAND} -E echo "Building ChAI"
77+
)
78+
79+
foreach(RESOURCE_FILE ${CHAI_LIB_FILES})
80+
add_custom_command(
81+
TARGET ChAI
82+
POST_BUILD
83+
# OUTPUT $<TARGET_FILE_DIR:ChAI>
84+
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${RESOURCE_FILE} ${PROJECT_BINARY_DIR}/lib
85+
# DEPENDS ${CHAI_LIB_FILES}
86+
)
87+
endforeach(RESOURCE_FILE)
88+
89+
90+
91+
# foreach(RESOURCE_FILE ${CHAI_LIB_FILES})
92+
# add_custom_command(
93+
# TARGET ChAI
94+
# POST_BUILD
95+
# COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${RESOURCE_FILE} $<TARGET_FILE_DIR:ChAI>
96+
# )
97+
# endforeach(RESOURCE_FILE)
98+
99+
100+
function(watch)
101+
set_property(
102+
DIRECTORY
103+
APPEND
104+
PROPERTY CMAKE_CONFIGURE_DEPENDS ${ARGV}
105+
)
106+
endfunction()
107+
108+
109+
110+
# cmake_print_variables(CHAI_LIB_FILES)
111+
112+
add_library(bridge OBJECT ${BRIDGE_DIR}/include/bridge.h ${BRIDGE_DIR}/lib/bridge.cpp)
113+
114+
target_link_libraries(
115+
bridge
116+
PRIVATE
117+
${TORCH_LIBRARIES}
118+
# ${LIBTORCH_DIR}/lib/libtorch.so
119+
# ${LIBTORCH_DIR}/lib/libtorch_cpu.so
120+
# ${LIBTORCH_DIR}/lib/libc10.so
121+
# ${LIBTORCH_DIR}/lib/libtorch_global_deps.so
122+
)
123+
124+
target_include_directories(
125+
bridge
126+
PRIVATE
127+
${BRIDGE_DIR}/include
128+
${LIBTORCH_DIR}/include
129+
${LIBTORCH_DIR}/include/torch/csrc/api/include
130+
# ${BRIDGE_DIR}/util
131+
)
132+
133+
134+
add_library(bridge_objs STATIC $<TARGET_OBJECTS:bridge>)
135+
set_target_properties(bridge_objs
136+
PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}"
137+
)
138+
139+
140+
set(BRIDGE_OBJECT_FILES $<TARGET_OBJECTS:bridge>)
141+
142+
# add_custom_command(
143+
# TARGET bridge
144+
# POST_BUILD
145+
# COMMAND ${CMAKE_COMMAND} -E copy_directory
146+
# "${CMAKE_CURRENT_SOURCE_DIR}/style-transfer/models"
147+
# "$<TARGET_FILE_DIR:StyleTransfer>/style-transfer/models"
148+
# COMMENT "NOT! Copying ${PROJECT_ROOT_DIR}/examples/vgg/images to $<TARGET_FILE_DIR:vgg>/images"
149+
# )
150+
151+
152+
153+
file(GLOB LIBTORCH_ALL_LIB_FILES
154+
# "${LIBTORCH_DIR}/lib/*.a"
155+
"${LIBTORCH_DIR}/lib/*.dylib"
156+
"${LIBTORCH_DIR}/lib/*.so")
157+
158+
set(LIBTORCH_ALL_LIBS "")
159+
foreach(lib_path IN LISTS LIBTORCH_ALL_LIB_FILES)
160+
get_filename_component(lib_name "${lib_path}" NAME_WE)
161+
list(APPEND LIBTORCH_ALL_LIBS "${lib_name}")
162+
endforeach()
163+
164+
165+
set(REQUIRED_LIBS
166+
"libtorch"
167+
"libtorch_cpu"
168+
"libc10"
169+
)
170+
171+
set(DISALLOWED_LIBS
172+
"libtorch_python"
173+
)
174+
175+
set(LIBTORCH_LIBS_LINKER_ARGS "") # Will hold the list of "-l..." flags.
176+
foreach(lib_name IN LISTS LIBTORCH_ALL_LIBS)
177+
if(lib_name IN_LIST DISALLOWED_LIBS)
178+
if(lib_name IN_LIST REQUIRED_LIBS)
179+
message(FATAL_ERROR "Required lib ${lib_name} is disallowed.")
180+
else()
181+
message(STATUS "Skipping disallowed lib: ${lib_name}")
182+
continue()
183+
endif()
184+
endif()
185+
string(REGEX REPLACE "^lib" "" lib_name_short "${lib_name}")
186+
list(APPEND LIBTORCH_LIBS_LINKER_ARGS "-l${lib_name_short}")
187+
endforeach()
188+
189+
cmake_print_variables(LIBTORCH_LIBS_LINKER_ARGS)
190+
# cmake_print_variables(${BRIDGE_OBJECT_FILES})
191+
# cmake_print_variables(BRIDGE_OBJECT_FILES)
192+
193+
194+
set(LIBTORCH_LIBS_LINKER_ARGS
195+
"-ltorch"
196+
# "-ltorch_cpu"
197+
# "-lc10"
198+
# "-ltorch_global_deps"
199+
)
200+
cmake_print_variables(LIBTORCH_LIBS_LINKER_ARGS)
201+
202+
set(CHAI_LINKER_ARGS
203+
-M ${PROJECT_ROOT_DIR}/lib
204+
${BRIDGE_DIR}/include/bridge.h
205+
${BRIDGE_OBJECT_FILES}
206+
-L ${LIBTORCH_DIR}/lib
207+
${LIBTORCH_LIBS_LINKER_ARGS}
208+
--ccflags "-I${BRIDGE_DIR}/include -L${PROJECT_ROOT_DIR}/build"
209+
--ldflags "-L${PROJECT_ROOT_DIR}/build -Wl,-rpath,${LIBTORCH_DIR}/lib"
210+
)
211+
212+
213+
add_executable(TorchBridge ${PROJECT_ROOT_DIR}/lib/Bridge.chpl)
214+
add_dependencies(TorchBridge bridge)
215+
add_dependencies(TorchBridge ChAI)
216+
add_dependencies(TorchBridge bridge_objs)
217+
target_link_options(TorchBridge
218+
PRIVATE
219+
-M ${PROJECT_ROOT_DIR}/lib
220+
${BRIDGE_DIR}/include/bridge.h
221+
${BRIDGE_OBJECT_FILES}
222+
-L ${LIBTORCH_DIR}/lib
223+
"-ltorch"
224+
"-ltorch_cpu"
225+
"-lc10"
226+
"-ltorch_global_deps"
227+
${LIBTORCH_LIBS_LINKER_ARGS}
228+
--ldflags "-Wl,-rpath,${LIBTORCH_DIR}/lib"
229+
${CHAI_LINKER_ARGS}
230+
)
231+
232+
233+
234+
235+
add_executable(TinyLayerTest
236+
${PROJECT_ROOT_DIR}/test/tiny/layer_test.chpl
237+
${CHAI_LIB_FILES}
238+
)
239+
add_dependencies(TinyLayerTest bridge)
240+
add_dependencies(TinyLayerTest ChAI)
241+
target_link_options(TinyLayerTest
242+
PRIVATE
243+
--main-module layer_test.chpl
244+
-M ${PROJECT_ROOT_DIR}/lib
245+
${CHAI_LINKER_ARGS}
246+
)
247+
248+
249+
add_executable(TinyBridgeSystemTest
250+
${PROJECT_ROOT_DIR}/test/tiny/bridge_system_test.chpl
251+
${CHAI_LIB_FILES}
252+
)
253+
add_dependencies(TinyBridgeSystemTest bridge)
254+
add_dependencies(TinyBridgeSystemTest ChAI)
255+
add_dependencies(TinyBridgeSystemTest bridge_objs)
256+
add_dependencies(TinyBridgeSystemTest TorchBridge)
257+
target_link_options(TinyBridgeSystemTest
258+
PRIVATE
259+
--main-module bridge_system_test.chpl
260+
-M ${PROJECT_ROOT_DIR}/lib
261+
${CHAI_LINKER_ARGS}
262+
)
263+
264+
265+
# chpl test/tiny/layer_test.chpl -M lib bridge/include/bridge.h build/CMakeFiles/bridge.dir/bridge/lib/bridge.cpp.o -L libtorch/lib -ltorch -ltorch_cpu -lc10 -ltorch_global_deps --ldflags "-Wl,-rpath,libtorch/lib"
266+
267+
# chpl --fast -o vgg test.chpl -M ../../lib /Users/iainmoncrief/Documents/Github/ChAI/bridge/include/bridge.h /Users/iainmoncrief/Documents/Github/ChAI/build/CMakeFiles/bridge.dir/bridge/lib/bridge.cpp.o -L /Users/iainmoncrief/Documents/Github/ChAI/libtorch/lib -ltorch -ltorch_cpu -lc10 -ltorch_global_deps --ldflags "-Wl,-rpath,/Users/iainmoncrief/Documents/Github/ChAI/libtorch/lib"
268+
269+
# chpl -o vgg test.chpl $(../../embed_libtorch.sh .)
270+
# chpl --fast -o vgg test.chpl $(../../embed_libtorch.sh .)
271+
272+
273+
274+
275+
276+
277+
278+
279+
add_executable(vgg
280+
"${PROJECT_ROOT_DIR}/examples/vgg/test.chpl"
281+
${PROJECT_ROOT_DIR}/examples/vgg/VGG.chpl
282+
${CHAI_LIB_FILES}
283+
)
284+
add_dependencies(vgg bridge)
285+
add_dependencies(vgg ChAI)
286+
target_link_options(vgg
287+
PRIVATE
288+
# -M ${PROJECT_ROOT_DIR}/examples/vgg
289+
-svggExampleDir="${PROJECT_ROOT_DIR}/examples/vgg"
290+
${CHAI_LINKER_ARGS}
291+
)
292+
293+
add_custom_command(
294+
TARGET vgg
295+
POST_BUILD
296+
COMMAND ${CMAKE_COMMAND} -E copy_directory
297+
"${PROJECT_ROOT_DIR}/examples/vgg/images"
298+
"$<TARGET_FILE_DIR:vgg>/images"
299+
COMMENT "Copying ${PROJECT_ROOT_DIR}/examples/vgg/images to $<TARGET_FILE_DIR:vgg>/images"
300+
)
301+
302+
# ./vgg images/frog.jpg
303+
304+
# add_subdirectory(bridge)
305+
306+
add_subdirectory(examples)
307+
add_subdirectory("test")
308+
add_subdirectory(demos)
309+
310+
311+
312+
add_executable(MPSTest
313+
"${PROJECT_ROOT_DIR}/test/tiny/mps.cpp"
314+
)
315+
316+
target_include_directories(MPSTest
317+
PRIVATE
318+
${LIBTORCH_DIR}/include
319+
${LIBTORCH_DIR}/include/torch/csrc/api/include
320+
)
321+
322+
target_link_directories(MPSTest
323+
PRIVATE
324+
${LIBTORCH_DIR}/lib
325+
)
326+
327+
target_link_libraries(MPSTest
328+
PRIVATE
329+
-ltorch
330+
-ltorch_cpu
331+
-lc10
332+
-ltorch_global_deps
333+
)

0 commit comments

Comments
 (0)