@@ -111,38 +111,99 @@ macro( ecbuild_purge_compiler_flags _lang )
111111
112112endmacro ()
113113
114- macro ( ecbuild_init_overrideable_compiler_flags )
114+ ##############################################################################
115+ #.rst:
116+ #
117+ # ecbuild_linker_flags
118+ # ====================
119+ #
120+ # Apply user or toolchain specified linker flag overrides per object type (NOT written to cache)
121+ #
122+ # ecbuild_linker_flags()
123+ #
124+ ##############################################################################
125+
126+ macro ( ecbuild_linker_flags )
127+ foreach ( _obj EXE SHARED MODULE )
128+ if ( ECBUILD_${_obj} _LINKER_FLAGS )
129+ set ( CMAKE_${_obj} _LINKER_FLAGS ${ECBUILD_${_obj} _LINKER_FLAGS} )
130+ endif ()
131+
132+ if ( NOT "$ENV{LD_RUN_PATH} " EQUAL "" )
133+ set ( LD_RUN_PATH "$ENV{LD_RUN_PATH} " )
134+ string ( REPLACE ":" ";" LD_RUN_PATH "$ENV{LD_RUN_PATH} " )
135+ foreach ( rpath ${LD_RUN_PATH} )
136+ ecbuild_regex_escape( "${rpath} " rpath_escaped )
137+ if ( NOT CMAKE_${_obj} _LINKER_FLAGS MATCHES ".*-Wl,-rpath,${rpath_escaped} .*" )
138+ set ( CMAKE_${_obj} _LINKER_FLAGS "${CMAKE_${_obj} _LINKER_FLAGS} -Wl,-rpath,${rpath} " )
139+ endif ()
140+ endforeach ()
141+ endif ()
142+ endforeach ()
143+
144+ foreach ( _btype NONE DEBUG BIT PRODUCTION RELEASE RELWITHDEBINFO )
145+
146+ foreach ( _obj EXE SHARED MODULE )
147+ if ( ECBUILD_${_obj} _LINKER_FLAGS_${_btype} )
148+ set ( CMAKE_${_obj} _LINKER_FLAGS_${_btype} ${ECBUILD_${_obj} _LINKER_FLAGS_${_btype} } )
149+ endif ()
150+ endforeach ()
151+
152+ endforeach ()
153+ endmacro ()
154+
155+ ##############################################################################
156+ #.rst:
157+ #
158+ # ecbuild_override_compiler_flags
159+ # ======================
160+ #
161+ # Purge existing CMAKE_<lang>_FLAGS flags and trigger the use of per source
162+ # file overrideable flags (see ``Using custom compilation flags`` for an
163+ # explanation).
164+ #
165+ # ecbuild_override_compiler_flags()
166+ #
167+ ##############################################################################
115168
116- set ( options CAPTURE_BUNDLE_FLAGS )
169+ macro ( ecbuild_override_compiler_flags )
170+
171+ set ( options "" )
117172 set ( oneValueArgs SOURCE_FLAGS COMPILE_FLAGS )
118- set ( multiValueArgs LANGUAGES )
173+ set ( multiValueArgs "" )
119174
120175 cmake_parse_arguments ( _PAR "${options} " "${oneValueArgs} " "${multiValueArgs} " ${ARGN} )
121176
122- foreach (_lang ${_PAR_LANGUAGES} )
123- ecbuild_purge_compiler_flags( ${_lang} WARN )
124- endforeach ()
125-
126- if ( ${_PAR_CAPTURE_BUNDLE_FLAGS} )
127- foreach (_lang ${_PAR_LANGUAGES} )
128- set ( ${PNAME} _${_lang} _FLAGS "${${PNAME} _${_lang} _FLAGS} ${ECBUILD_${_lang} _FLAGS}" )
129- foreach (_btype ALL RELEASE RELWITHDEBINFO PRODUCTION BIT DEBUG)
130- set ( ${PNAME} _${_lang} _FLAGS_${_btype} "${${PNAME} _${_lang} _FLAGS_${_btype} } ${ECBUILD_${_lang} _FLAGS_${_btype} }" )
131- endforeach ()
177+ # Ensure COMPILE/SOURCE_FLAGS is a valid file path
178+ if ( DEFINED _PAR_COMPILE_FLAGS AND NOT EXISTS ${_PAR_COMPILE_FLAGS} )
179+ ecbuild_warn( "COMPILE_FLAGS points to non-existent file ${_PAR_COMPILE_FLAGS} and will be ignored" )
180+ unset ( ECBUILD_COMPILE_FLAGS )
181+ unset ( ECBUILD_COMPILE_FLAGS CACHE )
182+ elseif ( DEFINED _PAR_SOURCE_FLAGS AND NOT EXISTS ${_PAR_SOURCE_FLAGS} )
183+ ecbuild_warn( "SOURCE_FLAGS points to non-existent file ${_PAR_SOURCE_FLAGS} and will be ignored" )
184+ unset ( ECBUILD_SOURCE_FLAGS )
185+ unset ( ECBUILD_SOURCE_FLAGS CACHE )
186+ elseif ( DEFINED _PAR_SOURCE_FLAGS OR DEFINED _PAR_COMPILE_FLAGS )
187+ foreach ( _lang C CXX Fortran )
188+ if ( CMAKE_${_lang} _COMPILER_LOADED )
189+ ecbuild_purge_compiler_flags( ${_lang} WARN )
190+ endif ()
132191 endforeach ()
133- endif ()
134-
135- if ( DEFINED _PAR_COMPILE_FLAGS )
136- if ( DEFINED ECBUILD_COMPILE_FLAGS)
137- ecbuild_debug( "Override ECBUILD_COMPILE_FLAGS (${ECBUILD_COMPILE_FLAGS} ) with ${_PAR_COMPILE_FLAGS} " )
138- endif ()
139- set ( ECBUILD_COMPILE_FLAGS ${_PAR_COMPILE_FLAGS} )
140- include ( ${ECBUILD_COMPILE_FLAGS} )
141- elseif ( DEFINED _PAR_SOURCE_FLAGS )
142- if ( DEFINED ECBUILD_SOURCE_FLAGS)
143- ecbuild_debug( "Override ECBUILD_SOURCE_FLAGS (${ECBUILD_SOURCE_FLAGS} ) with ${_PAR_SOURCE_FLAGS} " )
192+
193+ if ( DEFINED _PAR_COMPILE_FLAGS )
194+ if ( DEFINED ECBUILD_COMPILE_FLAGS)
195+ ecbuild_debug( "Override ECBUILD_COMPILE_FLAGS (${ECBUILD_COMPILE_FLAGS} ) with ${_PAR_COMPILE_FLAGS} " )
196+ endif ()
197+ set ( ECBUILD_COMPILE_FLAGS ${_PAR_COMPILE_FLAGS} )
198+ include ( ${ECBUILD_COMPILE_FLAGS} )
199+ elseif ( DEFINED _PAR_SOURCE_FLAGS )
200+ if ( DEFINED ECBUILD_SOURCE_FLAGS)
201+ ecbuild_debug( "Override ECBUILD_SOURCE_FLAGS (${ECBUILD_SOURCE_FLAGS} ) with ${_PAR_SOURCE_FLAGS} " )
202+ endif ()
203+ set ( ECBUILD_SOURCE_FLAGS ${_PAR_SOURCE_FLAGS} )
144204 endif ()
145- set ( ECBUILD_SOURCE_FLAGS ${_PAR_SOURCE_FLAGS} )
205+
206+ ecbuild_linker_flags()
146207 endif ()
147208
148209endmacro ()
@@ -247,56 +308,25 @@ foreach( _flags COMPILE SOURCE )
247308 endif ()
248309 set ( ECBUILD_${_flags} _FLAGS ${${PROJECT_NAME_CAPS} _ECBUILD_${_flags} _FLAGS} )
249310 endif ()
250- # Ensure ECBUILD_${_flags}_FLAGS is a valid file path
251- if ( DEFINED ECBUILD_${_flags} _FLAGS AND NOT EXISTS ${ECBUILD_${_flags} _FLAGS} )
252- ecbuild_warn( "ECBUILD_${_flags} _FLAGS points to non-existent file ${ECBUILD_${_flags} _FLAGS} and will be ignored" )
253- unset ( ECBUILD_${_flags} _FLAGS )
254- unset ( ECBUILD_${_flags} _FLAGS CACHE )
255- endif ()
256311endforeach ()
257- if ( ECBUILD_COMPILE_FLAGS )
258- include ( "${ECBUILD_COMPILE_FLAGS} " )
312+ if ( DEFINED ECBUILD_COMPILE_FLAGS )
313+ ecbuild_override_compiler_flags( COMPILE_FLAGS ${ECBUILD_COMPILE_FLAGS} )
314+ elseif ( DEFINED ECBUILD_SOURCE_FLAGS )
315+ ecbuild_override_compiler_flags( SOURCE_FLAGS ${ECBUILD_SOURCE_FLAGS} )
259316endif ()
260317
261318foreach ( _lang C CXX Fortran )
262319 if ( CMAKE_${_lang} _COMPILER_LOADED )
263320
264- # Clear default compilation flags potentially inherited from parent scope
265- # when using custom compilation flags
266- if ( ECBUILD_SOURCE_FLAGS OR ECBUILD_COMPILE_FLAGS )
267- ecbuild_purge_compiler_flags( ${_lang} )
268321 # Load default compilation flags only if custom compilation flags not enabled
269- else ( )
322+ if ( NOT ( DEFINED ECBUILD_SOURCE_FLAGS OR DEFINED ECBUILD_COMPILE_FLAGS) )
270323 ecbuild_compiler_flags( ${_lang} )
271324 endif ()
272325
273326 endif ()
274327endforeach ()
275328
276- # Apply user or toolchain specified linker flag overrides per object type (NOT written to cache)
277- foreach ( _obj EXE SHARED MODULE )
278- if ( ECBUILD_${_obj} _LINKER_FLAGS )
279- set ( CMAKE_${_obj} _LINKER_FLAGS ${ECBUILD_${_obj} _LINKER_FLAGS} )
280- endif ()
281-
282- if ( NOT "$ENV{LD_RUN_PATH} " EQUAL "" )
283- set ( LD_RUN_PATH "$ENV{LD_RUN_PATH} " )
284- string ( REPLACE ":" ";" LD_RUN_PATH "$ENV{LD_RUN_PATH} " )
285- foreach ( rpath ${LD_RUN_PATH} )
286- ecbuild_regex_escape( "${rpath} " rpath_escaped )
287- if ( NOT CMAKE_${_obj} _LINKER_FLAGS MATCHES ".*-Wl,-rpath,${rpath_escaped} .*" )
288- set ( CMAKE_${_obj} _LINKER_FLAGS "${CMAKE_${_obj} _LINKER_FLAGS} -Wl,-rpath,${rpath} " )
289- endif ()
290- endforeach ()
291- endif ()
292- endforeach ()
293-
294- foreach ( _btype NONE DEBUG BIT PRODUCTION RELEASE RELWITHDEBINFO )
295-
296- foreach ( _obj EXE SHARED MODULE )
297- if ( ECBUILD_${_obj} _LINKER_FLAGS_${_btype} )
298- set ( CMAKE_${_obj} _LINKER_FLAGS_${_btype} ${ECBUILD_${_obj} _LINKER_FLAGS_${_btype} } )
299- endif ()
300- endforeach ()
329+ if ( NOT DEFINED ECBUILD_COMPILE_FLAGS AND NOT DEFINED ECBUILD_SOURCE_FLAGS )
330+ ecbuild_linker_flags()
331+ endif ()
301332
302- endforeach ()
0 commit comments