Skip to content

Commit 275ec71

Browse files
xuxin930acassis
authored andcommitted
cmake:bugfix CMake compilation options settings should not use strings
when repeatedly enabling and disabling string-controlled configurations, the generated toolchain configuration may be incorrect. Signed-off-by: xuxin19 <[email protected]>
1 parent fde641f commit 275ec71

File tree

10 files changed

+138
-139
lines changed

10 files changed

+138
-139
lines changed

CMakeLists.txt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -622,9 +622,8 @@ if(NOT CONFIG_ARCH_SIM)
622622

623623
# TODO: nostart/nodefault not applicable to nuttx toolchain
624624
target_link_libraries(
625-
nuttx
626-
PRIVATE ${NUTTX_EXTRA_FLAGS} -Wl,--script=${ldscript} -Wl,--start-group
627-
${nuttx_libs} ${nuttx_extra_libs} -Wl,--end-group)
625+
nuttx PRIVATE -Wl,--script=${ldscript} -Wl,--start-group ${nuttx_libs}
626+
${nuttx_extra_libs} -Wl,--end-group)
628627

629628
# generate binary outputs in different formats (.bin, .hex, etc)
630629
nuttx_generate_outputs(nuttx)

arch/arm/src/cmake/Toolchain.cmake

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -183,34 +183,24 @@ if(CONFIG_DEBUG_SYMBOLS)
183183
add_compile_options(-g)
184184
endif()
185185

186-
set(ARCHCFLAGS "-Wstrict-prototypes")
186+
add_compile_options(-Wno-attributes -Wno-unknown-pragmas
187+
$<$<COMPILE_LANGUAGE:C>:-Wstrict-prototypes>)
188+
189+
if(CONFIG_CXX_STANDARD)
190+
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-std=${CONFIG_CXX_STANDARD}>)
191+
endif()
187192

188193
if(NOT CONFIG_LIBCXXTOOLCHAIN)
189-
set(ARCHCXXFLAGS "${ARCHCXXFLAGS} -nostdinc++")
194+
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-nostdinc++>)
190195
endif()
191196

192197
if(NOT CONFIG_CXX_EXCEPTION)
193-
string(APPEND ARCHCXXFLAGS " -fno-exceptions -fcheck-new")
198+
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions>
199+
$<$<COMPILE_LANGUAGE:CXX>:-fcheck-new>)
194200
endif()
195201

196202
if(NOT CONFIG_CXX_RTTI)
197-
string(APPEND ARCHCXXFLAGS " -fno-rtti")
198-
endif()
199-
200-
if(NOT "${CMAKE_C_FLAGS}" STREQUAL "")
201-
string(REGEX MATCH "${ARCHCFLAGS}" EXISTS_FLAGS "${CMAKE_C_FLAGS}")
202-
endif()
203-
204-
if(NOT EXISTS_FLAGS)
205-
set(CMAKE_ASM_FLAGS
206-
"${CMAKE_ASM_FLAGS} ${ARCHCFLAGS}"
207-
CACHE STRING "" FORCE)
208-
set(CMAKE_C_FLAGS
209-
"${CMAKE_C_FLAGS} ${ARCHCFLAGS}"
210-
CACHE STRING "" FORCE)
211-
set(CMAKE_CXX_FLAGS
212-
"${CMAKE_CXX_FLAGS} ${ARCHCXXFLAGS}"
213-
CACHE STRING "" FORCE)
203+
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-rtti>)
214204
endif()
215205

216206
if(CONFIG_ARCH_TOOLCHAIN_CLANG)

arch/arm/src/cmake/platform.cmake

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,20 @@ else()
5656
message(FATAL_ERROR "CMAKE_SYSTEM_PROCESSOR not set")
5757
endif()
5858

59-
get_directory_property(NUTTX_EXTRA_FLAGS DIRECTORY ${CMAKE_SOURCE_DIR}
60-
COMPILE_OPTIONS)
59+
get_directory_property(TOOLCHAIN_DIR_FLAGS DIRECTORY ${CMAKE_SOURCE_DIR}
60+
COMPILE_OPTIONS)
61+
62+
set(NUTTX_EXTRA_FLAGS "")
63+
foreach(FLAG ${TOOLCHAIN_DIR_FLAGS})
64+
if(NOT FLAG MATCHES "^\\$<.*>$")
65+
list(APPEND NUTTX_EXTRA_FLAGS ${FLAG})
66+
else()
67+
string(REGEX MATCH "\\$<\\$<COMPILE_LANGUAGE:C>:(.*)>" matched ${FLAG})
68+
if(matched)
69+
list(APPEND NUTTX_EXTRA_FLAGS ${CMAKE_MATCH_1})
70+
endif()
71+
endif()
72+
endforeach()
6173

6274
separate_arguments(CMAKE_C_FLAG_ARGS NATIVE_COMMAND ${CMAKE_C_FLAGS})
6375

arch/arm64/src/cmake/Toolchain.cmake

Lines changed: 19 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -119,31 +119,35 @@ if(CONFIG_ARCH_FPU)
119119
add_compile_options(-D_LDBL_EQ_DBL)
120120
endif()
121121

122-
set(ARCHCFLAGS
123-
"-Wstrict-prototypes -fno-common -Wall -Wshadow -Werror -Wundef -Wno-attributes -Wno-unknown-pragmas"
124-
)
125-
set(ARCHCXXFLAGS
126-
"-fno-common -Wall -Wshadow -Wundef -Wno-attributes -Wno-unknown-pragmas")
122+
add_compile_options(
123+
-fno-common
124+
-Wall
125+
-Wshadow
126+
-Wundef
127+
-Wno-attributes
128+
-Wno-unknown-pragmas
129+
$<$<COMPILE_LANGUAGE:C>:-Werror>
130+
$<$<COMPILE_LANGUAGE:C>:-Wstrict-prototypes>)
127131

128132
if(NOT CONFIG_LIBCXXTOOLCHAIN)
129-
set(ARCHCXXFLAGS "${ARCHCXXFLAGS} -nostdinc++")
133+
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-nostdinc++>)
130134
endif()
131135

132-
if(NOT ${CONFIG_ARCH_TOOLCHAIN_CLANG})
133-
string(APPEND ARCHCFLAGS " -Wno-psabi")
134-
string(APPEND ARCHCXXFLAGS " -Wno-psabi")
136+
if(NOT CONFIG_ARCH_TOOLCHAIN_CLANG)
137+
add_compile_options(-Wno-psabi)
135138
endif()
136139

137-
if(${CONFIG_CXX_STANDARD})
138-
string(APPEND ARCHCXXFLAGS " -std=${CONFIG_CXX_STANDARD}")
140+
if(CONFIG_CXX_STANDARD)
141+
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-std=${CONFIG_CXX_STANDARD}>)
139142
endif()
140143

141-
if(NOT ${CONFIG_CXX_EXCEPTION})
142-
string(APPEND ARCHCXXFLAGS " -fno-exceptions -fcheck-new")
144+
if(NOT CONFIG_CXX_EXCEPTION)
145+
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions>
146+
$<$<COMPILE_LANGUAGE:CXX>:-fcheck-new>)
143147
endif()
144148

145-
if(NOT ${CONFIG_CXX_RTTI})
146-
string(APPEND ARCHCXXFLAGS " -fno-rtti")
149+
if(NOT CONFIG_CXX_RTTI)
150+
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-rtti>)
147151
endif()
148152

149153
add_link_options(-nostdlib)
@@ -176,18 +180,3 @@ if(CONFIG_ARCH_TOOLCHAIN_GNU)
176180
add_link_options(-Wl,--no-warn-rwx-segments)
177181
endif()
178182
endif()
179-
180-
if(NOT "${CMAKE_C_FLAGS}" STREQUAL "")
181-
string(REGEX MATCH "${ARCHCFLAGS}" EXISTS_FLAGS "${CMAKE_C_FLAGS}")
182-
endif()
183-
if(NOT EXISTS_FLAGS)
184-
set(CMAKE_ASM_FLAGS
185-
"${CMAKE_ASM_FLAGS} ${ARCHCFLAGS}"
186-
CACHE STRING "" FORCE)
187-
set(CMAKE_C_FLAGS
188-
"${CMAKE_C_FLAGS} ${ARCHCFLAGS}"
189-
CACHE STRING "" FORCE)
190-
set(CMAKE_CXX_FLAGS
191-
"${CMAKE_CXX_FLAGS} ${ARCHCXXFLAGS}"
192-
CACHE STRING "" FORCE)
193-
endif()

arch/arm64/src/cmake/platform.cmake

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,38 +17,54 @@
1717
# the License.
1818
#
1919
# ##############################################################################
20-
get_directory_property(NUTTX_EXTRA_FLAGS DIRECTORY ${CMAKE_SOURCE_DIR}
21-
COMPILE_OPTIONS)
20+
get_directory_property(TOOLCHAIN_DIR_FLAGS DIRECTORY ${CMAKE_SOURCE_DIR}
21+
COMPILE_OPTIONS)
22+
23+
set(NUTTX_EXTRA_FLAGS "")
24+
foreach(FLAG ${TOOLCHAIN_DIR_FLAGS})
25+
if(NOT FLAG MATCHES "^\\$<.*>$")
26+
list(APPEND NUTTX_EXTRA_FLAGS ${FLAG})
27+
else()
28+
string(REGEX MATCH "\\$<\\$<COMPILE_LANGUAGE:C>:(.*)>" matched ${FLAG})
29+
if(matched)
30+
list(APPEND NUTTX_EXTRA_FLAGS ${CMAKE_MATCH_1})
31+
endif()
32+
endif()
33+
endforeach()
34+
35+
separate_arguments(CMAKE_C_FLAG_ARGS NATIVE_COMMAND ${CMAKE_C_FLAGS})
36+
2237
execute_process(
23-
COMMAND ${CMAKE_C_COMPILER} ${CMAKE_C_FLAGS} ${NUTTX_EXTRA_FLAGS}
38+
COMMAND ${CMAKE_C_COMPILER} ${CMAKE_C_FLAG_ARGS} ${NUTTX_EXTRA_FLAGS}
2439
--print-libgcc-file-name
2540
OUTPUT_STRIP_TRAILING_WHITESPACE
2641
OUTPUT_VARIABLE extra_library)
2742
list(APPEND EXTRA_LIB ${extra_library})
2843
if(NOT CONFIG_LIBM)
2944
execute_process(
30-
COMMAND ${CMAKE_C_COMPILER} ${CMAKE_C_FLAGS} ${NUTTX_EXTRA_FLAGS}
45+
COMMAND ${CMAKE_C_COMPILER} ${CMAKE_C_FLAG_ARGS} ${NUTTX_EXTRA_FLAGS}
3146
--print-file-name=libm.a
3247
OUTPUT_STRIP_TRAILING_WHITESPACE
3348
OUTPUT_VARIABLE extra_library)
3449
list(APPEND EXTRA_LIB ${extra_library})
3550
endif()
3651
if(CONFIG_LIBSUPCXX)
3752
execute_process(
38-
COMMAND ${CMAKE_C_COMPILER} ${CMAKE_C_FLAGS} ${NUTTX_EXTRA_FLAGS}
53+
COMMAND ${CMAKE_C_COMPILER} ${CMAKE_C_FLAG_ARGS} ${NUTTX_EXTRA_FLAGS}
3954
--print-file-name=libsupc++.a
4055
OUTPUT_STRIP_TRAILING_WHITESPACE
4156
OUTPUT_VARIABLE extra_library)
4257
list(APPEND EXTRA_LIB ${extra_library})
4358
endif()
4459
if(CONFIG_ARCH_COVERAGE)
4560
execute_process(
46-
COMMAND ${CMAKE_C_COMPILER} ${CMAKE_C_FLAGS} ${NUTTX_EXTRA_FLAGS}
61+
COMMAND ${CMAKE_C_COMPILER} ${CMAKE_C_FLAG_ARGS} ${NUTTX_EXTRA_FLAGS}
4762
--print-file-name=libgcov.a
4863
OUTPUT_STRIP_TRAILING_WHITESPACE
4964
OUTPUT_VARIABLE extra_library)
5065
list(APPEND EXTRA_LIB ${extra_library})
5166
endif()
52-
set_property(GLOBAL APPEND PROPERTY NUTTX_EXTRA_LIBRARIES ${EXTRA_LIB})
53-
separate_arguments(CMAKE_C_FLAG_ARGS NATIVE_COMMAND ${CMAKE_C_FLAGS})
67+
68+
nuttx_add_extra_library(${EXTRA_LIB})
69+
5470
set(PREPROCES ${CMAKE_C_COMPILER} ${CMAKE_C_FLAG_ARGS} -E -P -x c)

arch/risc-v/src/cmake/Toolchain.cmake

Lines changed: 17 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -150,31 +150,34 @@ if(CONFIG_ARCH_COVERAGE)
150150
add_compile_options(-fprofile-generate -ftest-coverage)
151151
endif()
152152

153-
set(ARCHCFLAGS
154-
"-Wstrict-prototypes -fno-common -Wall -Wshadow -Wundef -Wno-attributes -Wno-unknown-pragmas"
155-
)
156-
set(ARCHCXXFLAGS
157-
"-fno-common -Wall -Wshadow -Wundef -Wno-attributes -Wno-unknown-pragmas")
153+
add_compile_options(
154+
-fno-common
155+
-Wall
156+
-Wshadow
157+
-Wundef
158+
-Wno-attributes
159+
-Wno-unknown-pragmas
160+
$<$<COMPILE_LANGUAGE:C>:-Wstrict-prototypes>)
158161

159162
if(NOT CONFIG_LIBCXXTOOLCHAIN)
160-
set(ARCHCXXFLAGS "${ARCHCXXFLAGS} -nostdinc++")
163+
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-nostdinc++>)
161164
endif()
162165

163166
if(NOT ${CONFIG_ARCH_TOOLCHAIN_CLANG})
164-
string(APPEND ARCHCFLAGS " -Wno-psabi")
165-
string(APPEND ARCHCXXFLAGS " -Wno-psabi")
167+
add_compile_options(-Wno-psabi)
166168
endif()
167169

168-
if(${CONFIG_CXX_STANDARD})
169-
string(APPEND ARCHCXXFLAGS " -std=${CONFIG_CXX_STANDARD}")
170+
if(CONFIG_CXX_STANDARD)
171+
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-std=${CONFIG_CXX_STANDARD}>)
170172
endif()
171173

172-
if(NOT ${CONFIG_CXX_EXCEPTION})
173-
string(APPEND ARCHCXXFLAGS " -fno-exceptions -fcheck-new")
174+
if(NOT CONFIG_CXX_EXCEPTION)
175+
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions>
176+
$<$<COMPILE_LANGUAGE:CXX>:-fcheck-new>)
174177
endif()
175178

176-
if(NOT ${CONFIG_CXX_RTTI})
177-
string(APPEND ARCHCXXFLAGS " -fno-rtti")
179+
if(NOT CONFIG_CXX_RTTI)
180+
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-rtti>)
178181
endif()
179182

180183
if(CONFIG_ARCH_RV32)
@@ -200,22 +203,6 @@ if(CONFIG_DEBUG_SYMBOLS)
200203
add_compile_options(-g)
201204
endif()
202205

203-
if(NOT "${CMAKE_C_FLAGS}" STREQUAL "")
204-
string(REGEX MATCH "${ARCHCFLAGS}" EXISTS_FLAGS "${CMAKE_C_FLAGS}")
205-
endif()
206-
207-
if(NOT EXISTS_FLAGS)
208-
set(CMAKE_ASM_FLAGS
209-
"${CMAKE_ASM_FLAGS} ${ARCHCFLAGS}"
210-
CACHE STRING "" FORCE)
211-
set(CMAKE_C_FLAGS
212-
"${CMAKE_C_FLAGS} ${ARCHCFLAGS}"
213-
CACHE STRING "" FORCE)
214-
set(CMAKE_CXX_FLAGS
215-
"${CMAKE_CXX_FLAGS} ${ARCHCXXFLAGS}"
216-
CACHE STRING "" FORCE)
217-
endif()
218-
219206
# Generic GNU RVG toolchain
220207
if(${CONFIG_RISCV_TOOLCHAIN} STREQUAL GNU_RVG)
221208

arch/risc-v/src/cmake/platform.cmake

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,20 @@
1818
#
1919
# ##############################################################################
2020

21-
get_directory_property(NUTTX_EXTRA_FLAGS DIRECTORY ${CMAKE_SOURCE_DIR}
22-
COMPILE_OPTIONS)
21+
get_directory_property(TOOLCHAIN_DIR_FLAGS DIRECTORY ${CMAKE_SOURCE_DIR}
22+
COMPILE_OPTIONS)
23+
24+
set(NUTTX_EXTRA_FLAGS "")
25+
foreach(FLAG ${TOOLCHAIN_DIR_FLAGS})
26+
if(NOT FLAG MATCHES "^\\$<.*>$")
27+
list(APPEND NUTTX_EXTRA_FLAGS ${FLAG})
28+
else()
29+
string(REGEX MATCH "\\$<\\$<COMPILE_LANGUAGE:C>:(.*)>" matched ${FLAG})
30+
if(matched)
31+
list(APPEND NUTTX_EXTRA_FLAGS ${CMAKE_MATCH_1})
32+
endif()
33+
endif()
34+
endforeach()
2335

2436
separate_arguments(CMAKE_C_FLAG_ARGS NATIVE_COMMAND ${CMAKE_C_FLAGS})
2537

arch/sim/src/cmake/Toolchain.cmake

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -98,32 +98,17 @@ if(CONFIG_CXX_STANDARD)
9898
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-std=${CONFIG_CXX_STANDARD}>)
9999
endif()
100100

101-
set(ARCHCFLAGS "-Wstrict-prototypes")
101+
add_compile_options($<$<COMPILE_LANGUAGE:C>:-Wstrict-prototypes>)
102102

103103
if(NOT CONFIG_LIBCXXTOOLCHAIN)
104-
set(ARCHCXXFLAGS "${ARCHCXXFLAGS} -nostdinc++")
104+
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-nostdinc++>)
105105
endif()
106106

107107
if(NOT CONFIG_CXX_EXCEPTION)
108-
string(APPEND ARCHCXXFLAGS " -fno-exceptions -fcheck-new")
108+
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions>
109+
$<$<COMPILE_LANGUAGE:CXX>:-fcheck-new>)
109110
endif()
110111

111112
if(NOT CONFIG_CXX_RTTI)
112-
string(APPEND ARCHCXXFLAGS " -fno-rtti")
113-
endif()
114-
115-
if(NOT "${CMAKE_C_FLAGS}" STREQUAL "")
116-
string(REGEX MATCH "${ARCHCFLAGS}" EXISTS_FLAGS "${CMAKE_C_FLAGS}")
117-
endif()
118-
119-
if(NOT EXISTS_FLAGS)
120-
set(CMAKE_ASM_FLAGS
121-
"${CMAKE_ASM_FLAGS}${ARCHCFLAGS}"
122-
CACHE STRING "" FORCE)
123-
set(CMAKE_C_FLAGS
124-
"${CMAKE_C_FLAGS}${ARCHCFLAGS}"
125-
CACHE STRING "" FORCE)
126-
set(CMAKE_CXX_FLAGS
127-
"${CMAKE_CXX_FLAGS}${ARCHCXXFLAGS}"
128-
CACHE STRING "" FORCE)
113+
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-rtti>)
129114
endif()

0 commit comments

Comments
 (0)