1
- cmake_minimum_required (VERSION 3.16.3 ) # Ubuntu 20 .04 LTS default
1
+ cmake_minimum_required (VERSION 3.22.1 ) # Ubuntu 22 .04 LTS default
2
2
3
3
execute_process (
4
- COMMAND head -c -1 ${CMAKE_CURRENT_SOURCE_DIR} /VERSION
4
+ COMMAND cat ${CMAKE_CURRENT_SOURCE_DIR} /VERSION
5
+ COMMAND tr -d \n
5
6
OUTPUT_VARIABLE CURRENT_VERSION)
6
7
7
8
project (meevax
@@ -12,44 +13,42 @@ project(meevax
12
13
13
14
include (GNUInstallDirs)
14
15
15
- string (JOIN " " ${PROJECT_NAME} _RELEASE_PLUS
16
+ string (JOIN " " ${PROJECT_NAME} _UNSTABLE_OPTIONS
17
+ # "-flto" # This optimization causes a problem in Apple Clang 15.0.0 where some static inline data members are no longer unique. It is unclear whether this is a code issue or a compiler issue.
16
18
# "-fmerge-all-constants" # This optimization is very effective in reducing binary size, but non-standard to the C++ standard.
17
19
# "-march=native" # This optimization causes "Illegal instruction" error (is Valgrind's bug) on CI.
18
20
# "-mtune=native"
19
21
)
20
22
21
23
set (CMAKE_CXX_EXTENSIONS OFF )
24
+ set (CMAKE_CXX_FLAGS "-Wall -Wextra -Wpedantic -pipe" )
22
25
set (CMAKE_CXX_FLAGS_DEBUG "-Og -gdwarf-4" ) # NOTE: The `-gdwarf-4` option is set due to the following issues with Clang 14 and Valgrind versions below 3.20: https://bugzilla.mozilla.org/show_bug.cgi?id=1758782
23
26
set (CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG" )
24
- set (CMAKE_CXX_FLAGS_RELEASE "-O3 -flto - DNDEBUG ${${PROJECT_NAME} _RELEASE_PLUS }" )
27
+ set (CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG ${${PROJECT_NAME} _UNSTABLE_OPTIONS }" )
25
28
set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELEASE} -gdwarf-4" )
26
- set (CMAKE_CXX_FLAGS "-Wall -Wextra -Wpedantic -pipe" )
27
- set (CMAKE_CXX_STANDARD 17)
29
+ set (CMAKE_CXX_STANDARD 20)
28
30
set (CMAKE_CXX_STANDARD_REQUIRED ON )
29
31
set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} /${CMAKE_INSTALL_LIBDIR} )
30
32
set (CMAKE_POSITION_INDEPENDENT_CODE ON )
31
33
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} /${CMAKE_INSTALL_BINDIR} )
32
34
set (CMAKE_VERBOSE_MAKEFILE OFF )
33
35
34
- # ---- Configure ---------------------------------------------------------------
35
-
36
- include (TestBigEndian)
37
-
38
- TEST_BIG_ENDIAN(IS_BIG_ENDIAN) # Use CMAKE_CXX_BYTE_ORDER if CMake >= 3.20
39
-
40
- if (${IS_BIG_ENDIAN} )
41
- set (${PROJECT_NAME} _BYTE_ORDER "big-endian" )
42
- else ()
43
- set (${PROJECT_NAME} _BYTE_ORDER "little-endian" )
36
+ if (CMAKE_SYSTEM_NAME STREQUAL Darwin)
37
+ set (CMAKE_INSTALL_RPATH "@executable_path/../${CMAKE_INSTALL_LIBDIR} " )
44
38
endif ()
45
39
40
+ # ---- CONFIGURE ---------------------------------------------------------------
41
+
46
42
execute_process (COMMAND ${CMAKE_CURRENT_SOURCE_DIR} /script/unicode.sh --digit-value OUTPUT_VARIABLE ${PROJECT_NAME} _UNICODE_DIGIT_VALUE)
47
43
execute_process (COMMAND ${CMAKE_CURRENT_SOURCE_DIR} /script/unicode.sh --downcase OUTPUT_VARIABLE ${PROJECT_NAME} _UNICODE_DOWNCASE)
48
44
execute_process (COMMAND ${CMAKE_CURRENT_SOURCE_DIR} /script/unicode.sh --property OUTPUT_VARIABLE ${PROJECT_NAME} _UNICODE_PROPERTY)
49
45
execute_process (COMMAND ${CMAKE_CURRENT_SOURCE_DIR} /script/unicode.sh --upcase OUTPUT_VARIABLE ${PROJECT_NAME} _UNICODE_UPCASE)
50
46
51
47
execute_process (
52
- COMMAND head -c -1 ${CMAKE_CURRENT_SOURCE_DIR} /configure/help.txt
48
+ COMMAND cat ${CMAKE_CURRENT_SOURCE_DIR} /configure/help.txt
49
+ COMMAND tr \n \r
50
+ COMMAND sed s/\r$//
51
+ COMMAND tr \r \n
53
52
OUTPUT_VARIABLE ${PROJECT_NAME} _HELP)
54
53
55
54
file (WRITE ${CMAKE_CURRENT_SOURCE_DIR} /include /${PROJECT_NAME} /unicode/digit_value.hpp "${${PROJECT_NAME} _UNICODE_DIGIT_VALUE}" )
@@ -63,7 +62,7 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure/Doxyfile ${CMAKE_CURRENT
63
62
configure_file (${CMAKE_CURRENT_SOURCE_DIR} /configure/README.md ${CMAKE_CURRENT_SOURCE_DIR} /README.md )
64
63
configure_file (${CMAKE_CURRENT_SOURCE_DIR} /configure/version .cpp ${CMAKE_CURRENT_SOURCE_DIR} /src/kernel/version .cpp)
65
64
66
- # ---- Target basis ------------------------------------------------------------
65
+ # ---- TARGET basis ------------------------------------------------------------
67
66
68
67
file (GLOB ${PROJECT_NAME} _BASIS_SOURCES ${CMAKE_CURRENT_SOURCE_DIR} /basis/*.ss)
69
68
@@ -90,7 +89,7 @@ set_target_properties(basis PROPERTIES
90
89
SOVERSION ${PROJECT_VERSION_MAJOR}
91
90
LINK_FLAGS_RELEASE -s)
92
91
93
- # ---- Target kernel -----------------------------------------------------------
92
+ # ---- TARGET kernel -----------------------------------------------------------
94
93
95
94
add_library (kernel SHARED)
96
95
@@ -100,7 +99,11 @@ target_sources(kernel PRIVATE ${${PROJECT_NAME}_KERNEL_SOURCES})
100
99
101
100
target_include_directories (kernel
102
101
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR} /include >
103
- PUBLIC $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR} >)
102
+ PUBLIC $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR} >
103
+ PUBLIC $<$<PLATFORM_ID:Darwin>:/opt/homebrew/include >)
104
+
105
+ target_link_directories (kernel
106
+ PUBLIC $<$<PLATFORM_ID:Darwin>:/opt/homebrew/lib>)
104
107
105
108
target_link_libraries (kernel
106
109
PRIVATE ${CMAKE_DL_LIBS}
@@ -112,7 +115,7 @@ set_target_properties(kernel PROPERTIES
112
115
SOVERSION ${PROJECT_VERSION_MAJOR}
113
116
LINK_FLAGS_RELEASE -s)
114
117
115
- # ---- Target shell ------------------------------------------------------------
118
+ # ---- TARGET shell ------------------------------------------------------------
116
119
117
120
add_executable (shell)
118
121
@@ -124,16 +127,14 @@ set_target_properties(shell PROPERTIES
124
127
OUTPUT_NAME ${PROJECT_NAME} # Rename shell => meevax
125
128
LINK_FLAGS_RELEASE -s)
126
129
127
- # ---- CMake Package - ----------------------------------------------------------
130
+ # ---- TARGET install ----------------------------------------------------------
128
131
129
132
include (CMakePackageConfigHelpers)
130
133
131
134
write_basic_package_version_file(
132
135
${CMAKE_CURRENT_BINARY_DIR} /${PROJECT_NAME} -config-version .cmake
133
136
COMPATIBILITY SameMajorVersion)
134
137
135
- # ---- Target install ----------------------------------------------------------
136
-
137
138
install ( # /usr/lib/libmeevax
138
139
TARGETS basis kernel
139
140
EXPORT ${PROJECT_NAME} -config
@@ -159,74 +160,73 @@ install( # /usr/share/meevax/meevax-config-version.cmake
159
160
FILES ${CMAKE_CURRENT_BINARY_DIR} /${PROJECT_NAME} -config-version .cmake
160
161
DESTINATION ${CMAKE_INSTALL_DATADIR} /${PROJECT_NAME} )
161
162
162
- # ---- Target package -- --------------------------------------------------------
163
+ # ---- TARGET uninstall --------------------------------------------------------
163
164
164
- set (CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)
165
- set (CPACK_DEBIAN_PACKAGE_MAINTAINER "Tatsuya Yamasaki" )
166
- set (CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON )
167
- set (CPACK_GENERATOR DEB)
168
- set (CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_SOURCE_DIR} /LICENSE)
169
- set (CPACK_RESOURCE_FILE_README ${CMAKE_CURRENT_SOURCE_DIR} /README.md )
170
- set (CPACK_THREADS 0)
165
+ add_custom_target (uninstall
166
+ COMMAND sudo rm -rf ${CMAKE_INSTALL_PREFIX} /${CMAKE_INSTALL_BINDIR} /${PROJECT_NAME}
167
+ COMMAND sudo rm -rf ${CMAKE_INSTALL_PREFIX} /${CMAKE_INSTALL_INCLUDEDIR} /${PROJECT_NAME}
168
+ COMMAND sudo rm -rf ${CMAKE_INSTALL_PREFIX} /${CMAKE_INSTALL_LIBDIR} /${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME} *
169
+ COMMAND sudo rm -rf ${CMAKE_INSTALL_PREFIX} /${CMAKE_INSTALL_DATADIR} /${PROJECT_NAME} )
171
170
172
- include (CPack)
171
+ # ---- TARGET package ----------------------------------------------------------
173
172
174
- # ---- Target test -------------------------------------------------------------
175
-
176
- enable_testing ()
173
+ if (CMAKE_SYSTEM_NAME STREQUAL Linux)
174
+ set (CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)
175
+ set (CPACK_DEBIAN_PACKAGE_MAINTAINER "Tatsuya Yamasaki" )
176
+ set (CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON )
177
+ set (CPACK_GENERATOR DEB)
178
+ set (CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_SOURCE_DIR} /LICENSE)
179
+ set (CPACK_RESOURCE_FILE_README ${CMAKE_CURRENT_SOURCE_DIR} /README.md )
180
+ include (CPack)
181
+ endif ()
177
182
178
- find_program ( ${PROJECT_NAME} _MEMORY_CHECK_COMMAND valgrind)
183
+ # ---- TARGET test -------------------------------------------------------------
179
184
180
- set (${PROJECT_NAME} _MEMORY_CHECK_OPTIONS
181
- --error-exitcode=1 # = EXIT_FAILURE)
182
- --leak-check=full
183
- --quiet
184
- --show-leak-kinds=all )
185
+ enable_testing ()
185
186
186
- file (GLOB ${PROJECT_NAME} _TEST_SS ${CMAKE_CURRENT_SOURCE_DIR} / test /*.ss )
187
+ find_program ( ${PROJECT_NAME} _VALGRIND valgrind )
187
188
188
- foreach (EACH IN LISTS ${PROJECT_NAME} _TEST_SS)
189
- get_filename_component (FILENAME ${EACH} NAME_WE )
190
- add_test (
191
- NAME ${FILENAME}
192
- COMMAND ${${PROJECT_NAME} _MEMORY_CHECK_COMMAND}
193
- ${${PROJECT_NAME} _MEMORY_CHECK_OPTIONS}
194
- ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} /meevax
195
- ${EACH} )
196
- endforeach ()
189
+ if (${PROJECT_NAME} _VALGRIND STREQUAL ${PROJECT_NAME} _VALGRIND-NOTFOUND )
190
+ set (${PROJECT_NAME} _TEST "" )
191
+ else ()
192
+ set (${PROJECT_NAME} _TEST ${${PROJECT_NAME} _VALGRIND} --error-exitcode=1 --leak-check=full --quiet --show-leak-kinds=all )
193
+ endif ()
197
194
198
195
file (GLOB ${PROJECT_NAME} _TEST_CPP ${CMAKE_CURRENT_SOURCE_DIR} /test /*.cpp)
196
+ file (GLOB ${PROJECT_NAME} _TEST_SH ${CMAKE_CURRENT_SOURCE_DIR} /test /*.sh)
197
+ file (GLOB ${PROJECT_NAME} _TEST_SS ${CMAKE_CURRENT_SOURCE_DIR} /test /*.ss)
199
198
200
199
foreach (EACH IN LISTS ${PROJECT_NAME} _TEST_CPP)
201
200
get_filename_component (FILENAME ${EACH} NAME_WE )
202
201
add_executable (test_${FILENAME} ${EACH} )
203
202
target_link_libraries (test_${FILENAME} PRIVATE basis kernel)
204
203
target_compile_options (test_${FILENAME} PUBLIC -Wno-deprecated-declarations)
205
- add_test (
206
- NAME test /${FILENAME}
207
- COMMAND ${${PROJECT_NAME} _MEMORY_CHECK_COMMAND}
208
- ${${PROJECT_NAME} _MEMORY_CHECK_OPTIONS}
209
- ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} /test_${FILENAME} )
204
+ add_test (NAME test /${FILENAME} COMMAND ${${PROJECT_NAME} _TEST} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} /test_${FILENAME} )
210
205
endforeach ()
211
206
212
- file (GLOB ${PROJECT_NAME} _TEST_SH ${CMAKE_CURRENT_SOURCE_DIR} /test /*.sh)
213
-
214
207
foreach (EACH IN LISTS ${PROJECT_NAME} _TEST_SH)
215
208
get_filename_component (FILENAME ${EACH} NAME_WE )
216
- add_test (
217
- NAME ${FILENAME}
218
- COMMAND ${${PROJECT_NAME} _MEMORY_CHECK_COMMAND}
219
- ${${PROJECT_NAME} _MEMORY_CHECK_OPTIONS}
220
- ${EACH}
221
- ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} /meevax)
209
+ add_test (NAME ${FILENAME} COMMAND ${${PROJECT_NAME} _TEST} ${EACH} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} /meevax)
222
210
endforeach ()
223
211
224
- # ---- Additional Targets ------------------------------------------------------
212
+ foreach (EACH IN LISTS ${PROJECT_NAME} _TEST_SS)
213
+ get_filename_component (FILENAME ${EACH} NAME_WE )
214
+ add_test (NAME ${FILENAME} COMMAND ${${PROJECT_NAME} _TEST} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} /meevax ${EACH} )
215
+ endforeach ()
225
216
226
- execute_process ( COMMAND nproc OUTPUT_VARIABLE ${PROJECT_NAME} _NPROC)
217
+ # ---- TARGET continuous-integration -------------------------------------------
227
218
228
- add_custom_target (develop
229
- COMMAND ${CMAKE_MAKE_PROGRAM} -j${${PROJECT_NAME} _NPROC}
230
- COMMAND ${CMAKE_MAKE_PROGRAM} test ARGS=-j${${PROJECT_NAME} _NPROC}
231
- COMMAND ${CMAKE_MAKE_PROGRAM} package
232
- COMMAND sudo dpkg -i ${CMAKE_CURRENT_BINARY_DIR} /${PROJECT_NAME} _${PROJECT_VERSION} _amd64.deb)
219
+ if (CMAKE_SYSTEM_NAME STREQUAL Linux)
220
+ execute_process (COMMAND nproc OUTPUT_VARIABLE ${PROJECT_NAME} _NPROC)
221
+ add_custom_target (continuous-integration
222
+ COMMAND ${CMAKE_MAKE_PROGRAM} -j${${PROJECT_NAME} _NPROC}
223
+ COMMAND ${CMAKE_MAKE_PROGRAM} test ARGS=-j${${PROJECT_NAME} _NPROC}
224
+ COMMAND ${CMAKE_MAKE_PROGRAM} package
225
+ COMMAND sudo dpkg -i ${CMAKE_CURRENT_BINARY_DIR} /${PROJECT_NAME} _${PROJECT_VERSION} _amd64.deb)
226
+ else ()
227
+ execute_process (COMMAND sysctl -n hw.ncpu OUTPUT_VARIABLE ${PROJECT_NAME} _NCPU)
228
+ add_custom_target (continuous-integration
229
+ COMMAND ${CMAKE_MAKE_PROGRAM} -j${${PROJECT_NAME} _NCPU}
230
+ COMMAND ${CMAKE_MAKE_PROGRAM} test ARGS=-j${${PROJECT_NAME} _NCPU}
231
+ COMMAND sudo ${CMAKE_MAKE_PROGRAM} install )
232
+ endif ()
0 commit comments