Skip to content

Commit 3cea140

Browse files
chore: modernize cmake (#1539)
1 parent 1147f6b commit 3cea140

File tree

136 files changed

+5470
-7379
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

136 files changed

+5470
-7379
lines changed

.github/workflows/ccpp_macos.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ jobs:
100100
if [ "${{ matrix.config.arch }}" == "arm64" ]; then
101101
mv benchmark_all*.* artifacts
102102
fi
103-
mv nelson-*.tar.gz artifacts
103+
mv Nelson-*.dmg artifacts
104104
105105
- uses: actions/upload-artifact@v6
106106
with:

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,3 +289,7 @@ My Advisor XE Results - *
289289
.DS_Store
290290
untitled.m
291291
#==============================================================================
292+
Info.plist
293+
Nelson.icns
294+
cpack_fixup_bundle.cmake
295+
#==============================================================================

CMake/C17Config.cmake

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,48 +3,54 @@
33
# ==============================================================================
44
# This file is part of Nelson.
55
# =============================================================================
6-
# LICENCE_BLOCK_BEGIN SPDX-License-Identifier: LGPL-3.0-or-later
6+
# LICENCE_BLOCK_BEGIN
7+
# SPDX-License-Identifier: LGPL-3.0-or-later
78
# LICENCE_BLOCK_END
89
# ==============================================================================
910
include(Clang-cxx-dev-tools)
10-
# ==============================================================================
1111
include(CheckCXXCompilerFlag)
1212
# ==============================================================================
13+
# C/C++ standard requirements
14+
# ==============================================================================
1315
set(CMAKE_C_STANDARD 11)
1416
set(CMAKE_C_STANDARD_REQUIRED ON)
17+
set(CMAKE_CXX_STANDARD 17)
18+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
19+
set(CMAKE_CXX_EXTENSIONS OFF)
1520
# ==============================================================================
16-
if("${CMAKE_CXX_COMPILE_FEATURES}" MATCHES "cxx_std_17")
17-
set(CMAKE_CXX_STANDARD 17)
18-
else()
19-
message(
20-
FATAL_ERROR
21-
"The compiler ${CMAKE_CXX_COMPILER} has no C++17 support. Please use a different C++ compiler."
22-
)
23-
endif()
21+
# Position-independent code (required for shared libraries)
22+
# ==============================================================================
23+
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
24+
# ==============================================================================
25+
# Visibility
2426
# ==============================================================================
25-
check_cxx_compiler_flag("-fPIC" COMPILER_SUPPORTS_FPIC)
26-
if(COMPILER_SUPPORTS_FPIC)
27-
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
28-
endif()
2927
if(NOT WIN32)
30-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
28+
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
29+
set(CMAKE_C_VISIBILITY_PRESET hidden)
30+
set(CMAKE_VISIBILITY_INLINES_HIDDEN ON)
3131
else()
3232
add_compile_definitions(UNICODE)
3333
endif()
3434
# ==============================================================================
35-
check_cxx_compiler_flag("-mavx2" COMPILER_SUPPORTS_AVX2)
36-
if(ENABLE_AVX2 AND COMPILER_SUPPORTS_AVX2)
37-
message(STATUS "Enabling AVX2 optimizations")
38-
add_compile_options(-mavx2)
35+
# AVX2
36+
# ==============================================================================
37+
if(ENABLE_AVX2)
38+
check_cxx_compiler_flag("-mavx2" COMPILER_SUPPORTS_AVX2)
39+
if(COMPILER_SUPPORTS_AVX2)
40+
message(STATUS "Enabling AVX2 optimizations")
41+
add_compile_options(-mavx2)
42+
endif()
3943
endif()
4044
# ==============================================================================
41-
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
42-
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64")
43-
message(STATUS "Enabling Apple M-series optimizations")
44-
add_compile_options(-march=native)
45-
endif()
45+
# Apple M-series optimizations
46+
# ==============================================================================
47+
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64")
48+
message(STATUS "Enabling Apple M-series optimizations")
49+
add_compile_options(-march=native)
4650
endif()
4751
# ==============================================================================
52+
# Large file support checks
53+
# ==============================================================================
4854
include(CheckSymbolExists)
4955
check_symbol_exists("fseek64" "stdio.h" HAVE_FSEEK64)
5056
check_symbol_exists("ftell64" "stdio.h" HAVE_FTELL64)

CMake/CheckCXXCompilerFlag.cmake

Lines changed: 0 additions & 48 deletions
This file was deleted.

CMake/IcuConfig.cmake

Lines changed: 42 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -8,37 +8,50 @@
88
# LICENCE_BLOCK_END
99
# ==============================================================================
1010
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin" AND NOT DEFINED ENV{CONDA_PREFIX} AND NOT DEFINED ENV{IN_NIX_SHELL})
11-
# Try finding ICU with Homebrew
12-
execute_process(
13-
COMMAND brew --prefix icu4c
14-
OUTPUT_VARIABLE BREW_ICU_PREFIX
15-
RESULT_VARIABLE NONZERO_BREW_EXIT_CODE
16-
ERROR_VARIABLE BREW_ERROR
17-
OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE)
18-
19-
if(NOT NONZERO_BREW_EXIT_CODE)
20-
set(CMAKE_ICU_PATH ${BREW_ICU_PREFIX})
11+
# Prefer pkg-config since it respects the user's pkg-config path and
12+
# avoids version mismatches between icu4c@77 and icu4c@78 on Homebrew.
13+
find_package(PkgConfig QUIET)
14+
if(PkgConfig_FOUND)
15+
pkg_check_modules(_ICU_PC QUIET icu-uc icu-i18n)
16+
if(_ICU_PC_FOUND)
17+
set(ICU_INCLUDE_DIRS "${_ICU_PC_INCLUDE_DIRS}")
18+
set(ICU_LIBRARIES "${_ICU_PC_LINK_LIBRARIES}")
19+
endif()
2120
endif()
2221

23-
# If not found via Homebrew, try default paths
24-
if(NOT CMAKE_ICU_PATH)
25-
set(POSSIBLE_ICU_PATHS
26-
"$ENV{HOMEBREW_PREFIX}/opt/icu4c"
27-
"$ENV{HOMEBREW_CELLAR}/icu4c/67.1"
28-
"$ENV{HOMEBREW_CELLAR}/icu4c/64.2"
29-
)
30-
31-
foreach(PATH ${POSSIBLE_ICU_PATHS})
32-
if(EXISTS "${PATH}/include" AND EXISTS "${PATH}/lib/libicuuc${CMAKE_SHARED_LIBRARY_SUFFIX}")
33-
set(CMAKE_ICU_PATH ${PATH})
34-
break()
35-
endif()
36-
endforeach()
37-
endif()
38-
# Set ICU_INCLUDE_DIRS and ICU_LIBRARIES if found
39-
if(CMAKE_ICU_PATH)
40-
set(ICU_INCLUDE_DIRS "${CMAKE_ICU_PATH}/include")
41-
set(ICU_LIBRARIES "${CMAKE_ICU_PATH}/lib/libicuuc${CMAKE_SHARED_LIBRARY_SUFFIX};${CMAKE_ICU_PATH}/lib/libicui18n${CMAKE_SHARED_LIBRARY_SUFFIX}")
22+
if(NOT ICU_INCLUDE_DIRS OR NOT ICU_LIBRARIES)
23+
# Fallback: Try finding ICU with Homebrew
24+
execute_process(
25+
COMMAND brew --prefix icu4c
26+
OUTPUT_VARIABLE BREW_ICU_PREFIX
27+
RESULT_VARIABLE NONZERO_BREW_EXIT_CODE
28+
ERROR_VARIABLE BREW_ERROR
29+
OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE)
30+
31+
if(NOT NONZERO_BREW_EXIT_CODE)
32+
set(CMAKE_ICU_PATH ${BREW_ICU_PREFIX})
33+
endif()
34+
35+
# If not found via Homebrew, try default paths
36+
if(NOT CMAKE_ICU_PATH)
37+
set(POSSIBLE_ICU_PATHS
38+
"$ENV{HOMEBREW_PREFIX}/opt/icu4c"
39+
"$ENV{HOMEBREW_CELLAR}/icu4c/67.1"
40+
"$ENV{HOMEBREW_CELLAR}/icu4c/64.2"
41+
)
42+
43+
foreach(PATH ${POSSIBLE_ICU_PATHS})
44+
if(EXISTS "${PATH}/include" AND EXISTS "${PATH}/lib/libicuuc${CMAKE_SHARED_LIBRARY_SUFFIX}")
45+
set(CMAKE_ICU_PATH ${PATH})
46+
break()
47+
endif()
48+
endforeach()
49+
endif()
50+
# Set ICU_INCLUDE_DIRS and ICU_LIBRARIES if found
51+
if(CMAKE_ICU_PATH)
52+
set(ICU_INCLUDE_DIRS "${CMAKE_ICU_PATH}/include")
53+
set(ICU_LIBRARIES "${CMAKE_ICU_PATH}/lib/libicuuc${CMAKE_SHARED_LIBRARY_SUFFIX};${CMAKE_ICU_PATH}/lib/libicui18n${CMAKE_SHARED_LIBRARY_SUFFIX}")
54+
endif()
4255
endif()
4356
endif()
4457
# ==============================================================================

CMake/NelsonModuleHelpers.cmake

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
# ==============================================================================
2+
# Copyright (c) 2016-present Allan CORNET (Nelson)
3+
# ==============================================================================
4+
# This file is part of Nelson.
5+
# =============================================================================
6+
# LICENCE_BLOCK_BEGIN
7+
# SPDX-License-Identifier: LGPL-3.0-or-later
8+
# LICENCE_BLOCK_END
9+
# ==============================================================================
10+
# Helper functions to reduce boilerplate in Nelson module CMakeLists.txt files.
11+
# ==============================================================================
12+
include_guard(GLOBAL)
13+
include(GNUInstallDirs)
14+
# ==============================================================================
15+
# nelson_install_library(<target>)
16+
#
17+
# Standard install rule for a Nelson library target.
18+
# ==============================================================================
19+
function(nelson_install_library _target)
20+
install(
21+
TARGETS ${_target}
22+
EXPORT ${PROJECT_NAME}-targets
23+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
24+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}
25+
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
26+
PUBLIC_HEADER
27+
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/$<TARGET_PROPERTY:${_target},NELSON_MODULE_NAME>)
28+
endfunction()
29+
# ==============================================================================
30+
# nelson_install_module_data(<module_name>
31+
# [EXTRA_TEST_PATTERNS pat1 pat2 ...]
32+
# [EXTRA_DIRS dir1 dir2 ...]
33+
# [EXTRA_DIR_PATTERNS "dir1:pat1;pat2" "dir2:pat1" ...]
34+
# )
35+
#
36+
# Standard install rules for Nelson module data files (loader.m, etc/, tests/,
37+
# help/, functions/). Accepts additional test file patterns and extra
38+
# directories with their file patterns.
39+
# ==============================================================================
40+
function(nelson_install_module_data _module_name)
41+
cmake_parse_arguments(ARG "" "" "EXTRA_TEST_PATTERNS;EXTRA_DIRS;EXTRA_DIR_PATTERNS" ${ARGN})
42+
43+
set(_dest "${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/modules/${_module_name}")
44+
45+
# loader.m
46+
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/loader.m")
47+
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/loader.m DESTINATION "${_dest}")
48+
endif()
49+
50+
# etc/*.m
51+
if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/etc")
52+
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/etc
53+
DESTINATION "${_dest}" FILES_MATCHING PATTERN "*.m")
54+
endif()
55+
56+
# tests/*.m (always) plus extra patterns
57+
if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/tests")
58+
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests
59+
DESTINATION "${_dest}" FILES_MATCHING PATTERN "*.m")
60+
foreach(_pat IN LISTS ARG_EXTRA_TEST_PATTERNS)
61+
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests
62+
DESTINATION "${_dest}" FILES_MATCHING PATTERN "${_pat}")
63+
endforeach()
64+
endif()
65+
66+
# help/*.nhz (exclude xml/ and md/)
67+
if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/help")
68+
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/help
69+
DESTINATION "${_dest}"
70+
FILES_MATCHING PATTERN "*.nhz"
71+
PATTERN "xml" EXCLUDE
72+
PATTERN "md" EXCLUDE)
73+
endif()
74+
75+
# functions/*.m
76+
if(IS_DIRECTORY "${CMAKE_SOURCE_DIR}/modules/${_module_name}/functions")
77+
install(DIRECTORY ${CMAKE_SOURCE_DIR}/modules/${_module_name}/functions
78+
DESTINATION "${_dest}" FILES_MATCHING PATTERN "*.m")
79+
endif()
80+
81+
# Extra directories: "dirname" -> install with PATTERN "*.*"
82+
foreach(_dir IN LISTS ARG_EXTRA_DIRS)
83+
if(IS_DIRECTORY "${CMAKE_SOURCE_DIR}/modules/${_module_name}/${_dir}")
84+
install(DIRECTORY ${CMAKE_SOURCE_DIR}/modules/${_module_name}/${_dir}
85+
DESTINATION "${_dest}" FILES_MATCHING PATTERN "*.*")
86+
endif()
87+
endforeach()
88+
89+
# Extra directory + patterns: "dir:pat1;pat2"
90+
foreach(_spec IN LISTS ARG_EXTRA_DIR_PATTERNS)
91+
string(FIND "${_spec}" ":" _pos)
92+
if(_pos GREATER -1)
93+
string(SUBSTRING "${_spec}" 0 ${_pos} _dir)
94+
math(EXPR _start "${_pos} + 1")
95+
string(SUBSTRING "${_spec}" ${_start} -1 _pats_str)
96+
string(REPLACE ";" ";" _pats "${_pats_str}")
97+
foreach(_pat IN LISTS _pats)
98+
if(IS_DIRECTORY "${CMAKE_SOURCE_DIR}/modules/${_module_name}/${_dir}")
99+
install(DIRECTORY ${CMAKE_SOURCE_DIR}/modules/${_module_name}/${_dir}
100+
DESTINATION "${_dest}" FILES_MATCHING PATTERN "${_pat}")
101+
endif()
102+
endforeach()
103+
endif()
104+
endforeach()
105+
endfunction()
106+
# ==============================================================================
107+
# nelson_module_sources_from_glob(<output_var>
108+
# DIRS dir1 [dir2 ...]
109+
# [EXCLUDE regex1 ...]
110+
# )
111+
#
112+
# Glob .cpp and .c files from directories, filtering out dllMain and optional
113+
# extra patterns.
114+
# ==============================================================================
115+
function(nelson_module_sources_from_glob _outvar)
116+
cmake_parse_arguments(ARG "" "" "DIRS;EXCLUDE" ${ARGN})
117+
set(_all_src)
118+
foreach(_dir IN LISTS ARG_DIRS)
119+
file(GLOB _cpp "${_dir}/*.cpp")
120+
file(GLOB _cxx "${_dir}/*.cxx")
121+
file(GLOB _cc "${_dir}/*.cc")
122+
file(GLOB _c "${_dir}/*.c")
123+
list(APPEND _all_src ${_cpp} ${_cxx} ${_cc} ${_c})
124+
endforeach()
125+
# Always exclude dllMain
126+
list(FILTER _all_src EXCLUDE REGEX "dllMain\\.(cpp|c)$")
127+
foreach(_ex IN LISTS ARG_EXCLUDE)
128+
list(FILTER _all_src EXCLUDE REGEX "${_ex}")
129+
endforeach()
130+
set(${_outvar} "${_all_src}" PARENT_SCOPE)
131+
endfunction()
132+
# ==============================================================================

0 commit comments

Comments
 (0)