public inbox for gentoo-dev@lists.gentoo.org
 help / color / mirror / Atom feed
Search results ordered by [date|relevance]  view[summary|nested|Atom feed]
thread overview below | download: 
* [gentoo-dev] Re: [PATCH] flag-o-matic.eclass: add LDFLAGS testing against linker
  @ 2019-12-25 10:45 99%   ` Sergei Trofimovich
  0 siblings, 0 replies; 1+ results
From: Sergei Trofimovich @ 2019-12-25 10:45 UTC (permalink / raw
  To: gentoo-dev

On Mon, 23 Dec 2019 11:50:43 +0000
Sergei Trofimovich <slyfox@gentoo.org> wrote:

> Before the change we tested only compiler driver (gcc flag parser)
> for LDFLAGS.
> 
> This does not cover cases when we would really like to filter out
> unsupported linker flags like -Wl,--hash-style=gnu passed to non-ELF
> targets.
> 
> The change adds test-flag-CCLD() helper to perform all of assembly,
> compilation and linking steps. Helper is used to filter LDFLAGS variable
> in strip-unsupported-flags().
> 
> Closes: https://bugs.gentoo.org/333763
> Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
> ---

Pushed as:
    https://gitweb.gentoo.org/repo/gentoo.git/commit/eclass?id=28d6437fc7009002f98f28e8900e994109927726

>  eclass/flag-o-matic.eclass   | 72 +++++++++++++++++++++++++++++-------
>  eclass/tests/flag-o-matic.sh |  2 +-
>  2 files changed, 59 insertions(+), 15 deletions(-)
> 
> diff --git a/eclass/flag-o-matic.eclass b/eclass/flag-o-matic.eclass
> index f882b09d621..0aec22c83f2 100644
> --- a/eclass/flag-o-matic.eclass
> +++ b/eclass/flag-o-matic.eclass
> @@ -441,29 +441,63 @@ test-flag-PROG() {
>  	# 'type' needs a binary name
>  	type -p ${comp[0]} >/dev/null || return 1
>  
> +	# Set up test file.
> +	local in_src in_ext cmdline_extra=()
> +	case "${lang}" in
> +		# compiler/assembler only
> +		c)
> +			in_ext='.c'
> +			in_src='int main(void) { return 0; }'
> +			cmdline_extra+=(-xc -c)
> +			;;
> +		c++)
> +			in_ext='.cc'
> +			in_src='int main(void) { return 0; }'
> +			cmdline_extra+=(-xc++ -c)
> +			;;
> +		f77)
> +			in_ext='.f'
> +			# fixed source form
> +			in_src='      end'
> +			cmdline_extra+=(-xf77 -c)
> +			;;
> +		f95)
> +			in_ext='.f90'
> +			in_src='end'
> +			cmdline_extra+=(-xf95 -c)
> +			;;
> +
> +		# C compiler/assembler/linker
> +		c+ld)
> +			in_ext='.c'
> +			in_src='int main(void) { return 0; }'
> +			cmdline_extra+=(-xc)
> +			;;
> +	esac
> +	local test_in=${T}/test-flag-${comp}.${lang}
> +	local test_out=${T}/test-flag-${comp}.exe
> +
> +	printf "%s\n" "${in_src}" > "${test_in}" || return 1
> +
>  	local cmdline=(
>  		"${comp[@]}"
>  		# Clang will warn about unknown gcc flags but exit 0.
>  		# Need -Werror to force it to exit non-zero.
>  		-Werror
> -		# Use -c so we can test the assembler as well.
> -		-c -o /dev/null
> +		"$@"
> +		# -x<lang> options need to go before first source file
> +		"${cmdline_extra[@]}"
> +
> +		"${test_in}" -o "${test_out}"
>  	)
> -	if "${cmdline[@]}" -x${lang} - </dev/null &>/dev/null ; then
> -		cmdline+=( "$@" -x${lang} - )
> -	else
> -		# XXX: what's the purpose of this? does it even work with
> -		# any compiler?
> -		cmdline+=( "$@" -c -o /dev/null /dev/null )
> -	fi
>  
> -	if ! "${cmdline[@]}" </dev/null &>/dev/null; then
> +	if ! "${cmdline[@]}" &>/dev/null; then
>  		# -Werror makes clang bail out on unused arguments as well;
>  		# try to add -Qunused-arguments to work-around that
>  		# other compilers don't support it but then, it's failure like
>  		# any other
>  		cmdline+=( -Qunused-arguments )
> -		"${cmdline[@]}" </dev/null &>/dev/null
> +		"${cmdline[@]}" &>/dev/null
>  	fi
>  }
>  
> @@ -491,6 +525,12 @@ test-flag-F77() { test-flag-PROG "F77" f77 "$@"; }
>  # Returns shell true if <flag> is supported by the Fortran 90 compiler, else returns shell false.
>  test-flag-FC() { test-flag-PROG "FC" f95 "$@"; }
>  
> +# @FUNCTION: test-flag-CCLD
> +# @USAGE: <flag>
> +# @DESCRIPTION:
> +# Returns shell true if <flag> is supported by the C compiler and linker, else returns shell false.
> +test-flag-CCLD() { test-flag-PROG "CC" c+ld "$@"; }
> +
>  test-flags-PROG() {
>  	local comp=$1
>  	local flags=()
> @@ -548,6 +588,12 @@ test-flags-F77() { test-flags-PROG "F77" "$@"; }
>  # Returns shell true if <flags> are supported by the Fortran 90 compiler, else returns shell false.
>  test-flags-FC() { test-flags-PROG "FC" "$@"; }
>  
> +# @FUNCTION: test-flags-CCLD
> +# @USAGE: <flags>
> +# @DESCRIPTION:
> +# Returns shell true if <flags> are supported by the C compiler and default linker, else returns shell false.
> +test-flags-CCLD() { test-flags-PROG "CCLD" "$@"; }
> +
>  # @FUNCTION: test-flags
>  # @USAGE: <flags>
>  # @DESCRIPTION:
> @@ -576,9 +622,7 @@ strip-unsupported-flags() {
>  	export CXXFLAGS=$(test-flags-CXX ${CXXFLAGS})
>  	export FFLAGS=$(test-flags-F77 ${FFLAGS})
>  	export FCFLAGS=$(test-flags-FC ${FCFLAGS})
> -	# note: this does not verify the linker flags but it is enough
> -	# to strip invalid C flags which are much more likely, #621274
> -	export LDFLAGS=$(test-flags-CC ${LDFLAGS})
> +	export LDFLAGS=$(test-flags-CCLD ${LDFLAGS})
>  }
>  
>  # @FUNCTION: get-flag
> diff --git a/eclass/tests/flag-o-matic.sh b/eclass/tests/flag-o-matic.sh
> index 7c078499d70..90eaf3a6ffb 100755
> --- a/eclass/tests/flag-o-matic.sh
> +++ b/eclass/tests/flag-o-matic.sh
> @@ -8,7 +8,7 @@ inherit flag-o-matic
>  
>  CFLAGS="-a -b -c=1 --param l1-cache-size=32"
>  CXXFLAGS="-x -y -z=2"
> -LDFLAGS="-l -m -n=3"
> +LDFLAGS="-l -m -n=3 -Wl,--remove-me"
>  ftend() {
>  	local ret=$?
>  	local msg="Failed; flags are:"
> -- 
> 2.24.1
> 


-- 

  Sergei


^ permalink raw reply	[relevance 99%]

Results 1-1 of 1 | reverse | options above
-- pct% links below jump to the message on this page, permalinks otherwise --
2019-12-23 11:50     [gentoo-dev] [PATCH] flag-o-matic.eclass: add LDFLAGS testing against linker Sergei Trofimovich
2019-12-23 11:50     ` Sergei Trofimovich
2019-12-25 10:45 99%   ` [gentoo-dev] " Sergei Trofimovich

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox