#!/bin/sh # # MPD configure script # adapted from Libav # # Copyright (c) 2000-2002 Fabrice Bellard # Copyright (c) 2005-2008 Diego Biurrun # Copyright (c) 2005-2008 Mans Rullgard # # Prevent locale nonsense from breaking basic text processing. LC_ALL=C export LC_ALL # make sure we are running under a compatible shell # try to make this part work with most shells try_exec(){ echo "Trying shell $1" type "$1" > /dev/null 2>&1 && exec "$@" } unset foo (: ${foo%%bar}) 2> /dev/null E1="$?" (: ${foo?}) 2> /dev/null E2="$?" if test "$E1" != 0 || test "$E2" = 0; then echo "Broken shell detected. Trying alternatives." export FF_CONF_EXEC if test "0$FF_CONF_EXEC" -lt 1; then FF_CONF_EXEC=1 try_exec bash "$0" "$@" fi if test "0$FF_CONF_EXEC" -lt 2; then FF_CONF_EXEC=2 try_exec ksh "$0" "$@" fi if test "0$FF_CONF_EXEC" -lt 3; then FF_CONF_EXEC=3 try_exec /usr/xpg4/bin/sh "$0" "$@" fi echo "No compatible shell script interpreter found." echo "This configure script requires a POSIX-compatible shell" echo "such as bash or ksh." echo "THIS IS NOT A BUG IN MPD, DO NOT REPORT IT AS SUCH." echo "Instead, install a working POSIX-compatible shell." echo "Disabling this configure test will create a broken MPD" if test "$BASH_VERSION" = '2.04.0(1)-release'; then echo "This bash version ($BASH_VERSION) is broken on your platform." echo "Upgrade to a later version if available." fi exit 1 fi test -d /usr/xpg4/bin && PATH=/usr/xpg4/bin:$PATH show_help(){ cat <> $logfile } log_file(){ log BEGIN $1 pr -n -t $1 >> $logfile log END $1 } echolog(){ log "$@" echo "$@" } warn(){ log "WARNING: $*" WARNINGS="${WARNINGS}WARNING: $*\n" } die(){ echolog "$@" cat <>file; } else if (file ~ /\\.asm\$/) { printf(\"%%define %s %d\\n\", c, v) >>file; } else if (file ~ /\\.mak\$/) { n = -v ? \"\" : \"!\"; printf(\"%s%s=yes\\n\", n, c) >>file; } } }" } print_enabled(){ suf=$1 shift for v; do enabled $v && printf "%s\n" ${v%$suf}; done } append(){ var=$1 shift eval "$var=\"\$$var $*\"" } prepend(){ var=$1 shift eval "$var=\"$* \$$var\"" } add_cppflags(){ append CPPFLAGS "$@" } add_cflags(){ append CFLAGS $($cflags_filter "$@") } add_ldflags(){ append LDFLAGS $($ldflags_filter "$@") } add_extralibs(){ prepend extralibs $($ldflags_filter "$@") } add_host_cppflags(){ append host_cppflags "$@" } add_host_cflags(){ append host_cflags $($host_cflags_filter "$@") } add_host_ldflags(){ append host_ldflags $($host_ldflags_filter "$@") } add_compat(){ append compat_objs $1 shift map 'add_cppflags -D$v' "$@" } check_cmd(){ log "$@" "$@" >> $logfile 2>&1 } cc_o(){ eval printf '%s\\n' $CC_O } cc_e(){ eval printf '%s\\n' $CC_E } check_cc(){ log check_cc "$@" cat > $TMPC log_file $TMPC check_cmd $cc $CPPFLAGS $CFLAGS "$@" $CC_C $(cc_o $TMPO) $TMPC } check_cpp(){ log check_cpp "$@" cat > $TMPC log_file $TMPC check_cmd $cc $CPPFLAGS $CFLAGS "$@" $(cc_e $TMPO) $TMPC } ld_o(){ eval printf '%s\\n' $LD_O } check_ld(){ log check_ld "$@" flags=$(filter_out '-l*' "$@") libs=$(filter '-l*' "$@") check_cc $($cflags_filter $flags) || return flags=$($ldflags_filter $flags) libs=$($ldflags_filter $libs) check_cmd $ld $LDFLAGS $flags $(ld_o $TMPE) $TMPO $libs $extralibs } check_code(){ log check_code "$@" check=$1 headers=$2 code=$3 shift 3 { for hdr in $headers; do echo "#include <$hdr>" done echo "int main(void) { $code; return 0; }" } | check_$check "$@" } check_cppflags(){ log check_cppflags "$@" check_cc "$@" < int x; EOF } check_func(){ log check_func "$@" func=$1 shift disable $func check_ld "$@" < float foo(float f, float g) { return $func($args); } int main(void){ return 0; } EOF } check_func_headers(){ log check_func_headers "$@" headers=$1 funcs=$2 shift 2 { for hdr in $headers; do echo "#include <$hdr>" done for func in $funcs; do echo "long check_$func(void) { return (long) $func; }" done echo "int main(void) { return 0; }" } | check_ld "$@" && enable $funcs && enable_safe $headers } check_cpp_condition(){ log check_cpp_condition "$@" header=$1 condition=$2 shift 2 check_cpp "$@" < #if !($condition) #error "unsatisfied condition: $condition" #endif EOF } check_lib(){ log check_lib "$@" header="$1" func="$2" shift 2 check_header $header && check_func $func "$@" && add_extralibs "$@" } check_lib2(){ log check_lib2 "$@" headers="$1" funcs="$2" shift 2 check_func_headers "$headers" "$funcs" "$@" && add_extralibs "$@" } check_pkg_config(){ log check_pkg_config "$@" pkg="$1" headers="$2" funcs="$3" shift 3 $pkg_config --exists $pkg || return pkg_cflags=$($pkg_config --cflags $pkg) pkg_libs=$($pkg_config --libs $pkg) check_func_headers "$headers" "$funcs" $pkg_cflags $pkg_libs "$@" && set_safe ${pkg}_cflags $pkg_cflags && set_safe ${pkg}_libs $pkg_libs add_cflags $(get_safe ${pkg}_cflags) add_extralibs $(get_safe ${pkg}_libs) } check_exec(){ check_ld "$@" && { enabled cross_compile || $TMPE >> $logfile 2>&1; } } check_exec_crash(){ code=$(cat) # exit() is not async signal safe. _Exit (C99) and _exit (POSIX) # are safe but may not be available everywhere. Thus we use # raise(SIGTERM) instead. The check is run in a subshell so we # can redirect the "Terminated" message from the shell. SIGBUS # is not defined by standard C so it is used conditionally. (check_exec "$@") >> $logfile 2>&1 < static void sighandler(int sig){ raise(SIGTERM); } int foo(void){ $code } int main(void){ signal(SIGILL, sighandler); signal(SIGFPE, sighandler); signal(SIGSEGV, sighandler); #ifdef SIGBUS signal(SIGBUS, sighandler); #endif foo(); } EOF } check_type(){ log check_type "$@" headers=$1 type=$2 shift 2 disable_safe "$type" check_code cc "$headers" "$type v" "$@" && enable_safe "$type" } check_struct(){ log check_struct "$@" headers=$1 struct=$2 member=$3 shift 3 disable_safe "${struct}_${member}" check_code cc "$headers" "const void *p = &(($struct *)0)->$member" "$@" && enable_safe "${struct}_${member}" } check_builtin(){ log check_builtin "$@" name=$1 headers=$2 builtin=$3 shift 3 disable "$name" check_code ld "$headers" "$builtin" "$@" && enable "$name" } require(){ name="$1" header="$2" func="$3" shift 3 check_lib $header $func "$@" || die "ERROR: $name not found" } require2(){ name="$1" headers="$2" func="$3" shift 3 check_lib2 "$headers" $func "$@" || die "ERROR: $name not found" } require_pkg_config(){ pkg="$1" check_pkg_config "$@" || die "ERROR: $pkg not found" add_cflags $(get_safe ${pkg}_cflags) add_extralibs $(get_safe ${pkg}_libs) } hostcc_o(){ eval printf '%s\\n' $HOSTCC_O } check_host_cc(){ log check_host_cc "$@" cat > $TMPC log_file $TMPC check_cmd $host_cc $host_cflags "$@" $HOSTCC_C $(hostcc_o $TMPO) $TMPC } check_host_cppflags(){ log check_host_cppflags "$@" check_host_cc "$@" < "$file.tmp" && mv "$file.tmp" "$file" || rm "$file.tmp" } cp_if_changed(){ cmp -s "$1" "$2" && echo "$2 is unchanged" && return mkdir -p "$(dirname $2)" $cp_f "$1" "$2" } # CONFIG_LIST contains configurable options, while HAVE_LIST is for # system-dependent things. COMPONENT_LIST=" archives encoders inputs outputs " EXTERNAL_LIBRARY_LIST=" bzlib despotify libao libasound libcdio_paranoia libcurl libffado libflac libiso9660 libmp3lame libpulse libroar libsamplerate libsqlite3 libsoup libtwolame libvorbis libwrap libyajl zlib " CONFIG_LIST=" $COMPONENT_LIST $EXTERNAL_LIBRARY_LIST doc inotify small ud " ARCH_LIST=' aarch64 alpha arm avr32 avr32_ap avr32_uc bfin ia64 m68k mips mips64 parisc ppc ppc64 s390 sh4 sparc sparc64 tilegx tilepro tomi x86 x86_32 x86_64 ' ARCH_EXT_LIST_ARM=' armv5te armv6 armv6t2 neon vfp vfpv3 ' ARCH_EXT_LIST_X86=' amd3dnow amd3dnowext avx fma4 mmx mmxext sse sse2 sse3 sse4 sse42 ssse3 ' ARCH_EXT_LIST=" $ARCH_EXT_LIST_ARM $ARCH_EXT_LIST_X86 altivec ppc4xx vis " MATH_FUNCS=" atanf atan2f cbrtf cosf exp2 exp2f expf isinf isnan ldexpf llrint llrintf log2 log2f log10f lrint lrintf powf rint round roundf sinf trunc truncf " HAVE_LIST=" $ARCH_EXT_LIST $(add_suffix _external $ARCH_EXT_LIST) $(add_suffix _inline $ARCH_EXT_LIST) $MATH_FUNCS accept4 alsa_asoundlib_h arpa_inet_h attribute_may_alias attribute_packed cdio_paranoia_h cdio_paranoia_paranoia_h closesocket dos_paths fork getaddrinfo getpeereid getservbyport gettimeofday inet_aton inotify_init inotify_init1 jack_port_get_latency_range ldbrx mkfifo msvcrt pipe2 socklen_t soundcard_h strtok_r struct_addrinfo struct_group_source_req struct_ip_mreq_source struct_ipv6_mreq struct_pollfd struct_rusage_ru_maxrss struct_sockaddr_in6 struct_sockaddr_sa_len struct_sockaddr_storage struct_ucred struct_v4l2_frmivalenum_discrete syslog unistd_h windows_h winsock2_h " # options emitted with CONFIG_ prefix but not available on the command line CONFIG_EXTRA=" " CMDLINE_SELECT=" $ARCH_EXT_LIST $CONFIG_LIST cross_compile debug extra_warnings logging lto optimizations " PATHS_LIST=' bindir confdir datadir mandir prefix ' CMDLINE_SET=" $PATHS_LIST ar arch build_suffix cc cpu cross_prefix dep_cc extra_version host_cc host_cflags host_ld host_ldflags host_libs host_os ld logfile nm optflags pkg_config sysinclude sysroot target_exec target_os target_path toolchain " CMDLINE_APPEND=" extra_cflags host_cppflags " # code dependency declarations # architecture extensions log2_deps="!msvcrt" # archives iso9660_archive_deps="libiso9660" bzip2_archive_deps="bzlib" zzip_archive_deps="zziplib" # inputs cdio_paranoia_input_deps="libcdio_paranoia" curl_input_deps="libcurl" soup_input_deps="libsoup" lastfm_input_deps="libcurl" despotify_input_deps="despotify" soundcloud_input_deps="libyajl" # outputs alsa_output_deps="alsa_asoundlib_h" roar_output_deps="libroar" ao_output_deps="libao" ffado_output_deps="libffado" fifo_output_deps="mkfifo" httpd_output_deps="encoders" jack_output_deps="libjack" openal_output_deps="libopenal" oss_output_deps_any="soundcard_h sys_soundcard_h" osx_output_deps="AudioUnit CoreAudio CoreServices" pulse_output_deps="libpulse" recorder_output_deps="encoders" shout_output_deps="libshout" solaris_output_deps="solaris" winmm_output_deps="winmm" # encoders vorbis_encoder_deps="libvorbis" lame_encoder_deps="libmp3lame" twolame_encoder_deps="libtwolame" flac_encoder_deps="libflac" # default parameters logfile="config.log" # installation paths prefix_default="/usr/local" bindir_default='${prefix}/bin' datadir_default='${prefix}/share/mpd' mandir_default='${prefix}/share/man' confdir_default='/etc' # toolchain cc_default="gcc" host_cc_default="gcc" cp_f="cp -f" ln_s="ln -s -f" nm_default="nm -g" objformat="elf" pkg_config_default=pkg-config ranlib="ranlib" nogas=":" # machine arch_default=$(uname -m) cpu="generic" # OS target_os_default=$(tolower $(uname -s)) host_os=$target_os_default # configurable options enable debug enable doc enable optimizations # build settings FULLNAME='$(NAME)$(BUILDSUF)' cflags_filter=echo ldflags_filter=echo CC_C='-c' CC_E='-E -o $@' CC_O='-o $@' LD_O='-o $@' LD_LIB='-l%' LD_PATH='-L' HOSTCC_C='-c' HOSTCC_O='-o $@' HOSTLD_O='-o $@' host_cflags='-O3 -g' host_cppflags='-D_ISOC99_SOURCE -D_XOPEN_SOURCE=600' host_libs='-lm' host_cflags_filter=echo host_ldflags_filter=echo target_path='$(CURDIR)' # since the object filename is not given with the -MM flag, the compiler # is only able to print the basename, and we must add the path ourselves DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< | sed -e "/^\#.*/d" -e "s,^[[:space:]]*$(*F)\\.o,$(@D)/$(*F).o," > $(@:.o=.d)' DEPFLAGS='-MM' # find source path if test -f configure; then source_path=. else source_path=$(cd $(dirname "$0"); pwd) echo "$source_path" | grep -q '[[:blank:]]' && die "Out of tree builds are impossible with whitespace in source path." test -e "$source_path/config.h" && die "Out of tree builds are impossible with config.h in source dir." fi for v in "$@"; do r=${v#*=} l=${v%"$r"} r=$(sh_quote "$r") MPD_CONFIGURATION="${MPD_CONFIGURATION# } ${l}${r}" done find_things(){ thing=$1 pattern=$2 file=$source_path/$3 sed -n "s/^[^#]*$pattern.*([^,]*, *\([^,]*\)\(,.*\)*).*/\1_$thing/p" "$file" } #FIXME ARCHIVE_LIST=" bz2_archive iso9660_archive zzip_archive " ENCODER_LIST=" flac_encoder lame_encoder twolame_encoder vorbis_encoder wave_encoder " OUTPUT_LIST=" alsa_output ao_output ffado_output fifo_output httpd_output jack_output mvp_output null_output openal_output oss_output osx_output pipe_output pulse_output recorder_output roar_output shout_output solaris_output winmm_output " INPUT_LIST=" cdio_paranoia_input curl_input despotify_input ffmpeg_input file_input rewind_input soup_input " ALL_COMPONENTS=" $ARCHIVE_LIST $ENCODER_LIST $OUTPUT_LIST $INPUT_LIST " for n in $COMPONENT_LIST; do v=$(toupper ${n%s})_LIST eval enable \$$v eval ${n}_if_any="\$$v" done enable $ARCH_EXT_LIST die_unknown(){ echo "Unknown option \"$1\"." echo "See $0 --help for available options." exit 1 } print_3_columns() { cat | tr ' ' '\n' | sort | pr -r -3 -t } show_list() { suffix=_$1 shift echo $* | sed s/$suffix//g | print_3_columns exit 0 } for opt do optval="${opt#*=}" case "$opt" in --extra-ldflags=*) add_ldflags $optval ;; --extra-libs=*) add_extralibs $optval ;; --disable-devices) disable $INDEV_LIST $OUTDEV_LIST ;; --enable-debug=*) debuglevel="$optval" ;; --disable-everything) map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST ;; --disable-all) map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST disable $PROGRAM_LIST doc ;; --enable-*=*|--disable-*=*) eval $(echo "${opt%%=*}" | sed 's/--/action=/;s/-/ thing=/') is_in "${thing}s" $COMPONENT_LIST || die_unknown "$opt" eval list=\$$(toupper $thing)_LIST name=$(echo "${optval}" | sed "s/,/_${thing}|/g")_${thing} $action $(filter "$name" $list) ;; --enable-?*|--disable-?*) eval $(echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g') if is_in $option $COMPONENT_LIST; then test $action = disable && action=unset eval $action \$$(toupper ${option%s})_LIST elif is_in $option $CMDLINE_SELECT; then $action $option else die_unknown $opt fi ;; --list-*) NAME="${opt#--list-}" is_in $NAME $COMPONENT_LIST || die_unknown $opt NAME=${NAME%s} eval show_list $NAME \$$(toupper $NAME)_LIST ;; --help|-h) show_help ;; *) optname="${opt%%=*}" optname="${optname#--}" optname=$(echo "$optname" | sed 's/-/_/g') if is_in $optname $CMDLINE_SET; then eval $optname='$optval' elif is_in $optname $CMDLINE_APPEND; then append $optname "$optval" else die_unknown $opt fi ;; esac done disabled logging && logfile=/dev/null echo "# $0 $MPD_CONFIGURATION" > $logfile set >> $logfile test -n "$cross_prefix" && enable cross_compile if enabled cross_compile; then test -n "$arch" && test -n "$target_os" || die "Must specify target arch and OS when cross-compiling" fi cc_default="${cross_prefix}${cc_default}" nm_default="${cross_prefix}${nm_default}" pkg_config_default="${cross_prefix}${pkg_config_default}" ranlib="${cross_prefix}${ranlib}" sysinclude_default="${sysroot}/usr/include" case "$toolchain" in clang-asan) cc_default="clang" add_cflags -fsanitize=address add_ldflags -fsanitize=address ;; clang-tsan) cc_default="clang" add_cflags -fsanitize=thread -pie add_ldflags -fsanitize=thread -pie ;; msvc) cc_default="c99wrap cl" ld_default="c99wrap link" nm_default="dumpbin -symbols" target_os_default="win32" ;; gcov) add_cflags -fprofile-arcs -ftest-coverage add_ldflags -fprofile-arcs -ftest-coverage ;; ?*) die "Unknown toolchain $toolchain" ;; esac set_default arch cc pkg_config sysinclude target_os enabled cross_compile || host_cc_default=$cc set_default host_cc if ! $pkg_config --version >/dev/null 2>&1; then warn "$pkg_config not found, library detection may fail." pkg_config=false fi exesuf() { case $1 in mingw32|win32|win64|cygwin*|*-dos|freedos|opendos|os/2*|symbian) echo .exe ;; esac } EXESUF=$(exesuf $target_os) HOSTEXESUF=$(exesuf $host_os) # set temporary file name : ${TMPDIR:=$TEMPDIR} : ${TMPDIR:=$TMP} : ${TMPDIR:=/tmp} if ! check_cmd mktemp -u XXXXXX; then # simple replacement for missing mktemp # NOT SAFE FOR GENERAL USE mktemp(){ echo "${2%%XXX*}.${HOSTNAME}.${UID}.$$" } fi tmpfile(){ tmp=$(mktemp -u "${TMPDIR}/ffconf.XXXXXXXX")$2 && (set -C; exec > $tmp) 2>/dev/null || die "Unable to create temporary file in $TMPDIR." append TMPFILES $tmp eval $1=$tmp } trap 'rm -f -- $TMPFILES' EXIT tmpfile TMPASM .asm tmpfile TMPC .c tmpfile TMPE $EXESUF tmpfile TMPH .h tmpfile TMPO .o tmpfile TMPS .S tmpfile TMPSH .sh tmpfile TMPV .ver unset -f mktemp chmod +x $TMPE # make sure we can execute files in $TMPDIR cat > $TMPSH 2>> $logfile <> $logfile 2>&1 if ! $TMPSH >> $logfile 2>&1; then cat <&1 | grep -q '^gcc.*LLVM'; then _type=llvm_gcc gcc_extra_ver=$(expr "$($_cc --version | head -n1)" : '.*\((.*)\)') _ident="llvm-gcc $($_cc -dumpversion) $gcc_extra_ver" _depflags='-MMD -MF $(@:.o=.d) -MT $@' _cflags_speed='-O3' _cflags_size='-Os' elif $_cc -v 2>&1 | grep -qi ^gcc; then _type=gcc gcc_version=$($_cc --version | head -n1) gcc_basever=$($_cc -dumpversion) gcc_pkg_ver=$(expr "$gcc_version" : '[^ ]* \(([^)]*)\)') gcc_ext_ver=$(expr "$gcc_version" : ".*$gcc_pkg_ver $gcc_basever \\(.*\\)") _ident=$(cleanws "gcc $gcc_basever $gcc_pkg_ver $gcc_ext_ver") if ! $_cc -dumpversion | grep -q '^2\.'; then _depflags='-MMD -MF $(@:.o=.d) -MT $@' fi _cflags_speed='-O3' _cflags_size='-Os' elif $_cc --version 2>/dev/null | grep -q ^icc; then _type=icc _ident=$($_cc --version | head -n1) _depflags='-MMD' _cflags_speed='-O3' _cflags_size='-Os' _cflags_noopt='-O1' elif $_cc -v 2>&1 | grep -q xlc; then _type=xlc _ident=$($_cc -qversion 2>/dev/null | head -n1) _cflags_speed='-O5' _cflags_size='-O5 -qcompact' elif $_cc -V 2>/dev/null | grep -q Compaq; then _type=ccc _ident=$($_cc -V | head -n1 | cut -d' ' -f1-3) _DEPFLAGS='-M' _cflags_speed='-fast' _cflags_size='-O1' _flags_filter=ccc_flags elif $_cc --vsn 2>/dev/null | grep -q "ARM C/C++ Compiler"; then test -d "$sysroot" || die "No valid sysroot specified." _type=armcc _ident=$($_cc --vsn | head -n1) armcc_conf="$PWD/armcc.conf" $_cc --arm_linux_configure \ --arm_linux_config_file="$armcc_conf" \ --configure_sysroot="$sysroot" \ --configure_cpp_headers="$sysinclude" >>$logfile 2>&1 || die "Error creating armcc configuration file." $_cc --vsn | grep -q RVCT && armcc_opt=rvct || armcc_opt=armcc _flags="--arm_linux_config_file=$armcc_conf --translate_gcc" as_default="${cross_prefix}gcc" _depflags='-MMD' _cflags_speed='-O3' _cflags_size='-Os' elif $_cc -version 2>/dev/null | grep -Eq 'TMS470|TI ARM'; then _type=tms470 _ident=$($_cc -version | head -n1 | tr -s ' ') _flags='--gcc --abi=eabi -me' _cc_e='-ppl -fe=$@' _cc_o='-fe=$@' _depflags='-ppa -ppd=$(@:.o=.d)' _cflags_speed='-O3 -mf=5' _cflags_size='-O3 -mf=2' _flags_filter=tms470_flags elif $_cc -v 2>&1 | grep -q clang; then _type=clang _ident=$($_cc --version | head -n1) _depflags='-MMD' _cflags_speed='-O3' _cflags_size='-Os' elif $_cc -V 2>&1 | grep -q Sun; then _type=suncc _ident=$($_cc -V 2>&1 | head -n1 | cut -d' ' -f 2-) _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< | sed -e "1s,^.*: ,$@: ," -e "\$$!s,\$$, \\\," -e "1!s,^.*: , ," > $(@:.o=.d)' _DEPFLAGS='-xM1 -xc99' _ldflags='-std=c99' _cflags_speed='-O5' _cflags_size='-O5 -xspace' _flags_filter=suncc_flags elif $_cc -v 2>&1 | grep -q 'PathScale\|Path64'; then _type=pathscale _ident=$($_cc -v 2>&1 | head -n1 | tr -d :) _depflags='-MMD -MF $(@:.o=.d) -MT $@' _cflags_speed='-O2' _cflags_size='-Os' _flags_filter='filter_out -Wdisabled-optimization' elif $_cc -v 2>&1 | grep -q Open64; then _type=open64 _ident=$($_cc -v 2>&1 | head -n1 | tr -d :) _depflags='-MMD -MF $(@:.o=.d) -MT $@' _cflags_speed='-O2' _cflags_size='-Os' _flags_filter='filter_out -Wdisabled-optimization|-Wtype-limits|-fno-signed-zeros' elif $_cc -V 2>&1 | grep -q Portland; then _type=pgi _ident="PGI $($_cc -V 2>&1 | awk '/^pgcc/ { print $2; exit }')" opt_common='-alias=ansi -Mdse -Mlre -Mpre' _cflags_speed="-O3 -Mautoinline -Munroll=c:4 $opt_common" _cflags_size="-O2 -Munroll=c:1 $opt_common" _cflags_noopt="-O1" _flags_filter=pgi_flags elif $_cc 2>&1 | grep -q Microsoft; then _type=msvc _ident=$($cc 2>&1 | head -n1) _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< 2>&1 | awk '\''/including/ { sub(/^.*file: */, ""); gsub(/\\/, "/"); if (!match($$0, / /)) print "$@:", $$0 }'\'' > $(@:.o=.d)' _DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -showIncludes -Zs' _cflags_speed="-O2" _cflags_size="-O1" # Nonstandard output options, to avoid msys path conversion issues, relies on wrapper to remap it if $_cc 2>&1 | grep -q Linker; then _ld_o='-out $@' else _ld_o='-Fe$@' fi _cc_o='-Fo $@' _cc_e='-P -Fi $@' _flags_filter=msvc_flags _ld_lib='lib%.a' _ld_path='-libpath:' _flags='-nologo' _cflags='-D_USE_MATH_DEFINES -Dinline=__inline -FIstdlib.h -Dstrtoll=_strtoi64' if [ $pfx = hostcc ]; then append _cflags -Dsnprintf=_snprintf fi fi eval ${pfx}_type=\$_type eval ${pfx}_ident=\$_ident } set_ccvars(){ eval ${1}_C=\${_cc_c-\${${1}_C}} eval ${1}_E=\${_cc_e-\${${1}_E}} eval ${1}_O=\${_cc_o-\${${1}_O}} if [ -n "$_depflags" ]; then eval ${1}_DEPFLAGS=\$_depflags else eval ${1}DEP=\${_DEPCMD:-\$DEPCMD} eval ${1}DEP_FLAGS=\${_DEPFLAGS:-\$DEPFLAGS} eval DEP${1}FLAGS=\$_flags fi } probe_cc cc "$cc" cflags_filter=$_flags_filter cflags_speed=$_cflags_speed cflags_size=$_cflags_size cflags_noopt=$_cflags_noopt add_cflags $_flags $_cflags add_cflags -I$source_path/src cc_ldflags=$_ldflags set_ccvars CC probe_cc hostcc "$host_cc" host_cflags_filter=$_flags_filter add_host_cflags $_flags $_cflags set_ccvars HOSTCC test -n "$cc_type" && enable $cc_type || warn "Unknown C compiler $cc, unable to select optimal CFLAGS" : ${as_default:=$cc} : ${dep_cc_default:=$cc} : ${ld_default:=$cc} : ${host_ld_default:=$host_cc} set_default ar as dep_cc ld host_ld probe_cc as "$as" set_ccvars AS probe_cc ld "$ld" ldflags_filter=$_flags_filter add_ldflags $_flags $_ldflags test "$cc_type" != "$ld_type" && add_ldflags $cc_ldflags LD_O=${_ld_o-$LD_O} LD_LIB=${_ld_lib-$LD_LIB} LD_PATH=${_ld_path-$LD_PATH} probe_cc hostld "$host_ld" host_ldflags_filter=$_flags_filter add_host_ldflags $_flags $_ldflags HOSTLD_O=${_ld_o-$HOSTLD_O} if [ -z "$CC_DEPFLAGS" ] && [ "$dep_cc" != "$cc" ]; then probe_cc depcc "$dep_cc" CCDEP=${_DEPCMD:-$DEPCMD} CCDEP_FLAGS=${_DEPFLAGS:=$DEPFLAGS} DEPCCFLAGS=$_flags fi if $ar 2>&1 | grep -q Microsoft; then arflags="-nologo" ar_o='-out:$@' elif $ar 2>&1 | grep -q 'Texas Instruments'; then arflags="rq" ar_o='$@' else arflags="rc" ar_o='$@' fi add_cflags $extra_cflags if test -n "$sysroot"; then case "$cc_type" in gcc|llvm_gcc|clang) add_cppflags --sysroot="$sysroot" add_ldflags --sysroot="$sysroot" ;; tms470) add_cppflags -I"$sysinclude" add_ldflags --sysroot="$sysroot" ;; esac fi if test "$cpu" = host; then enabled cross_compile && die "--cpu=host makes no sense when cross-compiling." case "$cc_type" in gcc|llvm_gcc) check_native(){ $cc $1=native -v -c -o $TMPO $TMPC >$TMPE 2>&1 || return sed -n "/cc1.*$1=/{ s/.*$1=\\([^ ]*\\).*/\\1/ p q }" $TMPE } cpu=$(check_native -march || check_native -mcpu) ;; esac test "${cpu:-host}" = host && die "--cpu=host not supported with compiler $cc" fi # Deal with common $arch aliases case "$arch" in aarch64|arm64) arch="aarch64" ;; arm*) arch="arm" ;; mips*|IP*) arch="mips" ;; parisc*|hppa*) arch="parisc" ;; "Power Macintosh"|ppc*|powerpc*) arch="ppc" ;; s390|s390x) arch="s390" ;; sh4|sh) arch="sh4" ;; sun4u|sparc*) arch="sparc" ;; tilegx|tile-gx) arch="tilegx" ;; i[3-6]86|i86pc|BePC|x86pc|x86_64|amd64) arch="x86" ;; esac is_in $arch $ARCH_LIST || warn "unknown architecture $arch" enable $arch # Add processor-specific flags if enabled aarch64; then case $cpu in armv*) cpuflags="-march=$cpu" ;; *) cpuflags="-mcpu=$cpu" ;; esac elif enabled alpha; then cpuflags="-mcpu=$cpu" elif enabled arm; then check_arm_arch() { check_cpp_condition stddef.h \ "defined __ARM_ARCH_${1}__ || defined __TARGET_ARCH_${2:-$1}" \ $cpuflags } probe_arm_arch() { if check_arm_arch 4; then echo armv4; elif check_arm_arch 4T; then echo armv4t; elif check_arm_arch 5; then echo armv5; elif check_arm_arch 5E; then echo armv5e; elif check_arm_arch 5T; then echo armv5t; elif check_arm_arch 5TE; then echo armv5te; elif check_arm_arch 5TEJ; then echo armv5te; elif check_arm_arch 6; then echo armv6; elif check_arm_arch 6J; then echo armv6j; elif check_arm_arch 6K; then echo armv6k; elif check_arm_arch 6Z; then echo armv6z; elif check_arm_arch 6ZK; then echo armv6zk; elif check_arm_arch 6T2; then echo armv6t2; elif check_arm_arch 7; then echo armv7; elif check_arm_arch 7A 7_A; then echo armv7-a; elif check_arm_arch 7R 7_R; then echo armv7-r; elif check_arm_arch 7M 7_M; then echo armv7-m; elif check_arm_arch 7EM 7E_M; then echo armv7-m; elif check_arm_arch 8A 8_A; then echo armv8-a; fi } [ "$cpu" = generic ] && cpu=$(probe_arm_arch) case $cpu in armv*) cpuflags="-march=$cpu" subarch=$(echo $cpu | sed 's/[^a-z0-9]//g') ;; *) cpuflags="-mcpu=$cpu" case $cpu in cortex-a*) subarch=armv7a ;; cortex-r*) subarch=armv7r ;; cortex-m*) enable thumb; subarch=armv7m ;; arm11*) subarch=armv6 ;; arm[79]*e*|arm9[24]6*|arm96*|arm102[26]) subarch=armv5te ;; armv4*|arm7*|arm9[24]*) subarch=armv4 ;; *) subarch=$(probe_arm_arch) ;; esac ;; esac case "$subarch" in armv5t*) enable fast_clz ;; armv[6-8]*) enable fast_clz fast_unaligned ;; esac elif enabled avr32; then case $cpu in ap7[02]0[0-2]) subarch="avr32_ap" cpuflags="-mpart=$cpu" ;; ap) subarch="avr32_ap" cpuflags="-march=$cpu" ;; uc3[ab]*) subarch="avr32_uc" cpuflags="-mcpu=$cpu" ;; uc) subarch="avr32_uc" cpuflags="-march=$cpu" ;; esac elif enabled bfin; then cpuflags="-mcpu=$cpu" elif enabled mips; then cpuflags="-march=$cpu" elif enabled ppc; then case $(tolower $cpu) in 601|ppc601|powerpc601) cpuflags="-mcpu=601" disable altivec ;; 603*|ppc603*|powerpc603*) cpuflags="-mcpu=603" disable altivec ;; 604*|ppc604*|powerpc604*) cpuflags="-mcpu=604" disable altivec ;; g3|75*|ppc75*|powerpc75*) cpuflags="-mcpu=750" disable altivec ;; g4|745*|ppc745*|powerpc745*) cpuflags="-mcpu=7450" ;; 74*|ppc74*|powerpc74*) cpuflags="-mcpu=7400" ;; g5|970|ppc970|powerpc970) cpuflags="-mcpu=970" ;; power[3-7]*) cpuflags="-mcpu=$cpu" ;; cell) cpuflags="-mcpu=cell" enable ldbrx ;; e500mc) cpuflags="-mcpu=e500mc" disable altivec ;; e500v2) cpuflags="-mcpu=8548 -mhard-float -mfloat-gprs=double" disable altivec ;; e500) cpuflags="-mcpu=8540 -mhard-float" disable altivec ;; esac elif enabled sparc; then case $cpu in cypress|f93[04]|tsc701|sparcl*|supersparc|hypersparc|niagara|v[789]) cpuflags="-mcpu=$cpu" disable vis ;; ultrasparc*|niagara[234]) cpuflags="-mcpu=$cpu" ;; esac elif enabled x86; then case $cpu in i[345]86|pentium) cpuflags="-march=$cpu" disable mmx ;; # targets that do NOT support conditional mov (cmov) pentium-mmx|k6|k6-[23]|winchip-c6|winchip2|c3) cpuflags="-march=$cpu" disable cmov ;; # targets that do support conditional mov (cmov) i686|pentiumpro|pentium[23]|pentium-m|athlon|athlon-tbird|athlon-4|athlon-[mx]p|athlon64*|k8*|opteron*|athlon-fx|core2|corei7*|amdfam10|barcelona|atom|bdver*) cpuflags="-march=$cpu" enable cmov enable fast_cmov ;; # targets that do support conditional mov but on which it's slow pentium4|pentium4m|prescott|nocona) cpuflags="-march=$cpu" enable cmov disable fast_cmov ;; esac fi if [ "$cpu" != generic ]; then add_cflags $cpuflags fi # compiler sanity check check_exec < EOF check_cc -D_LARGEFILE_SOURCE < EOF check_host_cflags -std=gnu99 check_host_cflags -Wall check_64bit(){ arch32=$1 arch64=$2 expr=$3 check_code cc "" "int test[2*($expr) - 1]" && subarch=$arch64 || subarch=$arch32 } case "$arch" in aarch64|alpha|ia64) spic=$shared ;; mips) check_64bit mips mips64 '_MIPS_SIM > 1' spic=$shared ;; parisc) check_64bit parisc parisc64 'sizeof(void *) > 4' spic=$shared ;; ppc) check_64bit ppc ppc64 'sizeof(void *) > 4' spic=$shared ;; sparc) check_64bit sparc sparc64 'sizeof(void *) > 4' spic=$shared ;; x86) check_64bit x86_32 x86_64 'sizeof(void *) > 4' if test "$subarch" = "x86_64"; then spic=$shared fi ;; esac enable $subarch enabled spic && enable pic # OS specific case $target_os in haiku) prefix_default="/boot/common" network_extralibs="-lnetwork" host_libs= ;; sunos) network_extralibs="-lsocket -lnsl" add_cppflags -D__EXTENSIONS__ -D_XOPEN_SOURCE=600 # When using suncc to build, the Solaris linker will mark # an executable with each instruction set encountered by # the Solaris assembler. As our libraries contain their own # guards for processor-specific code, instead suppress # generation of the HWCAPS ELF section on Solaris x86 only. enabled_all suncc x86 && echo "hwcap_1 = OVERRIDE;" > mapfile && add_ldflags -Wl,-M,mapfile nm_default='nm -P -g' ;; netbsd) oss_output_extralibs="-lossaudio" ;; openbsd|bitrig) SLIB_INSTALL_NAME='$(SLIBNAME).$(LIBMAJOR).$(LIBMINOR)' SLIB_INSTALL_LINKS= oss_output_extralibs="-lossaudio" ;; dragonfly) ;; freebsd) ;; bsd/os) add_extralibs -lpoll -lgnugetopt ;; darwin) gas="gas-preprocessor.pl $cc" add_ldflags -Wl,-dynamic,-search_paths_first SLIBSUF=".dylib" SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME).$(LIBVERSION)$(SLIBSUF)' SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME).$(LIBMAJOR)$(SLIBSUF)' objformat="macho" enabled x86_64 && objformat="macho64" ;; mingw32) LIBTARGET=i386 if enabled x86_64; then LIBTARGET="i386:x86-64" elif enabled arm; then LIBTARGET=arm-wince fi shlibdir_default="$bindir_default" SLIBPREF="" SLIBSUF=".dll" SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)' SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)' SLIB_EXTRA_CMD=-'sed -e "s/ @[^ ]*//" $$(@:$(SLIBSUF)=.orig.def) > $$(@:$(SLIBSUF)=.def); $(DLLTOOL) -m $(LIBTARGET) -d $$(@:$(SLIBSUF)=.def) -l $(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib) -D $(SLIBNAME_WITH_MAJOR)' SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)' SLIB_INSTALL_LINKS= SLIB_INSTALL_EXTRA_SHLIB='$(SLIBNAME:$(SLIBSUF)=.lib)' SLIB_INSTALL_EXTRA_LIB='lib$(SLIBNAME:$(SLIBSUF)=.dll.a) $(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.def)' objformat="win32" dlltool="${cross_prefix}dlltool" ranlib=: enable dos_paths ;; win32|win64) if enabled shared; then # Link to the import library instead of the normal static library # for shared libs. LD_LIB='%.lib' # Cannot build shared and static libraries at the same time with # MSVC. disable static fi shlibdir_default="$bindir_default" SLIBPREF="" SLIBSUF=".dll" SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)' SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)' SLIB_CREATE_DEF_CMD='makedef $(SUBDIR)lib$(NAME).ver $(OBJS) > $$(@:$(SLIBSUF)=.def)' SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)' SLIB_INSTALL_LINKS= SLIB_INSTALL_EXTRA_SHLIB='$(SLIBNAME:$(SLIBSUF)=.lib)' SLIB_INSTALL_EXTRA_LIB='$(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.def)' objformat="win32" ranlib=: enable dos_paths ;; cygwin*) target_os=cygwin shlibdir_default="$bindir_default" SLIBPREF="cyg" SLIBSUF=".dll" SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)' SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)' SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)' SLIB_INSTALL_LINKS= SLIB_INSTALL_EXTRA_LIB='lib$(FULLNAME).dll.a' objformat="win32" enable dos_paths ;; *-dos|freedos|opendos) network_extralibs="-lsocket" objformat="coff" enable dos_paths add_cppflags -U__STRICT_ANSI__ ;; linux) enable dv1394 ;; irix*) target_os=irix ranlib="echo ignoring ranlib" ;; os/2*) ln_s="cp -f" objformat="aout" add_cppflags -D_GNU_SOURCE add_ldflags -Zomf -Zbin-files -Zargs-wild -Zmap LIBSUF="_s.a" SLIBPREF="" SLIBSUF=".dll" SLIBNAME_WITH_VERSION='$(SLIBPREF)$(NAME)-$(LIBVERSION)$(SLIBSUF)' SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(shell echo $(NAME) | cut -c1-6)$(LIBMAJOR)$(SLIBSUF)' SLIB_CREATE_DEF_CMD='echo LIBRARY $(SLIBNAME_WITH_MAJOR) INITINSTANCE TERMINSTANCE > $(SUBDIR)$(NAME).def; \ echo PROTMODE >> $(SUBDIR)$(NAME).def; \ echo CODE PRELOAD MOVEABLE DISCARDABLE >> $(SUBDIR)$(NAME).def; \ echo DATA PRELOAD MOVEABLE MULTIPLE NONSHARED >> $(SUBDIR)$(NAME).def; \ echo EXPORTS >> $(SUBDIR)$(NAME).def; \ emxexp -o $(OBJS) >> $(SUBDIR)$(NAME).def' SLIB_EXTRA_CMD='emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.a $(SUBDIR)$(NAME).def; \ emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.lib $(SUBDIR)$(NAME).def;' SLIB_INSTALL_EXTRA_LIB='$(LIBPREF)$(NAME)_dll.a $(LIBPREF)$(NAME)_dll.lib' enable dos_paths ;; gnu/kfreebsd) add_cppflags -D_BSD_SOURCE ;; gnu) ;; qnx) add_cppflags -D_QNX_SOURCE network_extralibs="-lsocket" ;; symbian) SLIBSUF=".dll" enable dos_paths add_cflags --include=$sysinclude/gcce/gcce.h -fvisibility=default add_cppflags -D__GCCE__ -D__SYMBIAN32__ -DSYMBIAN_OE_POSIX_SIGNALS add_ldflags -Wl,--target1-abs,--no-undefined \ -Wl,-Ttext,0x80000,-Tdata,0x1000000 -shared \ -Wl,--entry=_E32Startup -Wl,-u,_E32Startup add_extralibs -l:eexe.lib -l:usrt2_2.lib -l:dfpaeabi.dso \ -l:drtaeabi.dso -l:scppnwdl.dso -lsupc++ -lgcc \ -l:libc.dso -l:libm.dso -l:euser.dso -l:libcrt0.lib ;; osf1) add_cppflags -D_OSF_SOURCE -D_POSIX_PII -D_REENTRANT ;; minix) ;; plan9) add_cppflags -D_C99_SNPRINTF_EXTENSION \ -D_REENTRANT_SOURCE \ -D_RESEARCH_SOURCE \ -DFD_SETSIZE=96 \ -DHAVE_SOCK_OPTS add_compat strtod.o strtod=avpriv_strtod network_extralibs='-lbsd' exeobjs=compat/plan9/main.o disable avserver cp_f='cp' ;; none) ;; *) die "Unknown OS '$target_os'." ;; esac # determine libc flavour # uclibc defines __GLIBC__, so it needs to be checked before glibc. if check_cpp_condition features.h "defined __UCLIBC__"; then libc_type=uclibc add_cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 elif check_cpp_condition features.h "defined __GLIBC__"; then libc_type=glibc add_cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_DEFAULT_SOURCE # MinGW headers can be installed on Cygwin, so check for newlib first. elif check_cpp_condition newlib.h "defined _NEWLIB_VERSION"; then libc_type=newlib add_cppflags -U__STRICT_ANSI__ elif check_header _mingw.h; then libc_type=mingw check_cpp_condition _mingw.h \ "defined (__MINGW64_VERSION_MAJOR) || (__MINGW32_MAJOR_VERSION > 3) || \ (__MINGW32_MAJOR_VERSION == 3 && __MINGW32_MINOR_VERSION >= 15)" || die "ERROR: MinGW runtime version must be >= 3.15." add_cppflags -U__STRICT_ANSI__ elif check_func_headers stdlib.h _get_doserrno; then libc_type=msvcrt add_compat strtod.o strtod=avpriv_strtod add_compat msvcrt/snprintf.o snprintf=avpriv_snprintf \ _snprintf=avpriv_snprintf \ vsnprintf=avpriv_vsnprintf elif check_cpp_condition stddef.h "defined __KLIBC__"; then libc_type=klibc fi test -n "$libc_type" && enable $libc_type # hacks for compiler/libc/os combinations if enabled_all tms470 glibc; then CPPFLAGS="-I${source_path}/compat/tms470 ${CPPFLAGS}" add_cppflags -D__USER_LABEL_PREFIX__= add_cppflags -D__builtin_memset=memset add_cppflags -D__gnuc_va_list=va_list -D_VA_LIST_DEFINED add_cflags -pds=48 # incompatible redefinition of macro fi if enabled_all ccc glibc; then add_ldflags -Wl,-z,now # calls to libots crash without this fi esc(){ echo "$*" | sed 's/%/%25/g;s/:/%3a/g' } check_cpp_condition stdlib.h "defined(__PIC__) || defined(__pic__) || defined(PIC)" && enable pic set_default $PATHS_LIST set_default nm disabled optimizations || check_cflags -fomit-frame-pointer enable_pic() { enable pic add_cppflags -DPIC add_cflags -fPIC } enabled pic && enable_pic check_cc <= AV_VERSION_INT(55, 0, 0)" || die "ERROR: libavcodec not found" check_lib libavformat/avformat.h avformat_open_input -lavformat && check_cpp_condition libavformat/avformat.h "LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(55, 0, 0)" || die "ERROR: libavformat not found" check_lib libavutil/avutil.h avutil_configuration -lavutil && check_cpp_condition libavutil/avutil.h "LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(52, 8, 0)" || die "ERROR: libavutil not found" check_lib libavresample/avresample.h avresample_open -lavresample && check_cpp_condition libavresample/avresample.h "LIBAVRESAMPLE_VERSION_INT >= AV_VERSION_INT(1, 0, 0)" || die "ERROR: libavresample not found" check_pkg_config glib-2.0 glib.h g_main_loop_new || die "ERROR: glib not found" check_pkg_config gthread-2.0 glib.h g_thread_init || die "ERROR: gthread not found" check_type "sys/types.h sys/socket.h" socklen_t check_type netdb.h "struct addrinfo" check_type netinet/in.h "struct group_source_req" -D_BSD_SOURCE check_type netinet/in.h "struct ip_mreq_source" -D_BSD_SOURCE check_type netinet/in.h "struct ipv6_mreq" -D_DARWIN_C_SOURCE check_type netinet/in.h "struct sockaddr_in6" check_type poll.h "struct pollfd" check_type "sys/types.h sys/socket.h" "struct sockaddr_storage" check_struct "sys/types.h sys/socket.h" "struct sockaddr" sa_len check_type "sys/socket.h" "struct ucred" -D_GNU_SOURCE check_type netinet/sctp.h "struct sctp_event_subscribe" check_func getpeereid $network_extralibs check_func getaddrinfo $network_extralibs check_func getservbyport $network_extralibs # Prefer arpa/inet.h over winsock2 if check_header arpa/inet.h ; then check_func closesocket elif check_header winsock2.h ; then check_func_headers winsock2.h closesocket -lws2 && network_extralibs="-lws2" || { check_func_headers winsock2.h closesocket -lws2_32 && network_extralibs="-lws2_32"; } check_func_headers ws2tcpip.h getaddrinfo $network_extralibs check_type ws2tcpip.h socklen_t check_type ws2tcpip.h "struct addrinfo" check_type ws2tcpip.h "struct group_source_req" check_type ws2tcpip.h "struct ip_mreq_source" check_type ws2tcpip.h "struct ipv6_mreq" check_type winsock2.h "struct pollfd" check_type ws2tcpip.h "struct sockaddr_in6" check_type ws2tcpip.h "struct sockaddr_storage" check_struct winsock2.h "struct sockaddr" sa_len else die "ERROR: no usable networking implementation could be found" fi check_func accept4 check_func fork check_func gettimeofday check_func inet_aton $network_extralibs check_func_headers "sys/inotify.h" inotify_init check_func_headers "sys/inotify.h" inotify_init1 check_func mkfifo check_func pipe2 check_func strtok_r for lib in -lbsd -linet -lsocket; do check_func syslog $lib && break done disabled zlib || check_lib zlib.h zlibVersion -lz || disable zlib disabled bzlib || check_lib2 bzlib.h BZ2_bzlibVersion -lbz2 || disable bzlib check_lib math.h sin -lm && LIBM="-lm" atan2f_args=2 ldexpf_args=2 powf_args=2 for func in $MATH_FUNCS; do eval check_mathfunc $func \${${func}_args:-1} done texi2html -version > /dev/null 2>&1 && enable texi2html || disable texi2html check_header sys/soundcard.h check_header soundcard.h check_lib2 ao/ao.h ao_open_live -lao && enable libao check_lib2 alsa/asoundlib.h snd_pcm_open -lasound && enable libasound check_pkg_config roar roaraudio.h roar_simple_connect && enable libroar check_lib2 jack/jack.h jack_client_open -ljack && check_func jack_port_get_latency_range -ljack && enable libjack check_lib2 libffado/ffado.h ffado_streaming_init -lffado && enable libffado check_lib2 shout/shout.h shout_init -lshout && enable libshout check_header OpenAL/al.h && check_header OpenAL/alc.h && enable libopenal check_pkg_config libpulse-simple pulse/simple.h pa_simple_new && enable libpulse check_lib2 windows.h waveOutOpen -lwinmm && enable winmm check_lib2 FLAC/stream_encoder.h FLAC__stream_encoder_new -lFLAC && enable libflac check_lib vorbis/vorbisenc.h vorbis_info_init -lvorbisenc -lvorbis -logg && enable libvorbis check_lib lame/lame.h lame_set_VBR_quality -lmp3lame && enable libmp3lame check_lib twolame.h twolame_init -ltwolame && enable libtwolame check_lib2 "cdio/cdda.h cdio/paranoia.h" cdio_cddap_open -lcdio_paranoia -lcdio_cdda -lcdio || check_lib2 "cdio/paranoia/cdda.h cdio/paranoia/paranoia.h" cdio_cddap_open -lcdio_paranoia -lcdio_cdda -lcdio && enable libcdio_paranoia check_lib2 "cdio/cdio.h cdio/iso9660.h" iso9660_open -liso9660 -lcdio && enable libiso9660 check_pkg_config zziplib zzip/zzip.h zzip_dir_open && enable zziplib check_pkg_config curl libcurl curl/curl.h curl_global_init && enable libcurl check_pkg_config soup "libsoup/soup-uri.h libsoup/soup-session-async.h" soup_message_new && enable libsoup check_pkg_config despotify despotify.h despotify_play && enable despotify check_pkg_config yajl yajl/yajl_parse.h yajl_parse && enable libyajl check_lib samplerate.h src_new -lsamplerate && enable libsamplerate check_lib sqlite3.h sqlite3_open -lsqlite3 && enable libsqlite3 check_lib tcpd.h hosts_access -lwrap && enable libwrap enabled debug && add_cflags -g"$debuglevel" # add some useful compiler flags if supported check_cflags -Wdeclaration-after-statement check_cflags -Wall check_cflags -Wno-parentheses check_cflags -Wno-switch check_cflags -Wno-format-zero-length check_cflags -Wdisabled-optimization check_cflags -Wpointer-arith check_cflags -Wredundant-decls check_cflags -Wno-pointer-sign check_cflags -Wcast-qual check_cflags -Wwrite-strings check_cflags -Wtype-limits check_cflags -Wundef check_cflags -Wmissing-prototypes check_cflags -Wstrict-prototypes enabled extra_warnings && check_cflags -Winline # add some linker flags check_ldflags -Wl,--warn-common if [ -z "$optflags" ]; then if enabled small; then optflags=$cflags_size elif enabled optimizations; then optflags=$cflags_speed else optflags=$cflags_noopt fi fi check_optflags(){ check_cflags "$@" enabled lto && check_ldflags "$@" } if enabled lto; then test "$cc_type" != "$ld_type" && die "LTO requires same compiler and linker" check_cflags -flto check_ldflags -flto $cpuflags fi check_optflags $optflags check_optflags -fno-math-errno check_optflags -fno-signed-zeros if enabled icc; then # Just warnings, no remarks check_cflags -w1 # -wd: Disable following warnings # 144, 167, 556: -Wno-pointer-sign # 1292: attribute "foo" ignored # 1419: external declaration in primary source file # 10006: ignoring unknown option -fno-signed-zeros # 10148: ignoring unknown option -Wno-parentheses # 10156: ignoring option '-W'; no argument required check_cflags -wd144,167,556,1292,1419,10006,10148,10156 # 11030: Warning unknown option --as-needed # 10156: ignoring option '-export'; no argument required check_ldflags -wd10156,11030 # icc 11.0 and 11.1 work with ebp_available, but don't pass the test enable ebp_available if enabled x86_32; then icc_version=$($cc -dumpversion) test ${icc_version%%.*} -ge 11 && check_cflags -falign-stack=maintain-16-byte || disable aligned_stack fi elif enabled ccc; then # disable some annoying warnings add_cflags -msg_disable bitnotint add_cflags -msg_disable mixfuncvoid add_cflags -msg_disable nonstandcast add_cflags -msg_disable unsupieee elif enabled gcc; then check_optflags -fno-tree-vectorize check_cflags -Werror=implicit-function-declaration check_cflags -Werror=missing-prototypes check_cflags -Werror=return-type #FIXME check_cflags -Werror=declaration-after-statement #FIXME check_cflags -Werror=vla elif enabled llvm_gcc; then check_cflags -mllvm -stack-alignment=16 elif enabled clang; then check_cflags -mllvm -stack-alignment=16 check_cflags -Qunused-arguments check_cflags -Werror=implicit-function-declaration check_cflags -Werror=missing-prototypes check_cflags -Werror=return-type elif enabled armcc; then # 2523: use of inline assembler is deprecated add_cflags -W${armcc_opt},--diag_suppress=2523 add_cflags -W${armcc_opt},--diag_suppress=1207 add_cflags -W${armcc_opt},--diag_suppress=1293 # assignment in condition add_cflags -W${armcc_opt},--diag_suppress=3343 # hardfp compat add_cflags -W${armcc_opt},--diag_suppress=167 # pointer sign add_cflags -W${armcc_opt},--diag_suppress=513 # pointer sign elif enabled tms470; then add_cflags -pds=824 -pds=837 elif enabled pathscale; then add_cflags -fstrict-overflow -OPT:wrap_around_unsafe_opt=OFF elif enabled msvc; then enabled x86_32 && disable aligned_stack fi case $target_os in osf1) enabled ccc && add_ldflags '-Wl,-expect_unresolved,*' ;; plan9) add_cppflags -Dmain=plan9_main ;; esac enabled ud && { enabled struct_ucred || enabled getpeereid || die "ERROR: cannot enable Unix domain sockets"; } enabled inotify && enabled inotify_init || die "ERROR: inotify_init() not found" enabled asm || { arch=c; disable $ARCH_LIST $ARCH_EXT_LIST; } check_deps $CONFIG_LIST \ $CONFIG_EXTRA \ $HAVE_LIST \ $ALL_COMPONENTS \ echo "install prefix $prefix" echo "source path $source_path" echo "C compiler $cc" echo "ARCH $arch ($cpu)" if test "$build_suffix" != ""; then echo "build suffix $build_suffix" fi if test "$extra_version" != ""; then echo "version string suffix $extra_version" fi echo "debug symbols ${debug-no}" echo "optimize for size ${small-no}" echo "optimizations ${optimizations-no}" echo "Unix domain sockets ${ud-no}" echo "Inotify DB updates ${inotify-no}" echo "External libraries:" print_enabled '' $EXTERNAL_LIBRARY_LIST | print_3_columns echo for type in encoder input output archive; do echo "Enabled ${type}s:" eval list=\$$(toupper $type)_LIST print_enabled '_*' $list | print_3_columns echo done echo "Creating config.mak and config.h..." test -e Makefile || $ln_s "$source_path/Makefile" . config_files="$TMPH config.mak" cat > config.mak < $TMPH <>$TMPH print_config ARCH_ "$config_files" $ARCH_LIST print_config HAVE_ "$config_files" $HAVE_LIST print_config CONFIG_ "$config_files" $CONFIG_LIST \ $CONFIG_EXTRA \ $ALL_COMPONENTS \ echo "#endif /* MPD_CONFIG_H */" >> $TMPH # Do not overwrite an unchanged config.h to avoid superfluous rebuilds. cp_if_changed $TMPH config.h touch .config test -n "$WARNINGS" && printf "\n$WARNINGS"