Skip to content

Commit

Permalink
flag-o-matic.eclass: add LDFLAGS testing against linker
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
Sergei Trofimovich committed Dec 24, 2019
1 parent 177fc8d commit 28d6437
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 15 deletions.
72 changes: 58 additions & 14 deletions eclass/flag-o-matic.eclass
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down Expand Up @@ -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=()
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion eclass/tests/flag-o-matic.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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:"
Expand Down

0 comments on commit 28d6437

Please sign in to comment.