RetroArch/qb/qb.libs.sh
orbea fb6fe1a87c Makefile: Better respect CFLAGS and CXXFLAGS as environment variables.
This fixes a few subtle problems with passing CFLAGS and CXXFLAGS as
environment variables for configure.

First it will now only add these variables to config.mk when they are
actually set. If they are unset then the default optimizations in the
Makefile are set. This avoids passing more than one conflicting
optimization level to the compiler.

Next all CFLAGS are added to CXXFLAGS to avoid issues with forgetting to
set both CFLAGS and CXXFLAGS. This results in the cxx compiler getting
passed several redundant optimization levels when both the CFLAGS and
CXXFLAGS environment variabls are used. Now these uses of CFLAGS in
Makefile.common are set to DEF_FLAGS. This allows adding $(DEF_FLAGS)
to the CXXFLAGS variable without adding redundant flags from CFLAGS.

v2: Update other build files.
2018-12-30 17:17:19 -08:00

303 lines
8.0 KiB
Bash

MAKEFILE_DEFINES=''
CONFIG_DEFINES=''
PREFIX="${PREFIX:-/usr/local}"
SHARE_DIR="${SHARE_DIR:-${PREFIX}/share}"
add_define() # $1 = MAKEFILE or CONFIG $2 = define $3 = value
{ eval "${1}_DEFINES=\"\${${1}_DEFINES} $2=$3\""; }
add_dirs() # $1 = INCLUDE or LIBRARY $@ = include or library paths
{ ADD="$1"; LINK="${1%"${1#?}"}"; shift
while [ "$1" ]; do
eval "${ADD}_DIRS=\"\${${ADD}_DIRS} -${LINK}${1}\""
shift
done
eval "${ADD}_DIRS=\"\${${ADD}_DIRS# }\""
}
check_compiler() # $1 = language $2 = function in lib
{ if [ "$1" = cxx ]; then
COMPILER="$CXX"
TEMP_CODE="$TEMP_CXX"
TEST_C="extern \"C\" { void $2(void); } int main() { $2(); }"
else
COMPILER="$CC"
TEMP_CODE="$TEMP_C"
TEST_C="void $2(void); int main(void) { $2(); return 0; }"
fi
}
check_enabled() # $1 = HAVE_$1 $2 = lib
{ [ "$HAVE_CXX" != 'no' ] && return 0
tmpval="$(eval "printf %s \"\$HAVE_$1\"")"
if [ "$tmpval" != 'yes' ]; then
eval "HAVE_$1=no"
return 0
fi
die 1 "Forced to build with $2 support and the C++ compiler is disabled. Exiting ..."
}
check_lib() # $1 = language $2 = HAVE_$2 $3 = lib $4 = function in lib $5 = extralibs $6 = headers $7 = critical error message [checked only if non-empty]
{ tmpval="$(eval "printf %s \"\$HAVE_$2\"")"
[ "$tmpval" = 'no' ] && return 0
check_compiler "$1" "$4"
if [ "$4" ]; then
ECHOBUF="Checking function $4 in ${3% }"
if [ "$6" ]; then
printf %s\\n "$6" "int main(void) { void *p = (void*)$4; return 0; }" > "$TEMP_CODE"
else
printf %s\\n "$TEST_C" > "$TEMP_CODE"
fi
else
ECHOBUF="Checking existence of ${3% }"
printf %s\\n 'int main(void) { return 0; }' > "$TEMP_CODE"
fi
val="$2"
lib="$3"
error="${7:-}"
answer='no'
eval "set -- $INCLUDE_DIRS $LIBRARY_DIRS $5 $CFLAGS $LDFLAGS $3"
"$COMPILER" -o "$TEMP_EXE" "$TEMP_CODE" "$@" >>config.log 2>&1 && answer='yes'
eval "HAVE_$val=\"$answer\""
printf %s\\n "$ECHOBUF ... $answer"
rm -f -- "$TEMP_CODE" "$TEMP_EXE"
if [ "$answer" = 'no' ]; then
[ "$error" ] && die 1 "$error"
[ "$tmpval" = 'yes' ] && {
die 1 "Forced to build with library $lib, but cannot locate. Exiting ..."
}
else
eval "${val}_LIBS=\"$lib\""
PKG_CONF_USED="$PKG_CONF_USED $val"
fi
return 0
}
check_pkgconf() # $1 = HAVE_$1 $2 = package $3 = version $4 = critical error message [checked only if non-empty]
{ tmpval="$(eval "printf %s \"\$HAVE_$1\"")"
eval "TMP_$1=\$tmpval"
[ "$tmpval" = 'no' ] && return 0
ECHOBUF="Checking presence of package $2"
[ "$3" ] && ECHOBUF="$ECHOBUF >= $3"
[ "$PKG_CONF_PATH" = "none" ] && {
eval "HAVE_$1=no"
printf %s\\n "$ECHOBUF ... no"
return 0
}
answer='no'
version='no'
$PKG_CONF_PATH --atleast-version="${3:-0.0}" "$2" && {
answer='yes'
version="$("$PKG_CONF_PATH" --modversion "$2")"
eval "$1_CFLAGS=\"$("$PKG_CONF_PATH" "$2" --cflags)\""
eval "$1_LIBS=\"$("$PKG_CONF_PATH" "$2" --libs)\""
}
eval "HAVE_$1=\"$answer\""
printf %s\\n "$ECHOBUF ... $version"
if [ "$answer" = 'no' ]; then
[ "$4" ] && die 1 "$4"
[ "$tmpval" = 'yes' ] && \
die 1 "Forced to build with package $2, but cannot locate. Exiting ..."
else
PKG_CONF_USED="$PKG_CONF_USED $1"
fi
}
check_header() #$1 = HAVE_$1 $2, $3, ... = header files
{ tmpval="$(eval "printf %s \"\$HAVE_$1\"")"
[ "$tmpval" = 'no' ] && return 0
rm -f -- "$TEMP_C"
val="$1"
header="$2"
shift
for head do
CHECKHEADER="$head"
printf %s\\n "#include <$head>" >> "$TEMP_C"
done
printf %s\\n "int main(void) { return 0; }" >> "$TEMP_C"
answer='no'
eval "set -- $INCLUDE_DIRS"
"$CC" -o "$TEMP_EXE" "$TEMP_C" "$@" >>config.log 2>&1 && answer='yes'
eval "HAVE_$val=\"$answer\""
printf %s\\n "Checking presence of header file $CHECKHEADER ... $answer"
rm -f -- "$TEMP_C" "$TEMP_EXE"
[ "$tmpval" = 'yes' ] && [ "$answer" = 'no' ] && \
die 1 "Build assumed that $header exists, but cannot locate. Exiting ..."
}
check_macro() #$1 = HAVE_$1 $2 = macro name $3 = header name [included only if non-empty]
{ tmpval="$(eval "printf %s \"\$HAVE_$1\"")"
[ "$tmpval" = 'no' ] && return 0
if [ "${3}" ]; then
ECHOBUF="Checking presence of predefined macro $2 in $3"
header_include="#include <$3>"
else
ECHOBUF="Checking presence of predefined macro $2"
header_include=""
fi
cat << EOF > "$TEMP_C"
$header_include
#ifndef $2
#error $2 is not defined
#endif
int main(void) { return 0; }
EOF
answer='no'
val="$1"
macro="$2"
eval "set -- $CFLAGS $INCLUDE_DIRS"
"$CC" -o "$TEMP_EXE" "$TEMP_C" "$@" >>config.log 2>&1 && answer='yes'
eval "HAVE_$val=\"$answer\""
printf %s\\n "$ECHOBUF ... $answer"
rm -f -- "$TEMP_C" "$TEMP_EXE"
[ "$tmpval" = 'yes' ] && [ "$answer" = 'no' ] && \
die 1 "Build assumed that $macro is defined, but it's not. Exiting ..."
}
check_switch() # $1 = language $2 = HAVE_$2 $3 = switch $4 = critical error message [checked only if non-empty]
{ check_compiler "$1" ''
ECHOBUF="Checking for availability of switch $3 in $COMPILER"
printf %s\\n 'int main(void) { return 0; }' > "$TEMP_CODE"
answer='no'
"$COMPILER" -o "$TEMP_EXE" "$TEMP_CODE" "$3" >>config.log 2>&1 && answer='yes'
eval "HAVE_$2=\"$answer\""
printf %s\\n "$ECHOBUF ... $answer"
rm -f -- "$TEMP_CODE" "$TEMP_EXE"
[ "$answer" = 'no' ] && {
[ "$4" ] && die 1 "$4"
}
}
check_val() # $1 = language $2 = HAVE_$2 $3 = lib $4 = include directory [checked only if non-empty]
{ tmpval="$(eval "printf %s \"\$HAVE_$2\"")"
oldval="$(eval "printf %s \"\$TMP_$2\"")"
if [ "$tmpval" = 'no' ] && [ "$oldval" != 'no' ]; then
eval "HAVE_$2=auto"
check_lib "$1" "$2" "$3"
if [ "${4:-}" ] && [ "$answer" = 'yes' ]; then
val="$2"
include="$4"
eval "set -- $INCLUDES"
for dir do
[ -d "/$dir/$include" ] && { eval "${val}_CFLAGS=\"-I/$dir/$include\""; break; }
done
[ -z "$(eval "printf %s \"\${${val}_CFLAGS}\"")" ] && eval "HAVE_$val=no"
fi
if [ "$answer" = 'no' ] && [ "$oldval" = 'yes' ]; then
die 1 "Forced to build with library $lib, but cannot locate. Exiting ..."
fi
fi
}
create_config_header()
{ outfile="$1"; shift
printf %s\\n "Creating config header: $outfile"
name="$(printf %s "QB_${outfile}__" | tr '.[a-z]' '_[A-Z]')"
{ printf %s\\n "#ifndef $name" "#define $name" '' \
"#define PACKAGE_NAME \"$PACKAGE_NAME\""
while [ "$1" ]; do
case "$(eval "printf %s \"\$HAVE_$1\"")" in
'yes')
if [ "$(eval "printf %s \"\$C89_$1\"")" = 'no' ]; then
printf %s\\n '#if __cplusplus || __STDC_VERSION__ >= 199901L' \
"#define HAVE_$1 1" '#endif'
else
printf %s\\n "#define HAVE_$1 1"
fi
;;
'no') printf %s\\n "/* #undef HAVE_$1 */";;
esac
shift
done
eval "set -- $CONFIG_DEFINES"
for VAR do
printf %s\\n "#define ${VAR%%=*} ${VAR#*=}"
done
printf %s\\n '#endif'
} > "$outfile"
}
create_config_make()
{ outfile="$1"; shift
printf %s\\n "Creating make config: $outfile"
{ if [ "$HAVE_CC" = 'yes' ]; then
printf %s\\n "CC = $CC"
if [ "${CFLAGS}" ]; then
printf %s\\n "CFLAGS = $CFLAGS"
fi
fi
if [ "$HAVE_CXX" = 'yes' ]; then
printf %s\\n "CXX = $CXX"
if [ "${CXXFLAGS}" ]; then
printf %s\\n "CXXFLAGS = $CXXFLAGS"
fi
fi
printf %s\\n "WINDRES = $WINDRES" \
"MOC = $MOC" \
"ASFLAGS = $ASFLAGS" \
"LDFLAGS = $LDFLAGS" \
"INCLUDE_DIRS = $INCLUDE_DIRS" \
"LIBRARY_DIRS = $LIBRARY_DIRS" \
"PACKAGE_NAME = $PACKAGE_NAME" \
"BUILD = $BUILD" \
"PREFIX = $PREFIX"
while [ "$1" ]; do
case "$(eval "printf %s \"\$HAVE_$1\"")" in
'yes')
if [ "$(eval "printf %s \"\$C89_$1\"")" = 'no' ]; then
printf %s\\n "ifneq (\$(C89_BUILD),1)" \
"HAVE_$1 = 1" 'endif'
else
printf %s\\n "HAVE_$1 = 1"
fi
;;
'no') printf %s\\n "HAVE_$1 = 0";;
esac
case "$PKG_CONF_USED" in
*$1*)
FLAG="$(eval "printf %s \"\$$1_CFLAGS\"")"
LIBS="$(eval "printf %s \"\$$1_LIBS\"")"
[ "${FLAG}" ] && printf %s\\n "$1_CFLAGS = ${FLAG%"${FLAG##*[! ]}"}"
[ "${LIBS}" ] && printf %s\\n "$1_LIBS = ${LIBS%"${LIBS##*[! ]}"}"
;;
esac
shift
done
eval "set -- $MAKEFILE_DEFINES"
for VAR do
printf %s\\n "${VAR%%=*} = ${VAR#*=}"
done
} > "$outfile"
}
. qb/config.libs.sh