11# From https://github.com/XiangpengHao/cxx-cmake-example/blob/master/fastly/CMakeLists.txt
22cmake_minimum_required (VERSION 3.15 )
3- project (compute-sdk-cpp)
43
5- if (!WASI_SDK)
6- set (WASI_SDK "/opt/wasi-sdk" )
7- endif ()
4+ project (compute-sdk-cpp VERSION 0.2.0 LANGUAGES CXX )
85
96if (VERBOSE)
107 set (VERBOSE_FLAG "--verbose" )
118endif ()
129
13- set (CMAKE_CXX_STANDARD 20)
14-
15- set (TARGET_TRIPLE wasm32-wasip1)
16-
1710if (CMAKE_BUILD_TYPE STREQUAL "Debug" )
18- set (CARGO_CMD cargo build --target=${TARGET_TRIPLE } ${VERBOSE_FLAG} )
11+ set (CARGO_CMD cargo build --target=${CMAKE_CXX_COMPILER_TARGET } ${VERBOSE_FLAG} )
1912 set (TARGET_DIR "debug" )
2013else ()
21- set (CARGO_CMD cargo build --target=${TARGET_TRIPLE } --release ${VERBOSE_FLAG} )
14+ set (CARGO_CMD cargo build --target=${CMAKE_CXX_COMPILER_TARGET } --release ${VERBOSE_FLAG} )
2215 set (TARGET_DIR "release" )
2316endif ()
2417
25- set (DIST_DIR ${CMAKE_CURRENT_BINARY_DIR } /${TARGET_DIR} /dist)
26-
27- set (CC "${WASI_SDK} /bin/clang" )
28- set (ENV{CC} "${WASI_SDK} /bin/clang" )
29- set (CXX "${WASI_SDK} /bin/clang++" )
30-
3118option (ENABLE_LTO "Enable cross language linking time optimization" ON )
19+ set (LTO_SUPPORTED FALSE )
3220if (ENABLE_LTO)
3321 include (CheckIPOSupported )
3422 check_ipo_supported (RESULT supported OUTPUT error )
3523 if (supported)
3624 message (STATUS "IPO / LTO enabled" )
37- set (CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE )
38- add_link_options (-fuse-ld=lld )
39- set (CFLAGS "-flto=thin -Oz" )
40- set (CXXFLAGS "${CMAKE_CXX_FLAGS } -flto=thin -Oz --sysroot=${WASI_SDK} /share/wasi-sysroot -DRUST_CXX_NO_EXCEPTIONS -fno-exceptions" )
41- set (CMAKE_CXX_FLAGS ${CXXFLAGS} )
42- set (RUST_FLAGS "-Clinker-plugin-lto" "-Clinker=${CMAKE_CURRENT_SOURCE_DIR } /build-workaround.sh" "-Clink-arg=-fuse-ld=lld" "-L${WASI_SDK} /share/wasi-sysroot/lib/wasm32-wasi" "-lstatic=c++" "-lstatic=c++abi" )
25+ set (LTO_SUPPORTED TRUE )
26+ set (FASTLY_LDFLAGS -fuse-ld=lld)
27+ set (FASTLY_CFLAGS -flto=thin -Oz)
28+ set (FASTLY_CXXFLAGS -flto=thin -Oz "--sysroot=${WASI_SDK_PREFIX} /share/wasi-sysroot" -DRUST_CXX_NO_EXCEPTIONS -fno-exceptions)
29+ set (FASTLY_RUST_FLAGS -Clinker-plugin-lto "-Clinker=${CMAKE_CURRENT_SOURCE_DIR } /build-workaround.sh" "-Clink-arg=-fuse-ld=lld" "-L${WASI_SDK_PREFIX} /share/wasi-sysroot/lib/wasm32-wasi" "-lstatic=c++" "-lstatic=c++abi" )
4330 else ()
4431 message (STATUS "IPO / LTO not supported: <${error} >" )
45- set (CXXFLAGS "${CMAKE_CXX_FLAGS } --sysroot=${WASI_SDK} /share/wasi-sysroot -DRUST_CXX_NO_EXCEPTIONS -fno-exceptions" )
46- set (CMAKE_CXX_FLAGS ${CXXFLAGS} )
47- set (RUST_FLAGS "-L${WASI_SDK} /share/wasi-sysroot/lib/wasm32-wasi" "-lstatic=c++" "-lstatic=c++abi" )
32+ set (FASTLY_CXXFLAGS "--sysroot=${WASI_SDK_PREFIX} /share/wasi-sysroot -DRUST_CXX_NO_EXCEPTIONS -fno-exceptions" )
33+ set (FASTLY_RUST_FLAGS "-L${WASI_SDK_PREFIX} /share/wasi-sysroot/lib/wasm32-wasi" "-lstatic=c++" "-lstatic=c++abi" )
4834 endif ()
4935else ()
50- set (CXXFLAGS "${CMAKE_CXX_FLAGS } --sysroot=${WASI_SDK} /share/wasi-sysroot -DRUST_CXX_NO_EXCEPTIONS -fno-exceptions" )
51- set (CMAKE_CXX_FLAGS ${CXXFLAGS} )
52- set (RUST_FLAGS "-L${WASI_SDK} /share/wasi-sysroot/lib/wasm32-wasi" "-lstatic=c++" "-lstatic=c++abi" )
36+ set (FASTLY_CXXFLAGS "-sysroot=${WASI_SDK_PREFIX} /share/wasi-sysroot -DRUST_CXX_NO_EXCEPTIONS -fno-exceptions" )
37+ set (FASTLY_RUST_FLAGS "-L${WASI_SDK_PREFIX} /share/wasi-sysroot/lib/wasm32-wasi" "-lstatic=c++" "-lstatic=c++abi" )
5338endif ()
54- if (POLICY CMP0048)
55- cmake_policy (SET CMP0048 NEW )
56- endif ()
5739
58- set (FASTLY_SYS_LIB "${CMAKE_CURRENT_BINARY_DIR } /${TARGET_TRIPLE } /${TARGET_DIR} /libfastly_sys.a" )
40+ set (FASTLY_SYS_LIB "${CMAKE_CURRENT_BINARY_DIR } /${CMAKE_CXX_COMPILER_TARGET } /${TARGET_DIR} /libfastly_sys.a" )
5941
6042set (FASTLY_SYS_CXX "${CMAKE_CURRENT_BINARY_DIR } /fastly-sys.cpp" )
6143file (GLOB_RECURSE FASTLY_CXX "${CMAKE_CURRENT_SOURCE_DIR } /src/cpp/**/*.cpp" "${CMAKE_CURRENT_SOURCE_DIR } /src/cpp/*.cpp" )
6244
6345add_library (fastly-sys STATIC ${FASTLY_SYS_CXX} )
46+ add_library (fastly::sys ALIAS fastly-sys )
47+ set_target_properties (fastly-sys PROPERTIES
48+ INTERPROCEDURAL_OPTIMIZATION ${LTO_SUPPORTED} )
49+ target_link_options (fastly-sys PRIVATE ${FASTLY_LDFLAGS} )
50+
6451add_library (fastly-sys-orig STATIC IMPORTED )
65- add_library (fastly-thin STATIC ${FASTLY_CXX} fastly-sys ${CMAKE_CURRENT_SOURCE_DIR } /vendor/tl/expected.h )
6652set_target_properties (fastly-sys-orig PROPERTIES IMPORTED_LOCATION ${FASTLY_SYS_LIB} )
6753
68- if (MSVC )
69- target_compile_options (fastly-thin PRIVATE /W3 /WX )
70- else ()
71- target_compile_options (fastly-thin PRIVATE -Wall -Wextra -Werror )
72- endif ()
54+ add_library (fastly-thin STATIC ${FASTLY_CXX} )
55+ add_library (fastly::thin ALIAS fastly-thin )
56+ target_include_directories (fastly-thin PRIVATE
57+ ${CMAKE_CURRENT_SOURCE_DIR } /vendor/tl )
58+ set_target_properties (fastly-thin PROPERTIES
59+ INTERPROCEDURAL_OPTIMIZATION ${LTO_SUPPORTED} )
60+ target_link_options (fastly-thin PRIVATE ${FASTLY_LDFLAGS} )
61+
62+ target_compile_options (fastly-thin PRIVATE -Wall -Wextra -Werror ${FASTLY_CXXFLAGS} )
63+ target_compile_options (fastly-sys PRIVATE ${FASTLY_CXXFLAGS} )
64+ target_compile_features (fastly-thin PUBLIC cxx_std_20 )
7365
7466set_target_properties (
7567 fastly-sys fastly-thin
7668 PROPERTIES
7769 ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR } /${TARGET_DIR}
7870)
7971
80- file (GLOB_RECURSE RUST_SRC "${CMAKE_CURRENT_SOURCE_DIR } /src/**/*.rs" "${CMAKE_CURRENT_COURSE_DIR } /src/*.rs" )
72+ file (GLOB_RECURSE RUST_SRC "${CMAKE_CURRENT_SOURCE_DIR } /src/**/*.rs" "${CMAKE_CURRENT_SOURCE_DIR } /src/*.rs" )
8173
8274add_custom_command (
83- OUTPUT ${FASTLY_SYS_CXX} ${FASTLY_SYS_LIB} ${DIST_DIR} / fastly/sdk-sys.h ${DIST_DIR} /fastly/util .h
84- COMMAND CARGO_TARGET_DIR=${CMAKE_CURRENT_BINARY_DIR} CC=${CC} CXX=${CXX} CFLAGS=${CFLAGS} CXXFLAGS=${CXXFLAGS} RUSTFLAGS= "${RUST_FLAGS } " ${CARGO_CMD}
75+ OUTPUT ${FASTLY_SYS_CXX} ${FASTLY_SYS_LIB} ${CMAKE_CURRENT_BINARY_DIR } /include/ fastly/sdk-sys.h
76+ COMMAND CARGO_TARGET_DIR=${CMAKE_CURRENT_BINARY_DIR} CC= " ${ CMAKE_C_COMPILER } " CXX= " ${ CMAKE_CXX_COMPILER } " CFLAGS= " ${FASTLY_CFLAGS} " CXXFLAGS= " ${FASTLY_CXXFLAGS} " RUSTFLAGS= "${FASTLY_RUST_FLAGS } " ${CARGO_CMD}
8577 COMMAND cp ${CMAKE_CURRENT_BINARY_DIR } /cxxbridge/fastly-sys/src/lib.rs.cc ${FASTLY_SYS_CXX}
86- COMMAND cp ${CMAKE_CURRENT_BINARY_DIR } /cxxbridge/fastly-sys/src/lib.rs.h ${DIST_DIR} /fastly/sdk-sys.h
87- COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR } /vendor/tl/expected.h ${DIST_DIR} /fastly/expected.h
78+ COMMAND ${CMAKE_COMMAND } -E make_directory ${CMAKE_CURRENT_BINARY_DIR } /include/fastly
79+ COMMAND cp ${CMAKE_CURRENT_BINARY_DIR } /cxxbridge/fastly-sys/src/lib.rs.h ${CMAKE_CURRENT_BINARY_DIR } /include/fastly/sdk-sys.h
80+ COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR } /vendor/tl/expected.h ${CMAKE_CURRENT_BINARY_DIR } /include/fastly/expected.h
8881 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR }
8982 DEPENDS ${RUST_SRC}
9083)
9184
92- target_include_directories (fastly-thin PUBLIC ${DIST_DIR} ${DIST_DIR} /fastly ${DIST_DIR} /fastly/http )
85+ target_include_directories (fastly-thin PUBLIC
86+ ${CMAKE_CURRENT_SOURCE_DIR } /include
87+ ${CMAKE_CURRENT_BINARY_DIR } /include )
9388
94- target_link_libraries (fastly-thin PUBLIC fastly-sys-orig fastly- sys )
89+ target_link_libraries (fastly-thin PUBLIC fastly-sys-orig fastly:: sys )
9590
9691function (bundle_static_library tgt_name bundled_tgt_name )
9792 list (APPEND static_libs ${tgt_name} )
@@ -129,47 +124,33 @@ function(bundle_static_library tgt_name bundled_tgt_name)
129124
130125 list (REMOVE_DUPLICATES static_libs)
131126
132- set (bundled_tgt_full_name
133- ${DIST_DIR} /${CMAKE_STATIC_LIBRARY_PREFIX }${bundled_tgt_name}${CMAKE_STATIC_LIBRARY_SUFFIX } )
127+ set (bundled_tgt_full_name "${CMAKE_CURRENT_BINARY_DIR } /${CMAKE_STATIC_LIBRARY_PREFIX }${bundled_tgt_name}${CMAKE_STATIC_LIBRARY_SUFFIX } " CACHE INTERNAL "Bundled target full name" )
134128
135129 if (CMAKE_CXX_COMPILER_ID MATCHES "^(Clang|GNU)$" )
136- file (WRITE ${CMAKE_BINARY_DIR } /${bundled_tgt_name}.ar.in
137- "CREATE ${bundled_tgt_full_name} \n " )
130+ file (WRITE ${CMAKE_CURRENT_BINARY_DIR } /${bundled_tgt_name}.ar.in "CREATE ${bundled_tgt_full_name} \n " )
138131
139132 foreach (tgt IN LISTS static_libs)
140- file (APPEND ${CMAKE_BINARY_DIR } /${bundled_tgt_name}.ar.in
141- "ADDLIB $<TARGET_FILE :${tgt} >\n " )
133+ file (APPEND ${CMAKE_CURRENT_BINARY_DIR } /${bundled_tgt_name}.ar.in
134+ "ADDLIB $<TARGET_FILE :${tgt} >\n " )
142135 endforeach ()
143136
144- file (APPEND ${CMAKE_BINARY_DIR } /${bundled_tgt_name}.ar.in "SAVE\n " )
145- file (APPEND ${CMAKE_BINARY_DIR } /${bundled_tgt_name}.ar.in "END\n " )
137+ file (APPEND ${CMAKE_CURRENT_BINARY_DIR } /${bundled_tgt_name}.ar.in "SAVE\n " )
138+ file (APPEND ${CMAKE_CURRENT_BINARY_DIR } /${bundled_tgt_name}.ar.in "END\n " )
146139
147140 file (GENERATE
148- OUTPUT ${CMAKE_BINARY_DIR } /${bundled_tgt_name}.ar
149- INPUT ${CMAKE_BINARY_DIR } /${bundled_tgt_name}.ar.in )
141+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR } /${bundled_tgt_name}.ar
142+ INPUT ${CMAKE_CURRENT_BINARY_DIR } /${bundled_tgt_name}.ar.in )
150143
151144 set (ar_tool ${CMAKE_AR } )
152145 if (CMAKE_INTERPROCEDURAL_OPTIMIZATION )
153146 set (ar_tool ${CMAKE_CXX_COMPILER_AR} )
154147 endif ()
155148
156149 add_custom_command (
157- COMMAND ${ar_tool} -M < ${CMAKE_BINARY_DIR } /${bundled_tgt_name}.ar
158- OUTPUT ${bundled_tgt_full_name}
159- COMMENT "Bundling ${bundled_tgt_name} "
160- VERBATIM )
161- elseif (MSVC )
162- find_program (lib_tool lib )
163-
164- foreach (tgt IN LISTS static_libs)
165- list (APPEND static_libs_full_names $<TARGET_FILE :${tgt} >)
166- endforeach ()
167-
168- add_custom_command (
169- COMMAND ${lib_tool} /NOLOGO /OUT:${bundled_tgt_full_name} ${static_libs_full_names}
170- OUTPUT ${bundled_tgt_full_name}
171- COMMENT "Bundling ${bundled_tgt_name} "
172- VERBATIM )
150+ COMMAND ${ar_tool} -M < ${CMAKE_CURRENT_BINARY_DIR } /${bundled_tgt_name}.ar
151+ OUTPUT ${bundled_tgt_full_name}
152+ COMMENT "Bundling ${bundled_tgt_name} "
153+ VERBATIM )
173154 else ()
174155 message (FATAL_ERROR "Unknown bundle scenario!" )
175156 endif ()
@@ -178,26 +159,54 @@ function(bundle_static_library tgt_name bundled_tgt_name)
178159 add_dependencies (bundling_target ${tgt_name} )
179160
180161 add_library (${bundled_tgt_name} STATIC IMPORTED )
181- set_target_properties (${bundled_tgt_name} ${bundled_target_full_name}
182- PROPERTIES
183- IMPORTED_LOCATION ${bundled_tgt_full_name}
184- INTERFACE_INCLUDE_DIRECTORIES $<TARGET_PROPERTY :${tgt_name} ,INTERFACE_INCLUDE_DIRECTORIES >
185- LIBRARY_OUTPUT_DIRECTORY ${DIST_DIR}
162+ set_target_properties (${bundled_tgt_name} PROPERTIES
163+ IMPORTED_LOCATION ${bundled_tgt_full_name}
164+ INTERFACE_INCLUDE_DIRECTORIES $<TARGET_PROPERTY :${tgt_name} ,INTERFACE_INCLUDE_DIRECTORIES >
165+ LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR }
186166 )
187167 add_dependencies (${bundled_tgt_name} bundling_target )
188168
189169endfunction ()
190170bundle_static_library (fastly-thin fastly )
191171
192- file (GLOB_RECURSE FASTLY_HEADERS "${CMAKE_CURRENT_SOURCE_DIR } /src/cpp/**/*.h" " ${ CMAKE_CURRENT_SOURCE_DIR } /src/cpp /*.h" )
172+ file (GLOB_RECURSE FASTLY_HEADERS "${CMAKE_CURRENT_SOURCE_DIR } /include/** /*.h" )
193173foreach (f ${FASTLY_HEADERS} )
194- file (RELATIVE_PATH fr "${CMAKE_CURRENT_SOURCE_DIR } /src/cpp" ${f} )
195- configure_file (${f} ${DIST_DIR} /fastly/${fr} COPYONLY )
196- list (APPEND incls "#include \" ${fr} \"\n " )
174+ file (RELATIVE_PATH fr "${CMAKE_CURRENT_SOURCE_DIR } /include" ${f} )
175+ list (APPEND incls "#include <${fr} >\n " )
197176endforeach (f )
198- list (APPEND incls "#include \" expected.h\"\n " )
199- file (WRITE ${DIST_DIR} /fastly/sdk.h ${incls} )
177+ list (APPEND incls "#include <fastly/expected.h>\n " )
178+ file (WRITE ${CMAKE_CURRENT_BINARY_DIR } /include/fastly/sdk.h ${incls} )
179+
180+ if (CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME )
181+ include (CTest )
182+ endif ()
183+ if (BUILD_TESTING)
184+ add_test (NAME fastly_test
185+ COMMAND cargo test
186+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR } )
187+ endif ()
188+
189+
190+ include (CMakePackageConfigHelpers )
191+ write_basic_package_version_file (
192+ fastly-config-version.cmake
193+ VERSION ${PACKAGE_VERSION}
194+ COMPATIBILITY AnyNewerVersion
195+ )
196+
197+ include (GNUInstallDirs )
198+ install (FILES ${CMAKE_CURRENT_BINARY_DIR } /fastly-config-version.cmake
199+ DESTINATION ${CMAKE_INSTALL_LIBDIR} /cmake/fastly
200+ )
201+ install (FILES ${CMAKE_CURRENT_SOURCE_DIR } /cmake/fastly-config.cmake
202+ DESTINATION ${CMAKE_INSTALL_LIBDIR} /cmake/fastly
203+ )
204+
205+ install (FILES ${bundled_tgt_full_name}
206+ DESTINATION ${CMAKE_INSTALL_LIBDIR} )
207+ install (DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR } /include/fastly
208+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} )
209+ install (DIRECTORY ${CMAKE_CURRENT_BINARY_DIR } /include/fastly
210+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} )
211+
200212
201- add_test (NAME fastly_test
202- COMMAND cargo test
203- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR } )
0 commit comments