From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <gentoo-commits+bounces-1133066-garchives=archives.gentoo.org@lists.gentoo.org> Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by finch.gentoo.org (Postfix) with ESMTPS id 82F78138334 for <garchives@archives.gentoo.org>; Tue, 24 Dec 2019 11:01:16 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id AA82AE0B13; Tue, 24 Dec 2019 11:01:15 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id 7A4E6E0B13 for <gentoo-commits@lists.gentoo.org>; Tue, 24 Dec 2019 11:01:15 +0000 (UTC) Received: from oystercatcher.gentoo.org (oystercatcher.gentoo.org [148.251.78.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id BEFE434DB1C for <gentoo-commits@lists.gentoo.org>; Tue, 24 Dec 2019 11:01:13 +0000 (UTC) Received: from localhost.localdomain (localhost [IPv6:::1]) by oystercatcher.gentoo.org (Postfix) with ESMTP id 3EDD732 for <gentoo-commits@lists.gentoo.org>; Tue, 24 Dec 2019 11:01:12 +0000 (UTC) From: "Sergei Trofimovich" <slyfox@gentoo.org> To: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: 8bit Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Sergei Trofimovich" <slyfox@gentoo.org> Message-ID: <1577185261.28d6437fc7009002f98f28e8900e994109927726.slyfox@gentoo> Subject: [gentoo-commits] repo/gentoo:master commit in: eclass/tests/, eclass/ X-VCS-Repository: repo/gentoo X-VCS-Files: eclass/flag-o-matic.eclass eclass/tests/flag-o-matic.sh X-VCS-Directories: eclass/tests/ eclass/ X-VCS-Committer: slyfox X-VCS-Committer-Name: Sergei Trofimovich X-VCS-Revision: 28d6437fc7009002f98f28e8900e994109927726 X-VCS-Branch: master Date: Tue, 24 Dec 2019 11:01:12 +0000 (UTC) Precedence: bulk List-Post: <mailto:gentoo-commits@lists.gentoo.org> List-Help: <mailto:gentoo-commits+help@lists.gentoo.org> List-Unsubscribe: <mailto:gentoo-commits+unsubscribe@lists.gentoo.org> List-Subscribe: <mailto:gentoo-commits+subscribe@lists.gentoo.org> List-Id: Gentoo Linux mail <gentoo-commits.gentoo.org> X-BeenThere: gentoo-commits@lists.gentoo.org X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Archives-Salt: b73cd8e8-6cd7-4ccb-b00c-dbded9fd0d99 X-Archives-Hash: ee915c4ca601fb31504dbd54f4f29f9b commit: 28d6437fc7009002f98f28e8900e994109927726 Author: Sergei Trofimovich <slyfox <AT> gentoo <DOT> org> AuthorDate: Mon Dec 23 11:41:20 2019 +0000 Commit: Sergei Trofimovich <slyfox <AT> gentoo <DOT> org> CommitDate: Tue Dec 24 11:01:01 2019 +0000 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=28d6437f flag-o-matic.eclass: add LDFLAGS testing against linker 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 <AT> 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:"