1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-09-16 08:36:51 +02:00

configure: properly split C/CXX and CPP flags

Right now, CFLAGS like -std=c17 leak onto the C++ compilers commandline,
leading to tons of warnings and even some errors.

Undefining __STRICT_ANSI__ causes strong warnings from the stdlib
headers. So only set it for C.
This commit is contained in:
Timo Rothenpieler
2025-09-02 00:53:55 +02:00
parent 0362cb3806
commit 0ce413af9c
2 changed files with 120 additions and 76 deletions

194
configure vendored
View File

@@ -976,6 +976,12 @@ add_objcflags(){
append OBJCFLAGS $($objcflags_filter "$@")
}
add_allcflags(){
add_cflags "$@"
add_cxxflags "$@"
add_objcflags "$@"
}
add_asflags(){
append ASFLAGS $($asflags_filter "$@")
}
@@ -1036,6 +1042,14 @@ cc_o(){
eval printf '%s\\n' $CC_O
}
cxx_e(){
eval printf '%s\\n' $CXX_E
}
cxx_o(){
eval printf '%s\\n' $CXX_O
}
as_o(){
eval printf '%s\\n' $AS_O
}
@@ -1071,14 +1085,14 @@ test_cxx(){
log test_cxx "$@"
cat > $TMPCPP
log_file $TMPCPP
test_cmd $cxx $CPPFLAGS $CFLAGS $CXXFLAGS "$@" $CXX_C -o $TMPO $TMPCPP
test_cmd $cxx $CPPFLAGS $CXXFLAGS "$@" $CXX_C $(cxx_o $TMPO) $TMPCPP
}
test_objcc(){
log test_objcc "$@"
cat > $TMPM
log_file $TMPM
test_cmd $objcc -Werror=missing-prototypes $CPPFLAGS $CFLAGS $OBJCFLAGS "$@" $OBJCC_C $(cc_o $TMPO) $TMPM
test_cmd $objcc -Werror=missing-prototypes $CPPFLAGS $OBJCFLAGS "$@" $OBJCC_C $(cc_o $TMPO) $TMPM
}
test_nvcc(){
@@ -1288,14 +1302,19 @@ check_cflags(){
test_cflags "$@" && add_cflags "$@"
}
check_cxxflags(){
log check_cxxflags "$@"
test_cxxflags(){
log test_cxxflags "$@"
set -- $($cflags_filter "$@")
test_cxx "$@" <<EOF && append CXXFLAGS "$@"
test_cxx "$@" <<EOF
int x;
EOF
}
check_cxxflags(){
log check_cxxflags "$@"
test_cxxflags "$@" && add_cxxflags "$@"
}
test_objcflags(){
log test_objcflags "$@"
set -- $($objcflags_filter "$@")
@@ -1309,6 +1328,14 @@ check_objcflags(){
test_objcflags "$@" && add_objcflags "$@"
}
check_allcflags(){
allcret=0
check_cflags "$@" || allcret=$?
check_cxxflags "$@" || allcret=$?
check_objcflags "$@" || allcret=$?
return $allcret
}
test_ldflags(){
log test_ldflags "$@"
set -- $($ldflags_filter "$@")
@@ -4180,7 +4207,7 @@ mandir_default='${prefix}/share/man'
ar_default="ar"
cc_default="gcc"
stdc_default="c17"
stdcxx_default="c++11"
stdcxx_default="c++17"
cxx_default="g++"
host_cc_default="gcc"
doxygen_default="doxygen"
@@ -4648,28 +4675,28 @@ test -n "$valgrind" && toolchain="valgrind-memcheck"
add_sanitizer_flags(){
case "$1" in
asan)
add_cflags -fsanitize=address
add_allcflags -fsanitize=address
add_ldflags -fsanitize=address
;;
fuzz)
add_cflags -fsanitize=fuzzer-no-link
add_allcflags -fsanitize=fuzzer-no-link
add_ldflags -fsanitize=fuzzer-no-link
: "${libfuzzer_path:=-fsanitize=fuzzer}"
;;
lsan)
add_cflags -fsanitize=leak
add_allcflags -fsanitize=leak
add_ldflags -fsanitize=leak
;;
msan)
add_cflags -fsanitize=memory -fsanitize-memory-track-origins
add_allcflags -fsanitize=memory -fsanitize-memory-track-origins
add_ldflags -fsanitize=memory
;;
tsan)
add_cflags -fsanitize=thread
add_allcflags -fsanitize=thread
add_ldflags -fsanitize=thread
;;
usan|ubsan)
add_cflags -fsanitize=undefined
add_allcflags -fsanitize=undefined
add_ldflags -fsanitize=undefined
;;
?*)
@@ -4685,7 +4712,7 @@ add_sanitizers(){
for sanitizer; do
add_sanitizer_flags "$sanitizer"
done
add_cflags -fno-omit-frame-pointer
add_allcflags -fno-omit-frame-pointer
}
case "$toolchain" in
@@ -4700,7 +4727,7 @@ case "$toolchain" in
cxx_default="g++"
# In case of tsan with gcc, PIC has to be enabled
if [ "${toolchain#gcc-}" = "tsan" ]; then
add_cflags -fPIC
add_allcflags -fPIC
add_ldflags -fPIC
fi
;;
@@ -4751,18 +4778,18 @@ case "$toolchain" in
TMPDIR=.
;;
gcov)
add_cflags -fprofile-arcs -ftest-coverage
add_allcflags -fprofile-arcs -ftest-coverage
add_ldflags -fprofile-arcs -ftest-coverage
;;
llvm-cov)
add_cflags -fprofile-arcs -ftest-coverage
add_allcflags -fprofile-arcs -ftest-coverage
add_ldflags --coverage
;;
hardened)
add_cppflags -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2
add_cflags -fno-strict-overflow -fstack-protector-all
add_allcflags -fno-strict-overflow -fstack-protector-all
add_ldflags -Wl,-z,relro -Wl,-z,now
add_cflags -fPIE
add_allcflags -fPIE
add_ldexeflags -fPIE -pie
;;
?*)
@@ -5058,9 +5085,9 @@ probe_cc(){
_cc=$2
first=$3
unset _type _ident _cc_c _cc_e _cc_o _flags _cflags
unset _type _ident _cc_c _cc_e _cc_o _flags _cflags _cxxflags
unset _ld_o _ldflags _ld_lib _ld_path
unset _depflags _DEPCMD _DEPFLAGS
unset _depflags _DEPCMD _DEPFLAGS _DEPCCFLAGS _DEPCXXFLAGS
_flags_filter=echo
if $_cc --version 2>&1 | grep -q '^GNU assembler'; then
@@ -5207,7 +5234,9 @@ probe_cc(){
else
_DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< 2>&1 | awk '\''/including/ { sub(/^.*file: */, ""); gsub(/\\/, "/"); if (!match($$0, / /)) print "$@:", $$0 }'\'' > $(@:.o=.d)'
fi
_DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -showIncludes -Zs'
_DEPFLAGS='$(CPPFLAGS) -showIncludes -Zs'
_DEPCCFLAGS='$(CFLAGS)'
_DEPCXXFLAGS='$(CXXFLAGS)'
_cflags_speed="-O2"
_cflags_size="-O1"
_cflags_noopt="-O1"
@@ -5223,6 +5252,7 @@ probe_cc(){
_ld_lib='%.lib'
_ld_path='-libpath:'
_flags='-nologo'
_cxxflags='-Zc:__cplusplus -EHsc'
disable stripping
elif $_cc --version 2>/dev/null | grep -q ^cparser; then
_type=cparser
@@ -5243,11 +5273,11 @@ set_ccvars(){
eval ${1}_O=\${_cc_o-\${${1}_O}}
if [ -n "$_depflags" ]; then
eval ${1}_DEPFLAGS=\$_depflags
eval "${1}_DEPFLAGS=\"\$_depflags\""
else
eval ${1}DEP=\${_DEPCMD:-\$DEPCMD}
eval ${1}DEP_FLAGS=\${_DEPFLAGS:-\$DEPFLAGS}
eval DEP${1}FLAGS=\$_flags
eval "${1}DEP=\"\${_DEPCMD:-\$DEPCMD}\""
eval "${1}DEP_FLAGS=\"\${_DEPFLAGS:-\$DEPFLAGS} \${_DEP${1}FLAGS:-\$DEP${1}FLAGS}\""
eval "DEP${1}FLAGS=\"\$_flags\""
fi
}
@@ -5257,6 +5287,7 @@ cflags_speed=$_cflags_speed
cflags_size=$_cflags_size
cflags_noopt=$_cflags_noopt
add_cflags $_flags $_cflags
add_cxxflags $_flags $_cxxflags
cc_ldflags=$_ldflags
set_ccvars CC
set_ccvars CXX
@@ -5303,8 +5334,11 @@ HOSTLD_O=${_ld_o-$HOSTLD_O}
if [ -z "$CC_DEPFLAGS" ] && [ "$dep_cc" != "$cc" ]; then
probe_cc depcc "$dep_cc"
CCDEP=${_DEPCMD:-$DEPCMD}
CXXDEP=${CCDEP}
CCDEP_FLAGS=${_DEPFLAGS:=$DEPFLAGS}
DEPCCFLAGS=$_flags
CXXDEP_FLAGS=${CCDEP_FLAGS}
DEPCCFLAGS=$_flags $_cflags
DEPCXXFLAGS=$_flags $_cxxflags
fi
if VSLANG=1033 $ar 2>&1 | grep -q ^Microsoft; then
@@ -5502,7 +5536,7 @@ elif enabled arm; then
;;
esac
test_cflags -mfp16-format=ieee && add_cflags -mfp16-format=ieee
check_allcflags -mfp16-format=ieee
elif enabled loongarch; then
@@ -5737,7 +5771,7 @@ else
fi
if [ "$cpu" != generic ]; then
add_cflags $cpuflags
add_allcflags $cpuflags
add_asflags $cpuflags
test "$cc_type" = "$ld_type" && add_ldflags $cpuflags
fi
@@ -5760,6 +5794,8 @@ add_cxxflags -D__STDC_CONSTANT_MACROS
check_cxxflags_cc -std=$stdcxx ctype.h "__cplusplus >= 201103L" ||
{ check_cxxflags -std=c++11 && stdcxx="c++11" || { check_cxxflags -std=c++0x && stdcxx="c++0x"; }; }
test_cxxflags_cc -std=$stdcxx ctype.h "__cplusplus >= 201703L" && enable cxx17
# some compilers silently accept -std=c11, so we also need to check that the
# version macro is defined properly
check_cflags_cc -std=$stdc ctype.h "__STDC_VERSION__ >= 201112L" ||
@@ -5854,7 +5890,7 @@ case $target_os in
android)
disable symver
enable section_data_rel_ro
add_cflags -fPIE
add_allcflags -fPIE
add_ldexeflags -fPIE -pie
SLIB_INSTALL_NAME='$(SLIBNAME)'
SLIB_INSTALL_LINKS=
@@ -5935,7 +5971,7 @@ case $target_os in
# Workaround for Xcode 11 -fstack-check bug
if enabled clang; then
clang_version=$($cc -dumpversion)
test ${clang_version%%.*} -eq 11 && add_cflags -fno-stack-check
test ${clang_version%%.*} -eq 11 && add_allcflags -fno-stack-check
fi
# Xcode Clang doesn't default to -fno-common while upstream llvm.org
@@ -6154,15 +6190,17 @@ probe_libc(){
# MinGW headers can be installed on Cygwin, so check for newlib first.
elif test_${pfx}cpp_condition newlib.h "defined _NEWLIB_VERSION"; then
eval ${pfx}libc_type=newlib
add_${pfx}cppflags -U__STRICT_ANSI__ -D_XOPEN_SOURCE=600
add_${pfx}cflags -U__STRICT_ANSI__
add_${pfx}cppflags -D_XOPEN_SOURCE=600
# MinGW64 is backwards compatible with MinGW32, so check for it first.
elif test_${pfx}cpp_condition _mingw.h "defined __MINGW64_VERSION_MAJOR"; then
eval ${pfx}libc_type=mingw64
if test_${pfx}cpp_condition _mingw.h "__MINGW64_VERSION_MAJOR < 3"; then
add_compat msvcrt/snprintf.o
add_cflags "-include $source_path/compat/msvcrt/snprintf.h"
add_allcflags "-include $source_path/compat/msvcrt/snprintf.h"
fi
add_${pfx}cppflags -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1
add_${pfx}cflags -U__STRICT_ANSI__
add_${pfx}cppflags -D__USE_MINGW_ANSI_STDIO=1
eval test \$${pfx_no_}cc_type = "gcc" &&
add_${pfx}cppflags -D__printf__=__gnu_printf__
test_${pfx}cpp_condition windows.h "!defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0600" &&
@@ -6174,7 +6212,8 @@ probe_libc(){
test_${pfx}cpp_condition _mingw.h "__MINGW32_MAJOR_VERSION > 3 || \
(__MINGW32_MAJOR_VERSION == 3 && __MINGW32_MINOR_VERSION >= 15)" ||
die "ERROR: MinGW32 runtime version must be >= 3.15."
add_${pfx}cppflags -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1
add_${pfx}cflags -U__STRICT_ANSI__
add_${pfx}cppflags -D__USE_MINGW_ANSI_STDIO=1
test_${pfx}cpp_condition _mingw.h "__MSVCRT_VERSION__ < 0x0700" &&
add_${pfx}cppflags -D__MSVCRT_VERSION__=0x0700
test_${pfx}cpp_condition windows.h "!defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0600" &&
@@ -6215,8 +6254,8 @@ probe_libc(){
#endif
EOF
if [ "$pfx" = "" ]; then
check_func strtoll || add_cflags -Dstrtoll=_strtoi64
check_func strtoull || add_cflags -Dstrtoull=_strtoui64
check_func strtoll || add_allcflags -Dstrtoll=_strtoi64
check_func strtoull || add_allcflags -Dstrtoull=_strtoui64
fi
elif test_${pfx}cpp_condition stddef.h "defined __KLIBC__"; then
eval ${pfx}libc_type=klibc
@@ -6228,7 +6267,7 @@ EOF
elif test_${pfx}cpp_condition sys/version.h "defined __DJGPP__"; then
eval ${pfx}libc_type=djgpp
add_cppflags -U__STRICT_ANSI__
add_cflags "-include $source_path/compat/djgpp/math.h"
add_allcflags "-include $source_path/compat/djgpp/math.h"
add_compat djgpp/math.o
fi
test_${pfx}cc <<EOF
@@ -6266,7 +6305,7 @@ set_default libdir
set_default $PATHS_LIST
set_default nm
disabled optimizations || enabled ossfuzz || echo "$CFLAGS" | grep -q -- '-fsanitize=' || check_cflags -fomit-frame-pointer
disabled optimizations || enabled ossfuzz || echo "$CFLAGS" | grep -q -- '-fsanitize=' || check_allcflags -fomit-frame-pointer
enable_weak_pic() {
disabled pic && return
@@ -6276,7 +6315,7 @@ enable_weak_pic() {
mingw*|cygwin*|win*)
;;
*)
add_cflags -fPIC
add_allcflags -fPIC
add_asflags -fPIC
;;
esac
@@ -6952,13 +6991,13 @@ fi
if ! disabled pthreads && ! enabled w32threads && ! enabled os2threads; then
if check_lib pthreads pthread.h pthread_join -pthread &&
check_lib pthreads pthread.h pthread_create -pthread; then
add_cflags -pthread
add_allcflags -pthread
elif check_lib pthreads pthread.h pthread_join -pthreads &&
check_lib pthreads pthread.h pthread_create -pthreads; then
add_cflags -pthreads
add_allcflags -pthreads
elif check_lib pthreads pthread.h pthread_join -ldl -pthread &&
check_lib pthreads pthread.h pthread_create -ldl -pthread; then
add_cflags -ldl -pthread
add_allcflags -ldl -pthread
elif check_lib pthreads pthread.h pthread_join -lpthreadGC2 &&
check_lib pthreads pthread.h pthread_create -lpthreadGC2; then
:
@@ -7097,7 +7136,7 @@ elif enabled libmfx; then
# includedir=/usr/include
# Cflags: -I${includedir}
# So add -I${includedir}/mfx to CFLAGS
{ check_pkg_config libmfx "libmfx >= 1.28 libmfx < 2.0" "mfx/mfxvideo.h" MFXInit && add_cflags -I${libmfx_incdir}/mfx; } ||
{ check_pkg_config libmfx "libmfx >= 1.28 libmfx < 2.0" "mfx/mfxvideo.h" MFXInit && add_cppflags -I${libmfx_incdir}/mfx; } ||
{ require libmfx "mfxvideo.h mfxdefs.h" MFXInit "-llibmfx $advapi32_extralibs" &&
{ test_cpp_condition mfxdefs.h "MFX_VERSION >= 1028 && MFX_VERSION < 2000" || die "ERROR: libmfx version must be >= 1.28 and < 2.0"; } &&
warn "using libmfx without pkg-config"; } } &&
@@ -7108,7 +7147,7 @@ elif enabled libvpl; then
# is extracted from "vpl >= 2.6"
check_pkg_config libmfx "vpl >= 2.6" "mfxvideo.h mfxdispatcher.h" MFXLoad || \
die "ERROR: libvpl >= 2.6 not found"
add_cflags -DMFX_DEPRECATED_OFF
add_cppflags -DMFX_DEPRECATED_OFF
check_type "vpl/mfxdefs.h vpl/mfxvideo.h" "struct mfxConfigInterface"
fi
@@ -7584,29 +7623,31 @@ elif enabled iconv; then
check_func_headers iconv.h iconv || check_lib iconv iconv.h iconv -liconv
fi
enabled debug && add_cflags -g"$debuglevel" && add_asflags -g"$debuglevel"
enabled debug && add_allcflags -g"$debuglevel" && add_asflags -g"$debuglevel"
# add some useful compiler flags if supported
check_cflags -Wall
check_cflags -Wdisabled-optimization
check_cflags -Wpointer-arith
check_cflags -Wredundant-decls
check_cflags -Wwrite-strings
check_cflags -Wtype-limits
check_cflags -Wundef
check_allcflags -Wall
check_allcflags -Wdisabled-optimization
check_allcflags -Wpointer-arith
check_allcflags -Wredundant-decls
check_allcflags -Wwrite-strings
check_allcflags -Wtype-limits
check_allcflags -Wundef
check_allcflags -Wempty-body
check_cflags -Wmissing-prototypes
check_cflags -Wstrict-prototypes
check_cflags -Wempty-body
if enabled extra_warnings; then
check_cflags -Wcast-qual
check_cflags -Wextra
check_cflags -Wpedantic
check_allcflags -Wcast-qual
check_allcflags -Wextra
check_allcflags -Wpedantic
fi
check_disable_warning(){
warning_flag=-W${1#-Wno-}
test_cflags $unknown_warning_flags $warning_flag && add_cflags $1
test_cxxflags -Werror $unknown_warning_flags $warning_flag && add_cxxflags $1
test_objcflags $unknown_warning_flags $warning_flag && add_objcflags $1
}
test_cflags -Werror=unused-command-line-argument &&
@@ -7700,7 +7741,7 @@ if [ -z "$optflags" ]; then
fi
check_optflags(){
check_cflags "$@"
check_allcflags "$@"
[ -n "$lto" ] && check_ldflags "$@"
}
@@ -7734,7 +7775,7 @@ EOF
if enabled icc; then
# Just warnings, no remarks
check_cflags -w1
check_allcflags -w1
# -wd: Disable following warnings
# 144, 167, 556: -Wno-pointer-sign
# 188: enumerated type mixed with another type
@@ -7745,7 +7786,7 @@ if enabled icc; then
# 10156: ignoring option '-W'; no argument required
# 13200: No EMMS instruction before call to function
# 13203: No EMMS instruction before return from function
check_cflags -wd144,167,188,556,1292,1419,10006,10148,10156,13200,13203
check_allcflags -wd144,167,188,556,1292,1419,10006,10148,10156,13200,13203
# 11030: Warning unknown option --as-needed
# 10156: ignoring option '-export'; no argument required
check_ldflags -wd10156,11030
@@ -7756,7 +7797,7 @@ if enabled icc; then
if enabled x86_32; then
icc_version=$($cc -dumpversion)
test ${icc_version%%.*} -ge 11 &&
check_cflags -falign-stack=maintain-16-byte ||
check_cppflags -falign-stack=maintain-16-byte ||
disable aligned_stack
fi
elif enabled gcc; then
@@ -7779,13 +7820,13 @@ elif enabled gcc; then
;;
esac
fi
check_cflags -Werror=format-security
check_cflags -Werror=implicit-function-declaration
check_cflags -Werror=missing-prototypes
check_cflags -Werror=return-type
check_cflags -Werror=vla
check_cflags -Wformat
check_cflags -fdiagnostics-color=auto
check_allcflags -Werror=format-security
check_allcflags -Werror=return-type
check_allcflags -Werror=vla
check_allcflags -Wformat
check_allcflags -fdiagnostics-color=auto
enabled extra_warnings || check_disable_warning -Wno-maybe-uninitialized
if enabled x86_32; then
case $target_os in
@@ -7794,12 +7835,12 @@ elif enabled gcc; then
# request GCC to try to maintain 16 byte alignment throughout
# function calls. Library entry points that might call assembly
# functions align the stack. (The parameter means 2^4 bytes.)
check_cflags -mpreferred-stack-boundary=4
check_allcflags -mpreferred-stack-boundary=4
;;
esac
fi
elif enabled llvm_gcc; then
check_cflags -mllvm -stack-alignment=16
check_allcflags -mllvm -stack-alignment=16
elif enabled clang; then
if enabled x86_32; then
# Clang doesn't support maintaining alignment without assuming the
@@ -7812,18 +7853,18 @@ elif enabled clang; then
disable aligned_stack
;;
*)
check_cflags -mllvm -stack-alignment=16
check_cflags -mstack-alignment=16
check_allcflags -mllvm -stack-alignment=16
check_allcflags -mstack-alignment=16
;;
esac
else
check_cflags -mllvm -stack-alignment=16
check_cflags -mstack-alignment=16
check_allcflags -mllvm -stack-alignment=16
check_allcflags -mstack-alignment=16
fi
check_cflags -Qunused-arguments
check_cflags -Werror=implicit-function-declaration
check_cflags -Werror=missing-prototypes
check_cflags -Werror=return-type
check_allcflags -Qunused-arguments
check_allcflags -Werror=implicit-function-declaration
check_allcflags -Werror=missing-prototypes
check_allcflags -Werror=return-type
elif enabled cparser; then
add_cflags -Wno-missing-variable-declarations
add_cflags -Wno-empty-statement
@@ -8267,6 +8308,8 @@ OBJCC=$objcc
LD=$ld
DEPCC=$dep_cc
DEPCCFLAGS=$DEPCCFLAGS \$(CPPFLAGS)
DEPCXX=$dep_cc
DEPCXXFLAGS=$DEPCXXFLAGS \$(CPPFLAGS)
DEPAS=$as
DEPASFLAGS=$DEPASFLAGS \$(CPPFLAGS)
X86ASM=$x86asmexe
@@ -8334,6 +8377,7 @@ EXTRA_VERSION=$extra_version
CCDEP=$CCDEP
CXXDEP=$CXXDEP
CCDEP_FLAGS=$CCDEP_FLAGS
CXXDEP_FLAGS=$CXXDEP_FLAGS
ASDEP=$ASDEP
ASDEP_FLAGS=$ASDEP_FLAGS
X86ASMDEP=$X86ASMDEP

View File

@@ -51,7 +51,7 @@ OBJCCFLAGS = $(CPPFLAGS) $(CFLAGS) $(OBJCFLAGS)
ASFLAGS := $(CPPFLAGS) $(ASFLAGS)
# Use PREPEND here so that later (target-dependent) additions to CPPFLAGS
# end up in CXXFLAGS.
$(call PREPEND,CXXFLAGS, CPPFLAGS CFLAGS)
$(call PREPEND,CXXFLAGS, CPPFLAGS)
X86ASMFLAGS += $(IFLAGS:%=%/) -I$(<D)/ -Pconfig.asm
HOSTCCFLAGS = $(IFLAGS) $(HOSTCPPFLAGS) $(HOSTCFLAGS)