From: Sergei Trofimovich <slyfox@gentoo.org>
To: gentoo-dev@lists.gentoo.org
Cc: Sergei Trofimovich <slyfox@gentoo.org>
Subject: [gentoo-dev] [PATCH] flag-o-matic.eclass: add LDFLAGS testing against linker
Date: Mon, 23 Dec 2019 11:50:42 +0000 [thread overview]
Message-ID: <20191223115043.3160866-1-slyfox@gentoo.org> (raw)
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
next reply other threads:[~2019-12-23 11:50 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-23 11:50 Sergei Trofimovich [this message]
2019-12-23 11:50 ` [gentoo-dev] [PATCH] flag-o-matic.eclass: add LDFLAGS testing against linker Sergei Trofimovich
2019-12-25 10:45 ` [gentoo-dev] " Sergei Trofimovich
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191223115043.3160866-1-slyfox@gentoo.org \
--to=slyfox@gentoo.org \
--cc=gentoo-dev@lists.gentoo.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox