public inbox for gentoo-dev@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-dev] [PATCH] flag-o-matic.eclass: add LDFLAGS testing against linker
@ 2019-12-23 11:50 Sergei Trofimovich
  2019-12-23 11:50 ` Sergei Trofimovich
  0 siblings, 1 reply; 3+ messages in thread
From: Sergei Trofimovich @ 2019-12-23 11:50 UTC (permalink / raw
  To: gentoo-dev; +Cc: Sergei Trofimovich

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>
---
 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



^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [gentoo-dev] [PATCH] flag-o-matic.eclass: add LDFLAGS testing against linker
  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   ` [gentoo-dev] " Sergei Trofimovich
  0 siblings, 1 reply; 3+ messages in thread
From: Sergei Trofimovich @ 2019-12-23 11:50 UTC (permalink / raw
  To: gentoo-dev; +Cc: Sergei Trofimovich

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>
---
 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



^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [gentoo-dev] Re: [PATCH] flag-o-matic.eclass: add LDFLAGS testing against linker
  2019-12-23 11:50 ` Sergei Trofimovich
@ 2019-12-25 10:45   ` Sergei Trofimovich
  0 siblings, 0 replies; 3+ messages in thread
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	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2019-12-25 10:45 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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   ` [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