dnl Process this file with autoconf to produce a configure script. AC_PREREQ(2.13) AC_INIT(qw/source/sv_main.c) AC_REVISION($Revision$) dnl AM_CONFIG_HEADER(include/config.h) AC_CANONICAL_SYSTEM AC_VALIDATE_CACHED_SYSTEM_TUPLE( rm $cache_file echo restart configure exit 1 ) dnl This is the only place where the package version appears AM_INIT_AUTOMAKE(quakeforge, 0.5.1) dnl Define the proper name and extra version numbers for package PROGRAM=QuakeForge NQ_VERSION=1.09 NQ_QSG_VERSION=1.0 QW_VERSION=2.40 QW_QSG_VERSION=2.0 AC_DEFINE_UNQUOTED(PROGRAM, "$PROGRAM") AC_DEFINE_UNQUOTED(NQ_VERSION, "$NQ_VERSION") AC_DEFINE_UNQUOTED(NQ_QSG_VERSION, "$NQ_QSG_VERSION") AC_DEFINE_UNQUOTED(QW_VERSION, "$QW_VERSION") AC_DEFINE_UNQUOTED(QW_QSG_VERSION, "$QW_QSG_VERSION") AC_SUBST(PROGRAM) AC_SUBST(NQ_VERSION) AC_SUBST(NQ_QSG_VERSION) AC_SUBST(QW_VERSION) AC_SUBST(QW_QSG_VERSION) ISODATE=`date +%Y-%m-%d` AC_SUBST(ISODATE) AC_LANG_C endian="" case "$host_os" in mingw32*) mingw=yes CPPFLAGS="$CPPFLAGS -I\$(top_srcdir)/include/win32" CPPFLAGS="$CPPFLAGS -I\$(top_srcdir)/include/win32/resources" if test $host != $build; then CC=$host_cpu-$host_os-gcc endian="little" fi ;; esac dnl ================================================================== dnl Checks for programs. dnl ================================================================== AC_PROG_INSTALL AC_PROG_CC AC_PROG_CPP AC_PROG_LN_S AM_PROG_LIBTOOL AM_PROG_LEX AC_PROG_YACC AC_CHECK_LIB(l, main, LEXLIB="-ll", AC_CHECK_LIB(fl, main, LEXLIB="-lfl")) AC_SUBST(LEXLIB) set $CC if test "$1" = gcc; then shift args="$*" AC_MSG_CHECKING(for gcc version) CCVER="gcc `gcc --version`" AC_MSG_RESULT($CCVER) fi dnl ================================================================== dnl Checks for system services dnl ================================================================== AC_SYS_LONG_FILE_NAMES AC_EXEEXT AC_OBJEXT dnl ================================================================== dnl Checks for header files. dnl ================================================================== AC_HEADER_DIRENT AC_HEADER_STDC AC_HEADER_MAJOR AC_HEADER_SYS_WAIT AC_CHECK_HEADERS( arpa/inet.h asm/io.h assert.h conio.h ctype.h curses.h ddraw.h dinput.h \ direct.h dirent.h dlfcn.h dmedia/audio.h dmedia/cdaudio.h dpmi.h \ dsound.h errno.h fcntl.h fnmatch.h glide/sst1vid.h io.h \ libc.h limits.h linux/cdrom.h linux/joystick.h linux/soundcard.h \ machine/soundcard.h malloc.h math.h mgraph.h _mingw.h netdb.h \ netinet/in.h pwd.h rpc/types.h setjmp.h signal.h stdarg.h stdio.h \ stdlib.h string.h strings.h sys/asoundlib.h sys/audioio.h sys/filio.h \ sys/ioctl.h sys/io.h sys/ipc.h sys/mman.h sys/param.h sys/poll.h \ sys/shm.h sys/signal.h sys/socket.h sys/soundcard.h sys/stat.h \ sys/time.h sys/types.h sys/wait.h time.h unistd.h vga.h \ vgakeyboard.h vgamouse.h windows.h winsock.h zlib.h ) if test "x$mingw" = xyes; then AC_MSG_CHECKING(for fnmatch.h) AC_MSG_RESULT(yes) AC_DEFINE(HAVE_FNMATCH_H) else AC_CHECK_HEADERS(fnmatch.h) fi dnl ================================================================== dnl Checks for typedefs, structures, and compiler characteristics dnl ================================================================== AC_C_CONST AC_C_INLINE AC_TYPE_SIZE_T AC_STRUCT_ST_BLKSIZE AC_HEADER_TIME AC_STRUCT_TM if test "x$cross_compiling" = xyes; then AC_MSG_CHECKING(whether byte ordering is bigendian) AC_ARG_WITH(endian, [ --with-endian=TYPE set endian of target system for cross-compiling. TYPE = little or big.], endian="$withval", ) case "x$endian" in xbig) AC_DEFINE(WORDS_BIGENDIAN) AC_MSG_RESULT(yes) ;; xlittle) AC_MSG_RESULT(no) ;; x) AC_MSG_RESULT(unspecified, use --with-endian={big,little}) exit 1 ;; x*) AC_MSG_RESULT(unrecognized endianness) exit 1 ;; esac else AC_C_BIGENDIAN fi AC_CHECK_FUNCS(usleep) AC_MSG_CHECKING(for fnmatch) AC_TRY_LINK( [], [fnmatch();], BUILD_FNMATCH=no AC_MSG_RESULT(yes), BUILD_FNMATCH=yes AC_MSG_RESULT(no) ) AM_CONDITIONAL(BUILD_FNMATCH, test "$BUILD_FNMATCH" = "yes") AC_MSG_CHECKING(for fnmatch in fnmatch.h) AC_TRY_COMPILE( [#include "fnmatch.h"], [int (*foo)() = fnmatch;], AC_DEFINE(HAVE_FNMATCH_PROTO) AC_MSG_RESULT(yes), AC_MSG_RESULT(no) ) AC_MSG_CHECKING(for type of fpos_t) AC_TRY_COMPILE( [#include ], [fpos_t x = 0], AC_MSG_RESULT(off_t), AC_DEFINE(HAVE_FPOS_T_STRUCT) AC_MSG_RESULT(struct) ) AC_MSG_CHECKING(for socklen_t in sys/types.h) AC_TRY_COMPILE( [#include ], [ socklen_t x = 0;], AC_DEFINE(HAVE_SOCKLEN_T) AC_MSG_RESULT(yes), AC_MSG_RESULT(no) dnl FreeBSD 4.0 has it in sys/socket.h AC_MSG_CHECKING(for socklen_t in sys/socket.h) AC_TRY_COMPILE( [#include #include ], [ socklen_t x = 0;], AC_DEFINE(HAVE_SOCKLEN_T) AC_MSG_RESULT(yes), AC_MSG_RESULT(no) ) ) AC_MSG_CHECKING(for underscore prefix in names) AC_TRY_LINK( [asm(".long _bar"); int bar;], [], AC_DEFINE(HAVE_SYM_PREFIX_UNDERSCORE) AC_MSG_RESULT(yes), AC_MSG_RESULT(no) ) AC_MSG_CHECKING(for size_t in sys/types.h) AC_TRY_COMPILE( [#include ], [ size_t x = 0;], AC_DEFINE(HAVE_SIZE_T) AC_MSG_RESULT(yes), AC_MSG_RESULT(no) ) dnl maybe these two (at least the 2nd) should only be checked if ipv6 is enabled? AC_MSG_CHECKING(for ss_len in struct sockaddr_storage) AC_TRY_COMPILE( [#include #include ], [ void f(void) { struct sockaddr_storage ss; ss.ss_len=0; }], AC_DEFINE(HAVE_SS_LEN) AC_MSG_RESULT(yes), AC_MSG_RESULT(no) ) AC_MSG_CHECKING(for sin6_len in struct sockaddr_in6) AC_TRY_COMPILE( [#include #include ], [ void f(void) { struct sockaddr_in6 s6; s6.sin6_len=0; }], AC_DEFINE(HAVE_SIN6_LEN) AC_MSG_RESULT(yes), AC_MSG_RESULT(no) ) AC_MSG_CHECKING(for sa_len in struct sockaddr) AC_TRY_COMPILE( [#include #include ], [ void f(void) { struct sockaddr sa; sa.sa_len=0; }], AC_DEFINE(HAVE_SA_LEN) AC_MSG_RESULT(yes), AC_MSG_RESULT(no) ) dnl ================================================================== dnl Checks for library functions. dnl ================================================================== AC_FUNC_ALLOCA AC_FUNC_MEMCMP AC_FUNC_MMAP AC_TYPE_SIGNAL AC_FUNC_VPRINTF AC_CHECK_FUNCS( access _access \ gethostname gethostbyname connect gettimeofday getwd mkdir _mkdir \ ftime _ftime fcntl stat putenv select socket strerror strstr \ snprintf _snprintf vsnprintf _vsnprintf strsep dlopen getaddrinfo \ getnameinfo mprotect ) DL_LIBS="" if test "x$ac_cv_func_dlopen" != "xyes"; then AC_CHECK_LIB(dl, dlopen, AC_DEFINE(HAVE_DLOPEN) DL_LIBS="-ldl" ) fi AC_SUBST(DL_LIBS) AC_CHECK_LIB(ncurses, initscr, CURSES_LIBS=-lncurses, AC_CHECK_LIB(curses, initscr, CURSES_LIBS=-ncurses, CURSES_LIBS= ) ) AC_SUBST(CURSES_LIBS) dnl Checks for stricmp/strcasecmp #AC_CHECK_FUNC(strcasecmp, # , # AC_CHECK_FUNC(stricmp, # AC_DEFINE(strcasecmp, stricmp) # ) #) AC_CHECK_FUNC(strcasecmp, strcasecmp=yes, strcasecmp=no) if test $strcasecmp = no; then AC_CHECK_FUNC(stricmp, AC_DEFINE(strcasecmp, stricmp), AC_MSG_ERROR([Neither stricmp nor strcasecmp found]) ) fi dnl Check for vsnprintf if test "x$ac_cv_func_vsnprintf" = "xno" -a \ "x$ac_cv_func__vsnprintf" = "xno"; then dnl libdb may have this AC_CHECK_LIB(db,vsnprintf) fi dnl Checks for working -lm AC_CHECK_LIB(m, pow,, AC_MSG_ERROR([math library (-lm) appears broken])) AC_ARG_ENABLE(zlib, [ --disable-zlib disable zlib support], ) if test "x$enable_zlib" != "xno"; then dnl Check for working -lz dnl Note - must have gztell *and* gzgets in -lz *and* zlib.h AC_CHECK_LIB(z, gztell, HAVE_ZLIB=yes, HAVE_ZLIB=no, [$LIBS]) if test "x$HAVE_ZLIB" = "xyes"; then AC_CHECK_LIB(z, gzgets, HAVE_ZLIB=yes, HAVE_ZLIB=no, [$LIBS]) if test "x$HAVE_ZLIB" = "xyes"; then AC_CHECK_HEADER(zlib.h, HAVE_ZLIB=yes, HAVE_ZLIB=no) if test "x$HAVE_ZLIB" = "xyes"; then Z_LIBS="-lz" AC_DEFINE(HAVE_ZLIB) fi fi fi fi AC_ARG_WITH(ipv6, [ --with-ipv6[=DIR] enable IPv6 support. Optional argument specifies location of inet6 libraries.], if test "x$withval" = xno ; then NETTYPE_IPV6=no else AC_DEFINE(HAVE_IPV6) NETTYPE_IPV6=yes if test "x$withval" != xyes ; then LIBS="$LIBS -L${withval}" fi fi , NETTYPE_IPV6=no ) AM_CONDITIONAL(NETTYPE_IPV6, test "x$NETTYPE_IPV6" = "xyes") dnl Checks for MGL support AC_ARG_WITH(mgl, [ --with-mgl[=DIR] use MGL found in DIR], HAVE_MGL=$withval, HAVE_MGL=auto) if test "x$HAVE_MGL" != xno; then if test "x$ac_cv_header_windows_h" != "xyes"; then HAVE_MGL=no else if test "x$HAVE_MGL" != xauto; then MGL_CFLAGS="$MGL_CFLAGS -I$withval/include" MGL_LIBS="$MGL_LIBS -L$withval/lib" fi save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $MGL_CFLAGS" AC_CHECK_HEADER(mgraph.h, HAVE_MGL=yes, HAVE_MGL=no) CPPFLAGS="$save_CPPFLAGS" dnl Make sure -lmgllt or -lmglfx works if test "x$HAVE_MGL" = xyes; then for lib in mglfx mgllt; do MGL_LIBS="$MGL_LIBS -lgdi32 -lwinmm -ldinput -lddraw" AC_CHECK_LIB($lib, MGL_registerDriver, MGL_LIBS="-l$lib $MGL_LIBS" HAVE_MGL=yes break, HAVE_MGL=no, [$MGL_LIBS] ) done fi fi if test "x$HAVE_MGL" != xyes; then MGL_CFLAGS="" MGL_LIBS="" fi fi AC_SUBST(HAVE_MGL) AC_SUBST(MGL_CFLAGS) AC_SUBST(MGL_LIBS) dnl Checks for Linux FBDev support AC_ARG_WITH(fbdev, [ --with-fbdev use Linux framebuffer device], HAVE_FBDEV=$withval, HAVE_FBDEV=auto) if test "x$HAVE_FBDEV" = xyes; then dnl We should still be able to compile it even if dnl there is no fbdev support in the running kernel AC_CHECK_HEADERS(linux/fb.h, HAVE_FBDEV=yes, HAVE_FBDEV=no) fi AC_SUBST(HAVE_FBDEV) if test "x$HAVE_FBDEV" = xyes; then AC_MSG_CHECKING(for FB_AUX_VGA_PLANES_VGA4) AC_TRY_COMPILE( [#include "linux/fb.h"], [int foo = FB_AUX_VGA_PLANES_VGA4;], AC_DEFINE(HAVE_FB_AUX_VGA_PLANES_VGA4) AC_MSG_RESULT(yes), AC_MSG_RESULT(no) ) AC_MSG_CHECKING(for FB_AUX_VGA_PLANES_CFB4) AC_TRY_COMPILE( [#include "linux/fb.h"], [int foo = FB_AUX_VGA_PLANES_CFB4;], AC_DEFINE(HAVE_FB_AUX_VGA_PLANES_CFB4) AC_MSG_RESULT(yes), AC_MSG_RESULT(no) ) AC_MSG_CHECKING(for FB_AUX_VGA_PLANES_CFB8) AC_TRY_COMPILE( [#include "linux/fb.h"], [int foo = FB_AUX_VGA_PLANES_CFB8;], AC_DEFINE(HAVE_FB_AUX_VGA_PLANES_CFB8) AC_MSG_RESULT(yes), AC_MSG_RESULT(no) ) fi dnl Checks for SVGALib support AC_ARG_WITH(svga, [ --with-svga[=DIR] use SVGALib found in DIR], HAVE_SVGA=$withval, HAVE_SVGA=auto) if test "x$HAVE_SVGA" != xno; then if test "x$HAVE_SVGA" != xauto; then SVGA_CFLAGS="$SVGA_CFLAGS -I$withval/include" SVGA_LIBS="$SVGA_LIBS -L$withval/lib" dnl The default system location is /usr/include or /usr/local/include dnl and we (obviously) do not need to set CFLAGS for that fi save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $SVGA_CFLAGS" AC_CHECK_HEADER(vga.h, HAVE_SVGA=yes, HAVE_SVGA=no) CPPFLAGS="$save_CPPFLAGS" dnl Make sure -lvga works if test "x$HAVE_SVGA" = xyes; then AC_CHECK_LIB(vga, vga_getmousetype, SVGA_LIBS="$SVGA_LIBS -lvga" HAVE_SVGA=yes, HAVE_SVGA=no, [$SVGA_LIBS] ) fi if test "x$HAVE_SVGA" != xyes; then SVGA_CFLAGS="" SVGA_LIBS="" fi fi AC_SUBST(HAVE_SVGA) AC_SUBST(SVGA_CFLAGS) AC_SUBST(SVGA_LIBS) dnl Checks for X11 and XShm if test "x$mingw" != xyes; then AC_PATH_XTRA if test "x$no_x" = x; then HAVE_X=yes AC_CHECK_LIB(Xext, XShmQueryExtension, X_SHM_LIB=-lXext, HAVE_X=no, [ $X_LIBS -lX11 $X_EXTRA_LIBS ] ) fi AC_SUBST(X_SHM_LIB) fi dnl Check for XFree86-VidMode support AC_ARG_ENABLE(vidmode, [ --enable-vidmode use XFree86 VidMode extension, if available], HAVE_VIDMODE=$enable_vidmode, HAVE_VIDMODE=auto) if test "x$HAVE_VIDMODE" != xno; then save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$X_CFLAGS $CPPFLAGS" AC_CHECK_HEADER(X11/extensions/xf86vmode.h, dnl Make sure the library works AC_CHECK_LIB(Xxf86vm, XF86VidModeSwitchToMode, AC_DEFINE(HAVE_VIDMODE) VIDMODE_LIBS="-lXxf86vm",, [$X_LIBS -lXext -lX11 $X_EXTRA_LIBS] ) ) CPPFLAGS="$save_CPPFLAGS" fi AC_SUBST(VIDMODE_LIBS) dnl Check for DGA support AC_ARG_ENABLE(dga, [ --enable-dga use XFree86 DGA extension, if available], HAVE_DGA=$enable_dga, HAVE_DGA=auto) if test "x$HAVE_DGA" != xno; then save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$X_CFLAGS $CPPFLAGS" AC_CHECK_HEADER(X11/extensions/xf86dga.h, dnl Make sure the library works AC_CHECK_LIB(Xxf86dga, XF86DGAQueryVersion, AC_DEFINE(HAVE_DGA) DGA_LIBS="-lXxf86dga",, [$X_LIBS -lXext -lX11 $X_EXTRA_LIBS] ) ) CPPFLAGS="$save_CPPFLAGS" fi AC_SUBST(DGA_LIBS) dnl Checks for GLIDE support AC_ARG_WITH(glide, [ --with-glide=DIR use the GLIDE 2.x SDK found in DIR], HAVE_GLIDE=$withval, HAVE_GLIDE=auto) if test "x$HAVE_GLIDE" != xno; then AC_CHECK_LIB(glide, grGammaCorrectionValue, GLIDE_LIBS="-lglide", AC_CHECK_LIB(glide2x, grGammaCorrectionValue, GLIDE_LIBS="-lglide2x",GLIDE_LIBS="")) if test "x$HAVE_GLIDE" != xauto; then GLIDE_CFLAGS="$GLIDE_CFLAGS -I$withval/include" GLIDE_LIBS="$GLIDE_LIBS -L$withval/lib" else GLIDE_CFLAGS="$GLIDE_CFLAGS -I/usr/include/glide -I/usr/local/include/glide" fi save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $GLIDE_CFLAGS" AC_CHECK_HEADER(glide.h, HAVE_GLIDE=yes, HAVE_GLIDE=no) if test "x$HAVE_GLIDE" != xyes; then HAVE_GLIDE=no else AC_DEFINE(HAVE_GLIDE) fi CPPFLAGS="$save_CPPFLAGS" fi AC_SUBST(GLIDE_CFLAGS) AC_SUBST(GLIDE_LIBS) dnl SDL/SDL-GL checks AC_ARG_ENABLE(sdl, [ --disable-sdl disable checking for SDL], ) if test "x$enable_sdl" != xno; then AM_PATH_SDL(1.0.1, HAVE_SDL=yes, HAVE_SDL=no) if test "x$HAVE_SDL" != xno; then AM_CHECK_SGL(1.1.1, HAVE_SGL=yes, HAVE_SGL=no) fi AC_SUBST(HAVE_SDL) AC_SUBST(HAVE_SGL) fi dnl ================================================================== dnl Checks for system type dnl ================================================================== dnl Checks for which system driver to use AC_MSG_CHECKING(for system driver) case "${host}" in i?86-*-mingw32*) SYSTYPE=WIN32 AC_MSG_RESULT([Win32 driver]) ;; *) SYSTYPE=POSIX AC_MSG_RESULT([default POSIX driver]) ;; esac AM_CONDITIONAL(SYSTYPE_WIN32, test "$SYSTYPE" = "WIN32") dnl Check for ia32 AC_MSG_CHECKING(for an ia32 machine) case "${host}" in i?86-*-*) AC_MSG_RESULT(yes) AC_MSG_CHECKING(to see if we should disable asm optimizations) AC_ARG_ENABLE(asmopt, [ --disable-asmopt disable assembler optimization], AC_MSG_RESULT(yes), AC_DEFINE(USE_INTEL_ASM) ASM_ARCH=yes AC_MSG_RESULT(no) ) ;; *) AC_MSG_RESULT(no) esac AM_CONDITIONAL(ASM_ARCH, test "$ASM_ARCH" = "yes") dnl ================================================================== dnl Checks for sound dnl ================================================================== AC_CHECK_LIB(mme, waveOutOpen, HAVE_LIBMME=yes) AC_ARG_ENABLE(alsa, [ --disable-alsa disable checks for ALSA support]) AC_ARG_ENABLE(sound, [ --disable-sound disable sound outright] ) SOUND_TYPES= AC_MSG_CHECKING(for sound support) if test "x$enable_alsa" != "xno" -a \ "x$ac_cv_header_sys_asoundlib_h" = "xyes"; then AC_EGREP_CPP([QF_maGiC_VALUE], [ #include #if defined(SND_LIB_MAJOR) && defined(SND_LIB_MINOR) #if SND_LIB_MAJOR > 0 || (SND_LIB_MAJOR == 0 && SND_LIB_MINOR == 5) QF_maGiC_VALUE #endif #endif ], SOUND_TYPES="$SOUND_TYPES ALSA0.5" ALSA_LIBS="-lasound", AC_EGREP_CPP([QF_maGiC_VALUE], [ #include #if defined(SND_LIB_MAJOR) && defined(SND_LIB_MINOR) #if SND_LIB_MAJOR > 0 || (SND_LIB_MAJOR == 0 && SND_LIB_MINOR >= 9) QF_maGiC_VALUE #endif #endif ], SOUND_TYPES="$SOUND_TYPES ALSA0.9" ALSA_LIBS="-lasound" ) ) fi AC_SUBST(ALSA_LIBS) dnl MME if test "x$ac_cv_header_mme_mmsystem_h" = "xyes" -a \ "x$HAVE_LIBMME" = "xyes"; then AC_EGREP_CPP([QF_maGiC_VALUE], [ #include #ifdef WAVE_OPEN_SHAREABLE QF_maGiC_VALUE #endif ], SOUND_TYPES="$SOUND_TYPES MME" MME_LIBS="-lmme" ) fi AC_SUBST(MME_LIBS) dnl OSS if test "x$ac_cv_header_sys_soundcard_h" = "xyes" -o \ "x$ac_cv_header_machine_soundcard_h" = "xyes" -o \ "x$ac_cv_header_linux_soundcard_h" = "xyes"; then AC_EGREP_CPP([QF_maGiC_VALUE], [ #include #ifdef SNDCTL_DSP_SETTRIGGER QF_maGiC_VALUE #endif ], SOUND_TYPES="$SOUND_TYPES OSS", AC_EGREP_CPP([QF_maGiC_VALUE], [ #include #ifdef SNDCTL_DSP_SETTRIGGER QF_maGiC_VALUE #endif ], SOUND_TYPES="$SOUND_TYPES OSS", AC_EGREP_CPP([QF_maGiC_VALUE], [ #include #ifdef SNDCTL_DSP_SETTRIGGER QF_maGiC_VALUE #endif ], SOUND_TYPES="$SOUND_TYPES OSS" ) ) ) fi dnl SDL digital audio if test "x$HAVE_SDL" = "xyes"; then SOUND_TYPES="$SOUND_TYPES SDL" fi dnl SGI if test "x$ac_cv_header_dmedia_audio_h" = "xyes"; then AC_EGREP_CPP([QF_maGiC_VALUE], [ #include #ifdef AL_SAMPLE_16 # ifdef AL_RATE QF_maGiC_VALUE # endif #endif ], SOUND_TYPES="$SOUND_TYPES SGI" SGISND_LIBS="-laudio") fi AC_SUBST(SGISND_LIBS) dnl Sun if test "x$ac_cv_header_sys_audioio_h" = "xyes"; then AC_EGREP_CPP([QF_maGiC_VALUE], [ #include #ifdef AUDIO_SETINFO QF_maGiC_VALUE #endif ], SOUND_TYPES="$SOUND_TYPES SUN" ) fi dnl Win32 if test "x$ac_cv_header_windows_h" = "xyes" -a \ "x$ac_cv_header_dsound_h" = "xyes"; then AC_EGREP_CPP([QF_maGiC_VALUE], [ #include #include #ifdef GMEM_MOVEABLE # ifdef DirectSoundEnumerate QF_maGiC_VALUE # endif #endif ], SOUND_TYPES="$SOUND_TYPES Win32" WINSND_LIBS="-lwinmm" ) fi AC_SUBST(WINSND_LIBS) if test "x$enable_sound" = "xno"; then SOUND_TYPES="" fi AM_CONDITIONAL(HAVE_SND_ALSA_0_5, test "`echo $SOUND_TYPES | grep ALSA0.5`") AM_CONDITIONAL(HAVE_SND_ALSA_0_9, test "`echo $SOUND_TYPES | grep ALSA0.9`") AM_CONDITIONAL(HAVE_SND_MME, test "`echo $SOUND_TYPES | grep MME`") AM_CONDITIONAL(HAVE_SND_OSS, test "`echo $SOUND_TYPES | grep OSS`") AM_CONDITIONAL(HAVE_SND_SDL, test "`echo $SOUND_TYPES | grep SDL`") AM_CONDITIONAL(HAVE_SND_SGI, test "`echo $SOUND_TYPES | grep SGI`") AM_CONDITIONAL(HAVE_SND_SUN, test "`echo $SOUND_TYPES | grep SUN`") AM_CONDITIONAL(HAVE_SND_WIN32, test "`echo $SOUND_TYPES | grep Win32`") if test "$SOUND_TYPES"; then AC_MSG_RESULT([$SOUND_TYPES]) else AC_MSG_RESULT([no, using null sound driver]) fi dnl Tests for joystick support AC_MSG_CHECKING(for joystick support) if test -z "$JOYTYPE" -a "x$ac_cv_header_linux_joystick_h" = "xyes"; then AC_EGREP_CPP([QF_maGiC_VALUE],[ #include #ifdef JS_VERSION QF_maGiC_VALUE #endif ], JOYTYPE="Linux") fi if test -z "$JOYTYPE" -a "x$ac_cv_header_dinput_h" = "xyes"; then JOYTYPE="Win32" fi if test "$JOYTYPE"; then AC_MSG_RESULT([yes ($JOYTYPE)]) else AC_MSG_RESULT([no, using null joystick driver]) fi AC_SUBST(JOY_LIBS) AC_SUBST(JOY_CFLAGS) AM_CONDITIONAL(JOYTYPE_LINUX, test "$JOYTYPE" = "Linux") AM_CONDITIONAL(JOYTYPE_WIN32, test "$JOYTYPE" = "Win32") AM_CONDITIONAL(JOYTYPE_NULL, test "$JOYTYPE" != "Linux" -a "$JOYTYPE" != "Win32") dnl ================================================================== dnl Checks for CD-ROM dnl ================================================================== CD_CFLAGS="" CD_PLUGIN_TARGETS="libcd_null.la" CDTYPE="" AC_MSG_CHECKING(for CD audio support) dnl Linux AC_EGREP_CPP([QF_maGiC_VALUE], [ #include #ifdef CDROMREADTOCENTRY QF_maGiC_VALUE #endif ], AC_MSG_RESULT([yes (Linux)]) CDTYPE="$CDTYPE LINUX" CD_PLUGIN_TARGETS="$CD_PLUGIN_TARGETS libcd_linux.la" ) dnl SDL CD audio if test "x$HAVE_SDL" = "xyes"; then AC_MSG_RESULT([yes (SDL)]) CDTYPE="$CDTYPE SDL" CD_PLUGIN_TARGETS="$CD_PLUGIN_TARGETS libcd_sdl.la" fi dnl SGI AC_EGREP_CPP([QF_maGiC_VALUE], [ #include #ifdef CD_READY QF_maGiC_VALUE #endif ], AC_MSG_RESULT([yes (SGI)]) CDTYPE="$CDTYPE SGI" CD_PLUGIN_TARGETS="$CD_PLUGIN_TARGETS libcd_sgi.la" SGI_CD_LIBS="-lcdaudio -lmediad -lds" ) AC_EGREP_CPP([QF_maGiC_VALUE], [ #include #include #if defined(MCI_SET_DOOR_OPEN) QF_maGiC_VALUE #endif ], AC_MSG_RESULT([yes (Win32)]) CDTYPE="$CDTYPE WIN32" CD_PLUGIN_TARGETS="$CD_PLUGIN_TARGETS libcd_win.la" ) AC_SUBST(CD_LIBS) AC_SUBST(CD_CFLAGS) dnl ================================================================== dnl Checks for networking dnl ================================================================== if test "x$ac_cv_func_connect" != "xyes"; then AC_CHECK_LIB(socket, connect, NET_LIBS="$NET_LIBS -lsocket" ac_cv_func_connect=yes ) fi if test "x$ac_cv_func_gethostbyname" != "xyes"; then AC_CHECK_LIB(nsl, gethostbyname, NET_LIBS="$NET_LIBS -lnsl" ac_cv_func_gethostbyname=yes ) fi AC_MSG_CHECKING([for connect in -lwsock32]) SAVELIBS="$LIBS" LIBS="$LIBS -lwsock32" AC_TRY_LINK([ #include ],[ connect(0, NULL, 42); ], NET_LIBS="$NET_LIBS -lwsock32 -lwinmm" ac_cv_func_connect=yes ac_cv_func_gethostbyname=yes HAVE_WSOCK=yes AC_MSG_RESULT(yes), AC_MSG_RESULT(no) ) LIBS="$SAVELIBS" AC_MSG_CHECKING(for UDP support) if test "x$ac_cv_func_connect" = "xyes" -a "x$ac_cv_func_gethostbyname" = "xyes"; then HAVE_UDP=yes AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) fi if test "x$ac_cv_func_connect" != "xyes"; then AC_MSG_CHECKING([for connect in -lwsock32]) SAVELIBS="$LIBS" LIBS="$LIBS -lwsock32" AC_TRY_LINK([ #include ],[ connect(0, NULL, 42); ], NET_LIBS="$NET_LIBS -lwsock32 -lwinmm" AC_MSG_RESULT(yes), AC_MSG_RESULT(no) ) LIBS="$SAVELIBS" fi AC_SUBST(NET_LIBS) dnl ================================================================== dnl Misc checks dnl ================================================================== dnl Set $prefix and $exec_prefix to $ac_default_prefix if they are not set test "x$prefix" = xNONE && prefix=$ac_default_prefix test "x$exec_prefix" = xNONE && exec_prefix="${prefix}" if test "x$SYSTYPE" = xWIN32; then default_globalconf="~/${PACKAGE}.conf" default_userconf="~/${PACKAGE}rc" default_sharepath="." default_userpath="." else default_globalconf="/etc/${PACKAGE}.conf" default_userconf="~/.${PACKAGE}rc" eval foo="$datadir" default_sharepath="$foo/games/$PACKAGE" default_userpath="~/.$PACKAGE" fi AC_ARG_WITH(global-cfg, [ --with-global-cfg=FILE If set will change the name and location of the global config file used by QuakeForge. Defaults to /etc/quakeforge.conf.], globalconf="$withval", globalconf="auto") if test "x$globalconf" = "xauto" || test "x$globalconf" = "xyes" || \ test "x$globalconf" = "xno"; then dnl yes/no sanity checks globalconf="$default_globalconf" fi AC_DEFINE_UNQUOTED(FS_GLOBALCFG, "$globalconf") AC_ARG_WITH(user-cfg, [ --with-user-cfg=FILE If set will change the name and location of the global config file used by QuakeForge. Defaults to /etc/quakeforge.conf.], globalconf="$withval", userconf="auto") if test "x$userconf" = "xauto" || test "x$userconf" = "xyes" || \ test "x$userconf" = "xno"; then dnl yes/no sanity checks userconf="$default_userconf" fi AC_DEFINE_UNQUOTED(FS_USERCFG, "$userconf") AC_ARG_WITH(sharepath, [ --with-sharepath=DIR Use DIR for shared game data, defaults to '.' or \${datadir}/games/quakeforge (if new style)], sharepath=$withval, sharepath="auto") if test "x$sharepath" = "xauto" -o "x$sharepath" = "xyes" -o "x$sharepath" = "x"; then sharepath="$default_sharepath" elif test "x$sharepath" = xno; then sharepath="." fi AC_DEFINE_UNQUOTED(FS_SHAREPATH, "$sharepath") AC_ARG_WITH(userpath, [ --with-userpath=DIR Use DIR for unshared game data, defaults to '.' or ~/.quakeforge (if new style)], userpath=$withval, userpath="auto") if test "x$userpath" = "xauto" -o "x$userpath" = "xyes" -o "x$userpath" = "x"; then userpath="$default_userpath" elif test "x$userpath" = xno; then userpath="." fi AC_DEFINE_UNQUOTED(FS_USERPATH, "$userpath") AC_ARG_WITH(plugin-path, [ --with-plugin-path=DIR Use DIR for loading plugins, defaults to \${libdir}/quakeforge], pluginpath=$withval, pluginpath="auto") PLUGINDIR="$libdir/$PACKAGE" if test "x$pluginpath" = "xauto" -o "x$pluginpath" = "xyes" -o "x$pluginpath" = "x"; then eval pluginpath="$PLUGINDIR" elif test "x$pluginpath" = xno; then pluginpath="." else PLUGINDIR=$pluginpath eval pluginpath="$PLUGINDIR" fi AC_DEFINE_UNQUOTED(FS_PLUGINPATH, "$pluginpath") AC_SUBST(pluginpath) AC_SUBST(PLUGINDIR) dnl CFLAGS for release and devel versions CFLAGS="" AC_ARG_ENABLE(debug, [ --enable-debug compile with debugging (for development)], debug=$enable_debug ) AC_MSG_CHECKING(for debugging) if test "x$debug" = xyes; then AC_MSG_RESULT(yes) BUILD_TYPE="$BUILD_TYPE Debug" CFLAGS="$CFLAGS -g" else AC_MSG_RESULT(no) fi AC_ARG_ENABLE(optimize, [ --disable-optimize compile without optimizations (for development)], optimize=$disable_optimize, optimize=yes ) AC_ARG_ENABLE(typecheck-progs, [ --disable-typecheck-progs disable type checking on progs field access]) if test "x$enable_typecheck_progs" != xno; then AC_DEFINE(TYPECHECK_PROGS) fi AC_ARG_WITH(amd, [ --with-amd Optimize for AMD processors instead of Intel], HAVE_AMD="yes", HAVE_AMD="no" ) AC_MSG_CHECKING(for optimization) if test "x$optimize" = xyes; then AC_MSG_RESULT(yes) BUILD_TYPE="$BUILD_TYPE Optimize" if test "x$GCC" = xyes; then CFLAGS="$CFLAGS -O3 -ffast-math -funroll-loops -fomit-frame-pointer -fexpensive-optimizations" AC_MSG_CHECKING(for special compiler settings) case "${host_cpu}" in i?86) if test "x$HAVE_AMD" = "xyes"; then MORE_CFLAGS="-march=k6" else MORE_CFLAGS="-march=${host_cpu}" fi ;; *) MORE_CFLAGS="" ;; esac if test "x$MORE_CFLAGS" = x; then AC_MSG_RESULT(no) else save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $MORE_CFLAGS" AC_TRY_COMPILE( [], [], AC_MSG_RESULT(yes), CFLAGS="$save_CFLAGS" ) fi else CFLAGS=-O2 fi else AC_MSG_RESULT(no) CFLAGS="$CFLAGS " fi dnl CFLAGS for release and devel versions AC_ARG_ENABLE(profile, [ --enable-profile compile with profiling (for development)], profile=$enable_profile ) if test "x$profile" = xyes; then BUILD_TYPE="$BUILD_TYPE Profile" if test "x$GCC" = xyes; then CFLAGS="`echo $CFLAGS | sed -e 's/-fomit-frame-pointer//g'` -pg" LDFLAGS="$LDFLAGS -pg" else CFLAGS="$CFLAGS -p" fi fi check_pipe=no if test "x$GCC" = xyes; then dnl Check for -pipe vs -save-temps. AC_MSG_CHECKING(for -pipe vs -save-temps) AC_ARG_ENABLE(save-temps, [ --enable-save-temps save temporary files], AC_MSG_RESULT(-save-temps); CFLAGS="$CFLAGS -save-temps"; BUILD_TYPE="$BUILD_TYPE Save-temps", AC_MSG_RESULT(-pipe); check_pipe=yes) fi if test "x$check_pipe" = xyes; then AC_MSG_CHECKING(whether -pipe works) save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -pipe" pipe_ok=no AC_TRY_COMPILE( [], [], pipe_ok=yes AC_MSG_RESULT(yes), AC_MSG_RESULT(no) ) CFLAGS="$save_CFLAGS" if test "x$pipe_ok" = xyes; then CFLAGS="$CFLAGS -pipe" fi fi dnl QuakeForge uses lots of BCPL-style (//) comments, which can cause problems dnl with many compilers that don't support the latest ISO standards. Well, dnl that is our cover story -- the reality is that we like them and don't want dnl to give them up. :) dnl Make the compiler swallow its pride... if test "x$GCC" != xyes; then AC_MSG_CHECKING(for how to deal with BCPL-style comments) case "${host}" in *-aix*) CFLAGS="$CFLAGS -qcpluscmt" AC_MSG_RESULT([-qcpluscmt]) ;; *-irix6*) CFLAGS="$CFLAGS -Xcpluscomm" AC_MSG_RESULT([-Xcpluscomm]) ;; *-solaris*) CFLAGS="$CFLAGS -xCC" AC_MSG_RESULT([-xCC]) ;; *) AC_MSG_RESULT(nothing needed or no switch known) ;; esac fi dnl We want warnings, lots of warnings... if test "x$GCC" = xyes; then CFLAGS="$CFLAGS -Wall -Werror" # CFLAGS="$CFLAGS -Wall -pedantic" fi dnl ================================================================== dnl Make sure we link against a working zlib dnl ================================================================== AC_MSG_CHECKING(for libz.a in X11) need_abs_libz=no for d in `echo $X_LIBS | sed -e 's/-L//'`; do if test -f $d/libz.a; then need_abs_libz=yes break fi done AC_MSG_RESULT($need_abs_libz) AC_ARG_WITH(libz, [ --with-libz= specify directories to search for zlib], zlib_paths="$withval", zlib_paths="") if test "x$need_abs_libz" = "xyes"; then AC_MSG_CHECKING(for location of libz.a or libz.so) zlib_location="unknown" for d in $zlib_paths /usr/local/lib /usr/lib /lib; do for f in libz.so libz.a; do if test -f $d/$f; then zlib_location=$d/$f break fi done done AC_MSG_RESULT($zlib_location) if test "$zlib_location" = unknown; then echo need to specify zlib location with --with-libz exit 1 fi Z_LIBS="$zlib_location" fi AC_SUBST(Z_LIBS) dnl ================================================================== dnl Find out what to build dnl ================================================================== AC_ARG_WITH(clients, [ --with-clients= compile clients in ; 3dfx,fbdev,glx,mgl,sdl,sgl,svga,wgl,x11], clients="$withval", clients="all" ) if test "$clients" = "all"; then ENABLE_3DFX=yes ENABLE_FBDEV=yes ENABLE_GLX=yes ENABLE_MGL=yes ENABLE_SDL=yes ENABLE_SGL=yes ENABLE_SVGA=yes ENABLE_WGL=yes ENABLE_X11=yes else ENABLE_3DFX=no ENABLE_FBDEV=no ENABLE_GLX=no ENABLE_MGL=no ENABLE_SDL=no ENABLE_SGL=no ENABLE_SVGA=no ENABLE_WGL=no ENABLE_X11=no IFS="," for client in $clients; do case "$client" in 3dfx) ENABLE_3DFX=yes ;; fbdev) ENABLE_FBDEV=yes ;; glx) ENABLE_GLX=yes ;; mgl) ENABLE_MGL=yes ;; sdl) ENABLE_SDL=yes ;; sgl) ENABLE_SGL=yes ;; svga) ENABLE_SVGA=yes ;; wgl) ENABLE_WGL=yes ;; x11) ENABLE_X11=yes ;; esac done IFS=" " fi AC_ARG_WITH(server, [ --with-server compile dedicated server], SV_TARGETS="$withval", SV_TARGETS=yes ) CL_TARGETS="" QW_TARGETS="" NQ_TARGETS="" CD_TARGETS="" SND_TARGETS="" SND_PLUGIN_TARGETS="libsound_null.la libsound_disk.la" VID_TARGETS="" BUILD_GL=no BUILD_SW=no if test "x$HAVE_GLIDE" = xyes -a "x$ENABLE_3DFX" = xyes; then QW_TARGETS="$QW_TARGETS qw-client-3dfx\$(EXEEXT)" NQ_TARGETS="$NQ_TARGETS nq-3dfx\$(EXEEXT)" CL_TARGETS="$CL_TARGETS 3dfx" VID_TARGETS="$VID_TARGETS libQFtdfx.la" BUILD_GL=yes fi if test "x$HAVE_FBDEV" = xyes -a "x$ENABLE_FBDEV" = xyes; then QW_TARGETS="$QW_TARGETS qw-client-fbdev\$(EXEEXT)" NQ_TARGETS="$NQ_TARGETS nq-fbdev\$(EXEEXT)" CL_TARGETS="$CL_TARGETS FBDEV" VID_TARGETS="$VID_TARGETS libQFfbdev.la" BUILD_SW=yes fi if test "x$HAVE_X" = xyes; then if test "x$ENABLE_GLX" = xyes; then QW_TARGETS="$QW_TARGETS qw-client-glx\$(EXEEXT)" NQ_TARGETS="$NQ_TARGETS nq-glx\$(EXEEXT)" CL_TARGETS="$CL_TARGETS GLX" VID_TARGETS="$VID_TARGETS libQFglx.la" BUILD_GL=yes fi fi if test "x$HAVE_MGL" = xyes -a "x$ENABLE_MGL" = xyes; then QW_TARGETS="$QW_TARGETS qw-client-mgl\$(EXEEXT)" NQ_TARGETS="$NQ_TARGETS nq-mgl\$(EXEEXT)" CL_TARGETS="$CL_TARGETS MGL" VID_TARGETS="$VID_TARGETS libQFwgl.la" BUILD_SW=yes fi if test "x$HAVE_SDL" = xyes -a "x$ENABLE_SDL" = xyes; then QW_TARGETS="$QW_TARGETS qw-client-sdl\$(EXEEXT)" NQ_TARGETS="$NQ_TARGETS nq-sdl\$(EXEEXT)" CL_TARGETS="$CL_TARGETS SDL" VID_TARGETS="$VID_TARGETS libQFsdl.la" BUILD_SW=yes fi if test "x$HAVE_SGL" = xyes; then if test "x$ENABLE_SGL" = xyes; then QW_TARGETS="$QW_TARGETS qw-client-sgl\$(EXEEXT)" NQ_TARGETS="$NQ_TARGETS nq-sgl\$(EXEEXT)" CL_TARGETS="$CL_TARGETS SDL-GL" VID_TARGETS="$VID_TARGETS libQFsgl.la" BUILD_GL=yes fi fi if test "x$HAVE_SVGA" = xyes -a "x$ENABLE_SVGA" = xyes; then QW_TARGETS="$QW_TARGETS qw-client-svga\$(EXEEXT)" NQ_TARGETS="$NQ_TARGETS nq-svga\$(EXEEXT)" CL_TARGETS="$CL_TARGETS SVGAlib" VID_TARGETS="$VID_TARGETS libQFsvga.la" BUILD_SW=yes fi if test "x$mingw" = xyes -a "x$ENABLE_WGL" = xyes; then QW_TARGETS="$QW_TARGETS qw-client-wgl\$(EXEEXT)" NQ_TARGETS="$NQ_TARGETS nq-wgl\$(EXEEXT)" CL_TARGETS="$CL_TARGETS WGL" VID_TARGETS="$VID_TARGETS libQFwgl.la" BUILD_GL=yes fi if test "x$HAVE_X" = xyes -a "x$ENABLE_X11" = xyes; then QW_TARGETS="$QW_TARGETS qw-client-x11\$(EXEEXT)" NQ_TARGETS="$NQ_TARGETS nq-x11\$(EXEEXT)" CL_TARGETS="$CL_TARGETS X11" VID_TARGETS="$VID_TARGETS libQFx11.la" BUILD_SW=yes fi if test "x$SV_TARGETS" = xyes; then QW_TARGETS="qw-server\$(EXEEXT) $QW_TARGETS" # NQ_TARGETS="nq-server\$(EXEEXT) $NQ_TARGETS" fi if test -n "$CL_TARGETS"; then CD_TARGETS="libQFcd.la" SND_TARGETS="libQFsound.la" if test "`echo $SOUND_TYPES | grep ALSA0.5`"; then SND_PLUGIN_TARGETS="$SND_PLUGIN_TARGETS libsound_alsa0_5.la" fi if test "`echo $SOUND_TYPES | grep ALSA0.9`"; then SND_PLUGIN_TARGETS="$SND_PLUGIN_TARGETS libsound_alsa0_9.la" fi if test "`echo $SOUND_TYPES | grep MME`"; then SND_PLUGIN_TARGETS="$SND_PLUGIN_TARGETS libsound_mme.la" fi if test "`echo $SOUND_TYPES | grep OSS`"; then SND_PLUGIN_TARGETS="$SND_PLUGIN_TARGETS libsound_oss.la" fi if test "`echo $SOUND_TYPES | grep SDL`"; then SND_PLUGIN_TARGETS="$SND_PLUGIN_TARGETS libsound_sdl.la" fi if test "`echo $SOUND_TYPES | grep SGI`"; then SND_PLUGIN_TARGETS="$SND_PLUGIN_TARGETS libsound_sgi.la" fi if test "`echo $SOUND_TYPES | grep SUN`"; then SND_PLUGIN_TARGETS="$SND_PLUGIN_TARGETS libsound_sun.la" fi if test "`echo $SOUND_TYPES | grep Win32`"; then SND_PLUGIN_TARGETS="$SND_PLUGIN_TARGETS libsound_win.la" fi VID_TARGETS="libQFjs.la $VID_TARGETS" else CD_TARGETS="" CD_PLUGIN_TARGETS="" SND_TARGETS="" SND_PLUGIN_TARGETS="" SOUND_TYPES="" CDTYPE="" fi AC_SUBST(NQ_TARGETS) AC_SUBST(QW_TARGETS) AC_SUBST(CD_TARGETS) AC_SUBST(CD_PLUGIN_TARGETS) AC_SUBST(SND_TARGETS) AC_SUBST(SND_PLUGIN_TARGETS) AC_SUBST(VID_TARGETS) AM_CONDITIONAL(BUILD_GL, test "$BUILD_GL" = "yes") AM_CONDITIONAL(BUILD_SW, test "$BUILD_SW" = "yes") dnl Output files AC_OUTPUT( Makefile quakeforge-config include/Makefile include/QF/Makefile include/QF/plugin/Makefile include/win32/version.h libs/Makefile libs/audio/Makefile libs/audio/cd/Makefile libs/audio/targets/Makefile libs/gamecode/Makefile libs/gib/Makefile libs/models/Makefile libs/models/alias/Makefile libs/models/brush/Makefile libs/models/sprite/Makefile libs/util/Makefile libs/video/Makefile libs/video/renderer/Makefile libs/video/renderer/gl/Makefile libs/video/renderer/sw/Makefile libs/video/targets/Makefile qw/Makefile qw/quakeforge.lsm qw/include/Makefile qw/source/Makefile nq/Makefile nq/nuq.lsm nq/include/Makefile nq/source/Makefile doc/Makefile doc/man/Makefile doc/texinfo/Makefile debian/Makefile RPM/build_rpm, chmod +x quakeforge-config RPM/build_rpm ) if test "x$CCVER" = "x"; then CCVER=$CC else if test "$CCVER" = "gcc 2.96"; then CCVER="$CCVER (Note: You might need CC=kgcc ./configure on some systems)" fi fi AC_MSG_RESULT([ QuakeForge has been configured successfully. Build type:$BUILD_TYPE Server support: $SV_TARGETS Client support:$CL_TARGETS Sound support:$SOUND_TYPES CD Audio system:$CDTYPE IPv6 networking: $NETTYPE_IPV6 Compression support: $HAVE_ZLIB Compiler version: $CCVER Shared game data directory: $sharepath Per-user game data directory: $userpath Plugin load directory: $pluginpath Global configuration file: $globalconf User configuration file: $userconf ]) if test -d $srcdir/CVS; then echo "WARNING: Hackers at work, watch for falling bits of code." echo "(This is from a development CVS tree. Expect problems)" echo fi