mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-02-07 06:53:33 +00:00
tool/cosmocc: Properly handle dependency output (#1091)
a2753de
contains some regressions, causing `fixupobj` to be inappropriately suppressed when `-MD` or `-MMD` is passed. This commit reverts most changes bya2753de
, and: - Treats all invocations of the compiler with `-M` and `-MM` as with the `cpp` intent, since these flags imply `-E`. - Handle the dependency output path specified by `-MF`. + This is trivial for `cosmocross` since the script does not throw objects to and from temporary directories. + For `cosmocc`, the file names are calculated based on the `-MF` value provided by the user. If this flag is not specified, the script generates the file name based on the output file using GCC rules. Then, before calling the real compilers, an additional `-MF` flag is passed to override the dependency outputs with mangled file names.
This commit is contained in:
parent
8ab3a545c6
commit
83a8686c06
2 changed files with 57 additions and 38 deletions
|
@ -88,7 +88,9 @@ APELINKFLAGS=
|
||||||
FLAGS_X86_64=
|
FLAGS_X86_64=
|
||||||
FLAGS_AARCH64=
|
FLAGS_AARCH64=
|
||||||
INPUT_FILE_COUNT=0
|
INPUT_FILE_COUNT=0
|
||||||
OUTPUT_IS_TEXT=0
|
MDFLAG=0
|
||||||
|
NEED_DEPENDENCY_OUTPUT=
|
||||||
|
DEPENDENCY_OUTPUT=
|
||||||
for x; do
|
for x; do
|
||||||
if [ x"$x" != x"${x#* }" ]; then
|
if [ x"$x" != x"${x#* }" ]; then
|
||||||
fatal_error "arguments containing spaces unsupported: $x"
|
fatal_error "arguments containing spaces unsupported: $x"
|
||||||
|
@ -97,6 +99,10 @@ for x; do
|
||||||
NEED_OUTPUT=
|
NEED_OUTPUT=
|
||||||
OUTPUT=$x
|
OUTPUT=$x
|
||||||
continue
|
continue
|
||||||
|
elif [ -n "$NEED_DEPENDENCY_OUTPUT" ]; then
|
||||||
|
NEED_DEPENDENCY_OUTPUT=
|
||||||
|
DEPENDENCY_OUTPUT=$x
|
||||||
|
continue
|
||||||
elif [ -n "$NEED_JOIN" ]; then
|
elif [ -n "$NEED_JOIN" ]; then
|
||||||
x="${NEED_JOIN}${x}"
|
x="${NEED_JOIN}${x}"
|
||||||
NEED_JOIN=
|
NEED_JOIN=
|
||||||
|
@ -124,11 +130,19 @@ for x; do
|
||||||
elif [ x"$x" != x"${x#-o}" ]; then # startswith(x, "-o")
|
elif [ x"$x" != x"${x#-o}" ]; then # startswith(x, "-o")
|
||||||
OUTPUT=${x#-o}
|
OUTPUT=${x#-o}
|
||||||
continue
|
continue
|
||||||
|
elif [ x"$x" = x"-MF" ]; then
|
||||||
|
NEED_DEPENDENCY_OUTPUT=1
|
||||||
|
continue
|
||||||
|
elif [ x"$x" != x"${x#-MF}" ]; then # startswith(x, "-MF")
|
||||||
|
DEPENDENCY_OUTPUT=${x#-MF}
|
||||||
|
continue
|
||||||
elif [ x"$x" != x"${x#-O}" ]; then # startswith(x, "-O")
|
elif [ x"$x" != x"${x#-O}" ]; then # startswith(x, "-O")
|
||||||
OPT=$x
|
OPT=$x
|
||||||
elif [ x"$x" = x"-c" ]; then
|
elif [ x"$x" = x"-c" ]; then
|
||||||
INTENT=cc
|
INTENT=cc
|
||||||
elif [ x"$x" = x"-E" ]; then
|
elif [ x"$x" = x"-E" ] ||
|
||||||
|
[ x"$x" = x"-M" ] ||
|
||||||
|
[ x"$x" = x"-MM" ]; then
|
||||||
INTENT=cpp
|
INTENT=cpp
|
||||||
elif [ x"$x" = x"-s" ]; then
|
elif [ x"$x" = x"-s" ]; then
|
||||||
APELINKFLAGS="$APELINKFLAGS -s"
|
APELINKFLAGS="$APELINKFLAGS -s"
|
||||||
|
@ -205,12 +219,9 @@ for x; do
|
||||||
elif [ x"$x" = x"--param" ]; then
|
elif [ x"$x" = x"--param" ]; then
|
||||||
NEED_EQUAL=$x
|
NEED_EQUAL=$x
|
||||||
continue
|
continue
|
||||||
elif [ x"$x" = x"-M" ] ||
|
elif [ x"$x" = x"-MD" ] ||
|
||||||
[ x"$x" = x"-MM" ] ||
|
[ x"$x" = x"-MMD" ]; then
|
||||||
[ x"$x" = x"-MD" ] ||
|
MDFLAG=1
|
||||||
[ x"$x" = x"-MMD" ] ||
|
|
||||||
[ x"$x" = x"-E" ]; then
|
|
||||||
OUTPUT_IS_TEXT=1
|
|
||||||
fi
|
fi
|
||||||
FLAGS="$FLAGS $x"
|
FLAGS="$FLAGS $x"
|
||||||
ARGS="$ARGS $x"
|
ARGS="$ARGS $x"
|
||||||
|
@ -311,6 +322,21 @@ mangle_object_path() {
|
||||||
mangled_path="${outdir}.$arch/$outbas"
|
mangled_path="${outdir}.$arch/$outbas"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get_dependency_outputs() {
|
||||||
|
if [ $MDFLAG -eq 1 ]; then
|
||||||
|
if [ -n "$DEPENDENCY_OUTPUT" ]; then
|
||||||
|
DEPENDENCY_FLAGS_x86_64="-MF $DEPENDENCY_OUTPUT"
|
||||||
|
mangle_object_path "$DEPENDENCY_OUTPUT" aarch64
|
||||||
|
DEPENDENCY_FLAGS_AARCH64="-MF $mangled_path"
|
||||||
|
else
|
||||||
|
base="$1.d"
|
||||||
|
DEPENDENCY_FLAGS_x86_64="-MF $base"
|
||||||
|
mangle_object_path "$base" aarch64
|
||||||
|
DEPENDENCY_FLAGS_AARCH64="-MF $mangled_path"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
mktemper() {
|
mktemper() {
|
||||||
"$BIN/mktemper" \
|
"$BIN/mktemper" \
|
||||||
"$TMPDIR/fatcosmocc.XXXXXXXXXXXXX$1"
|
"$TMPDIR/fatcosmocc.XXXXXXXXXXXXX$1"
|
||||||
|
@ -328,19 +354,16 @@ build_object() {
|
||||||
$CFLAGS_X86_64 \
|
$CFLAGS_X86_64 \
|
||||||
$CPPFLAGS_X86_64 \
|
$CPPFLAGS_X86_64 \
|
||||||
"$@" \
|
"$@" \
|
||||||
|
$DEPENDENCY_FLAGS_x86_64 \
|
||||||
$FLAGS_X86_64 \
|
$FLAGS_X86_64 \
|
||||||
$PRECIOUS
|
$PRECIOUS
|
||||||
log_command "$@"
|
log_command "$@"
|
||||||
"$@" || exit
|
"$@" || exit
|
||||||
if [ $OUTPUT_IS_TEXT -eq 0 ]; then
|
set -- \
|
||||||
set -- \
|
"$BIN/fixupobj" \
|
||||||
"$BIN/fixupobj" \
|
"$OUTPUT_X86_64"
|
||||||
"$OUTPUT_X86_64"
|
log_command "$@"
|
||||||
log_command "$@"
|
exec "$@"
|
||||||
exec "$@"
|
|
||||||
else
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
) &
|
) &
|
||||||
pid1=$!
|
pid1=$!
|
||||||
(
|
(
|
||||||
|
@ -352,19 +375,16 @@ build_object() {
|
||||||
$CFLAGS_AARCH64 \
|
$CFLAGS_AARCH64 \
|
||||||
$CPPFLAGS_AARCH64 \
|
$CPPFLAGS_AARCH64 \
|
||||||
"$@" \
|
"$@" \
|
||||||
|
$DEPENDENCY_FLAGS_AARCH64 \
|
||||||
$FLAGS_AARCH64 \
|
$FLAGS_AARCH64 \
|
||||||
$PRECIOUS
|
$PRECIOUS
|
||||||
log_command "$@"
|
log_command "$@"
|
||||||
"$@" || exit
|
"$@" || exit
|
||||||
if [ $OUTPUT_IS_TEXT -eq 0 ]; then
|
set -- \
|
||||||
set -- \
|
"$BIN/fixupobj" \
|
||||||
"$BIN/fixupobj" \
|
"$OUTPUT_AARCH64"
|
||||||
"$OUTPUT_AARCH64"
|
log_command "$@"
|
||||||
log_command "$@"
|
exec "$@"
|
||||||
exec "$@"
|
|
||||||
else
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
) 2>"$out2" &
|
) 2>"$out2" &
|
||||||
pid2=$!
|
pid2=$!
|
||||||
if ! wait $pid1; then
|
if ! wait $pid1; then
|
||||||
|
@ -411,6 +431,7 @@ for x in $ARGS; do
|
||||||
OUTPUT_X86_64=$OUTPUT
|
OUTPUT_X86_64=$OUTPUT
|
||||||
mangle_object_path "$OUTPUT" aarch64
|
mangle_object_path "$OUTPUT" aarch64
|
||||||
OUTPUT_AARCH64="$mangled_path"
|
OUTPUT_AARCH64="$mangled_path"
|
||||||
|
get_dependency_outputs "$OUTPUT"
|
||||||
build_object $FLAGS -c "$x"
|
build_object $FLAGS -c "$x"
|
||||||
else
|
else
|
||||||
# e.g. `cc -c dir/foo.c` builds foo.o
|
# e.g. `cc -c dir/foo.c` builds foo.o
|
||||||
|
@ -418,6 +439,7 @@ for x in $ARGS; do
|
||||||
OUTPUT_X86_64="${o%.*}.o"
|
OUTPUT_X86_64="${o%.*}.o"
|
||||||
mangle_object_path "${o%.*}.o" aarch64
|
mangle_object_path "${o%.*}.o" aarch64
|
||||||
OUTPUT_AARCH64="$mangled_path"
|
OUTPUT_AARCH64="$mangled_path"
|
||||||
|
get_dependency_outputs "${o%.*}"
|
||||||
build_object $FLAGS -c "$x"
|
build_object $FLAGS -c "$x"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
|
@ -425,10 +447,15 @@ for x in $ARGS; do
|
||||||
if [ -z "$OUTPUT" ]; then
|
if [ -z "$OUTPUT" ]; then
|
||||||
OUTPUT=a.out
|
OUTPUT=a.out
|
||||||
fi
|
fi
|
||||||
|
if [ -z "$DEPENDENCY_OUTPUT" ]; then
|
||||||
|
o=${x##*/}
|
||||||
|
DEPENDENCY_OUTPUT="a-${o%.*}.d"
|
||||||
|
fi
|
||||||
# e.g. `cc -o foo foo.c` should *not* build foo.o
|
# e.g. `cc -o foo foo.c` should *not* build foo.o
|
||||||
OUTPUT_X86_64=$(mktemper .o) || Exit
|
OUTPUT_X86_64=$(mktemper .o) || Exit
|
||||||
OUTPUT_AARCH64=$(mktemper .o) || Exit
|
OUTPUT_AARCH64=$(mktemper .o) || Exit
|
||||||
TEMP_FILES="${TEMP_FILES} ${OUTPUT_X86_64} ${OUTPUT_AARCH64}"
|
TEMP_FILES="${TEMP_FILES} ${OUTPUT_X86_64} ${OUTPUT_AARCH64}"
|
||||||
|
get_dependency_outputs
|
||||||
build_object $FLAGS -c "$x"
|
build_object $FLAGS -c "$x"
|
||||||
LDARGS_X86_64="${LDARGS_X86_64} ${OUTPUT_X86_64}"
|
LDARGS_X86_64="${LDARGS_X86_64} ${OUTPUT_X86_64}"
|
||||||
LDARGS_AARCH64="${LDARGS_AARCH64} ${OUTPUT_AARCH64}"
|
LDARGS_AARCH64="${LDARGS_AARCH64} ${OUTPUT_AARCH64}"
|
||||||
|
|
|
@ -100,7 +100,6 @@ INTENT=ld
|
||||||
GOT_SOME=0
|
GOT_SOME=0
|
||||||
NEED_OUTPUT=
|
NEED_OUTPUT=
|
||||||
RELOCATABLE=0
|
RELOCATABLE=0
|
||||||
OUTPUT_IS_TEXT=0
|
|
||||||
for x; do
|
for x; do
|
||||||
if [ $FIRST -eq 1 ]; then
|
if [ $FIRST -eq 1 ]; then
|
||||||
set --
|
set --
|
||||||
|
@ -128,7 +127,9 @@ for x; do
|
||||||
continue
|
continue
|
||||||
elif [ x"$x" = x"-r" ]; then
|
elif [ x"$x" = x"-r" ]; then
|
||||||
RELOCATABLE=1
|
RELOCATABLE=1
|
||||||
elif [ x"$x" = x"-E" ]; then
|
elif [ x"$x" = x"-E" ] ||
|
||||||
|
[ x"$x" = x"-M" ] ||
|
||||||
|
[ x"$x" = x"-MM" ]; then
|
||||||
INTENT=cpp
|
INTENT=cpp
|
||||||
elif [ x"$x" = x"-o" ]; then
|
elif [ x"$x" = x"-o" ]; then
|
||||||
NEED_OUTPUT=1
|
NEED_OUTPUT=1
|
||||||
|
@ -176,12 +177,6 @@ for x; do
|
||||||
GOT_SOME=1
|
GOT_SOME=1
|
||||||
elif [ x"$x" = x"-dumpmachine" ]; then
|
elif [ x"$x" = x"-dumpmachine" ]; then
|
||||||
GOT_SOME=1
|
GOT_SOME=1
|
||||||
elif [ x"$x" = x"-M" ] ||
|
|
||||||
[ x"$x" = x"-MM" ] ||
|
|
||||||
[ x"$x" = x"-MD" ] ||
|
|
||||||
[ x"$x" = x"-MMD" ] ||
|
|
||||||
[ x"$x" = x"-E" ]; then
|
|
||||||
OUTPUT_IS_TEXT=1
|
|
||||||
fi
|
fi
|
||||||
set -- "$@" "$x"
|
set -- "$@" "$x"
|
||||||
done
|
done
|
||||||
|
@ -223,10 +218,7 @@ log_command "$@"
|
||||||
|
|
||||||
if [ -n "$OUTPUT" ] && [ -f "$OUTPUT" ]; then
|
if [ -n "$OUTPUT" ] && [ -f "$OUTPUT" ]; then
|
||||||
if [ $INTENT = cc ] || [ $INTENT = ld ]; then
|
if [ $INTENT = cc ] || [ $INTENT = ld ]; then
|
||||||
if [ $OUTPUT_IS_TEXT -eq 0 ]; then
|
"$BIN/fixupobj" "$OUTPUT" || exit
|
||||||
"$BIN/fixupobj" "$OUTPUT"
|
|
||||||
fi
|
|
||||||
exit
|
|
||||||
fi
|
fi
|
||||||
if [ $INTENT = ld ]; then
|
if [ $INTENT = ld ]; then
|
||||||
if [ x"$OUTPUT" != x"${OUTPUT%.com}" ] ||
|
if [ x"$OUTPUT" != x"${OUTPUT%.com}" ] ||
|
||||||
|
|
Loading…
Reference in a new issue