aboutsummaryrefslogblamecommitdiffstats
path: root/ServiceBasedPlugins/dists/autogen/m4/fpc.m4
blob: 740071cbbdade1d2e9567bdc53a132e6743f4c5a (plain) (tree)











































































































































































































































































                                                                                                    
# Based on fpc.m4 Version 1.1 provided with
#   J Sound System (http://jss.sourceforge.net)
# 
# Originally written by
#   Matti "ccr/TNSP" Hamalainen
#   (C) Copyright 2000-2001 Tecnic Software productions (TNSP)
# 
# Mostly rewritten by 
#   UltraStar Deluxe Team

# SYNOPSIS
#
#   AC_PROG_FPC
#
# DESCRIPTION
#
#   Checks for Free Pascal Compiler
#
#   Sets:
#     PPC            : fpc command          
#     FPCMAKE        : fpcmake command       
#
#     PFLAGS         : flags passed to fpc (overwrite default)
#     PFLAGS_BASE    : base flags (release + debug)
#     PFLAGS_EXTRA   : additional flags (appended to default PFLAGS)
#     PFLAGS_DEBUG   : flags used in debug build
#     PFLAGS_RELEASE : flags used in release build
#
#     Note: 
#       all PFLAGS/PFLAGS_XYZ vars are set to $(PFLAGS_XYZ_DEFAULT)
#       if not set by the user, so the Makefile can assign default
#       values to them.
#
#     FPC_VERSION        : fpc version string, e.g. 2.3.1
#     FPC_VERSION_MAJOR  : major version (here 2) 
#     FPC_VERSION_MINOR  : minor version (here 3)
#     FPC_VERSION_RELEASE: release version (here 1)
#
#     FPC_PLATFORM   : platform of the target (linux/darwin/win32/...)
#     FPC_PROCESSOR  : processor of the target, (i386/...)
#     FPC_CPLATFORM  : platform of the compiler host, (linux/darwin/win32/...)
#     FPC_CPROCESSOR : processor of the compiler host, (i386/...)
#     FPC_TARGET     : FPC_PROCESSOR-FPC_PLATFORM (e.g. i386-linux)
#
#     FPC_PREFIX     : prefix of fpc install path, (default: /usr)
#     FPC_BASE_PATH  : $FPC_PREFIX/lib/fpc/$FPC_VERSION
#     FPC_UNIT_PATH  : $FPC_BASE_PATH/units/$FPC_TARGET
#
# See "fpc -i" for a list of supported platforms and processors

AC_DEFUN([AC_PROG_FPC], [

##
# User PFLAGS
##

AC_ARG_VAR(PFLAGS, [Free Pascal Compiler flags (replaces all other flags)])
AC_ARG_VAR(PFLAGS_BASE,    [Free Pascal Compiler base flags, e.g. -Si])
AC_ARG_VAR(PFLAGS_DEBUG,   [Free Pascal Compiler debug flags, e.g. -gl])
AC_ARG_VAR(PFLAGS_RELEASE, [Free Pascal Compiler release flags, e.g. -O2])
AC_ARG_VAR(PFLAGS_EXTRA,   [Free Pascal Compiler additional flags])

##
# Compiler options
##

AC_ARG_ENABLE(dummy_fpc1,[
Free Pascal Compiler specific options:])

# fpc path
AC_ARG_WITH(fpc,
  [AS_HELP_STRING([--with-fpc=DIR],
    [Directory of the FPC executable @<:@PATH@:>@])],
  [PPC_PATH=$withval], [])

# verbose
AC_ARG_ENABLE(verbose,
  [AS_HELP_STRING([--disable-verbose],
    [Disable verbose compiler output @<:@default=no@:>@])],
  [test x$enableval = xno && PFLAGS_EXTRA="$PFLAGS_EXTRA -v0Bew"], [])

# gprof
AC_ARG_ENABLE(gprof,
  [AS_HELP_STRING([--enable-gprof],
    [Enable profiling with gprof @<:@default=no@:>@])],
  [test x$enableval = xyes && PFLAGS_EXTRA="$PFLAGS_EXTRA -pg"], [])

# valgrind
AC_ARG_ENABLE(valgrind,
  [AS_HELP_STRING([--enable-valgrind],
    [Enable debugging with valgrind @<:@default=no@:>@])],
  [test x$enableval = xyes && PFLAGS_EXTRA="$PFLAGS_EXTRA -gv"], [])

# heaptrace
AC_ARG_ENABLE(heaptrace,
  [AS_HELP_STRING([--enable-heaptrace],
    [Enable heaptrace (memory corruption detection) @<:@default=no@:>@])],
  [test x$enableval = xyes && PFLAGS_EXTRA="$PFLAGS_EXTRA -gh"], [])

# range-checks
AC_ARG_ENABLE(rangechecks,
  [AS_HELP_STRING([--enable-rangechecks],
    [Enables range-checks @<:@default=no@:>@])],
  [test x$enableval = xyes && PFLAGS_EXTRA="$PFLAGS_EXTRA -Crtoi"], [])

# allow execstack (see noexecstack compiler check below)
AC_ARG_ENABLE(noexecstack,
  [AS_HELP_STRING([--disable-noexecstack],
    [Allow executable stacks @<:@default=no@:>@])],
  [], [enable_noexecstack="yes"])

###
# Find compiler executable
###

PPC_CHECK_PROGS="fpc FPC ppc386 ppc PPC386"

if test -z "$PPC_PATH"; then
    PPC_PATH=$PATH
    AC_CHECK_PROGS(PPC, $PPC_CHECK_PROGS)
    AC_CHECK_PROGS(FPCMAKE, [fpcmake])
else
    AC_PATH_PROGS(PPC, $PPC_CHECK_PROGS, [], $PPC_PATH)
    AC_PATH_PROGS(FPCMAKE, [fpcmake], [], $PPC_PATH)
fi
if test -z "$PPC"; then
    AC_MSG_ERROR([no Free Pascal Compiler found in $PPC_PATH])
fi

###
# Get the FPC compiler info
###

AC_MSG_CHECKING([version of fpc])
FPC_VERSION=`${PPC} -iV`
AX_EXTRACT_VERSION(FPC, $FPC_VERSION)
AC_SUBST(FPC_VERSION)
AC_MSG_RESULT([@<:@$FPC_VERSION@:>@])

FPC_PLATFORM=`${PPC} -iTO`
FPC_PROCESSOR=`${PPC} -iTP`
FPC_CPLATFORM=`${PPC} -iSO`
FPC_CPROCESSOR=`${PPC} -iSP`

FPC_TARGET=${FPC_PROCESSOR}-${FPC_PLATFORM}


AC_SUBST(FPC_PLATFORM)
AC_SUBST(FPC_PROCESSOR)
AC_SUBST(FPC_CPLATFORM)
AC_SUBST(FPC_CPROCESSOR)
AC_SUBST(FPC_TARGET)

###
# Get paths
###

if test "x$prefix" != xNONE; then
    FPC_PREFIX=$prefix
else
    FPC_PREFIX=$ac_default_prefix
fi

FPC_BASE_PATH="${FPC_PREFIX}/lib/fpc/${FPC_VERSION}"
FPC_UNIT_PATH="${FPC_BASE_PATH}/units/${FPC_TARGET}"

AC_SUBST(FPC_PREFIX)
AC_SUBST(FPC_BASE_PATH)
AC_SUBST(FPC_UNIT_PATH)

###
# Compiler checks
###

SIMPLE_PROGRAM="program foo; begin writeln; end."

# Check if FPC works and can compile a program
AC_CACHE_CHECK([whether the Free Pascal Compiler works], ac_cv_prog_ppc_works,
[
    AC_PROG_FPC_CHECK([ac_cv_prog_ppc_works], [], [$SIMPLE_PROGRAM])
])
if test x$ac_cv_prog_ppc_works = xno; then
    AC_MSG_ERROR([installation or configuration problem: Cannot create executables.])
fi

# Check if FPC can link with standard libraries
AC_CACHE_CHECK([whether the Free Pascal Compiler can link], ac_cv_prog_ppc_links,
[
    AC_PROG_FPC_CHECK([ac_cv_prog_ppc_links], [],
        [program foo; uses crt; begin writeln; end.]
    )
])
if test x$ac_cv_prog_ppc_links = xno; then
    AC_MSG_ERROR([installation or configuration problem: Cannot link with some standard libraries.])
fi

# Check whether FPC's linker knows "-z noexecstack"
# FPC does not set the NX-flag on stack memory. Binaries generated with FPC
# might crash on platforms that require the stack to be non-executable.
# So we will try to find a workaround here.
# See http://bugs.freepascal.org/view.php?id=11563

AC_CACHE_CHECK([whether FPC supports -k"-z noexecstack"], ac_cv_prog_ppc_noexecstack,
[
    AC_PROG_FPC_CHECK([ac_cv_prog_ppc_noexecstack], [-k"-z noexecstack"], [$SIMPLE_PROGRAM])
])
if test x$enable_noexecstack = xyes; then
    if test x$ac_cv_prog_ppc_noexecstack = xyes; then
        PFLAGS_EXTRA="$PFLAGS_EXTRA -k\"-z noexecstack\""
    fi
fi

# Finally substitute PFLAGS

# set unset PFLAGS_XYZ vars to $(PFLAGS_XYZ_DEFAULT)
# so the Makefile can define default values to it.
true ${PFLAGS:=\$(PFLAGS_DEFAULT)}
true ${PFLAGS_BASE:=\$(PFLAGS_BASE_DEFAULT)}
true ${PFLAGS_EXTRA:=\$(PFLAGS_EXTRA_DEFAULT)}
true ${PFLAGS_DEBUG:=\$(PFLAGS_DEBUG_DEFAULT)}
true ${PFLAGS_RELEASE:=\$(PFLAGS_RELEASE_DEFAULT)}

AC_SUBST(PFLAGS)
AC_SUBST(PFLAGS_BASE)
AC_SUBST(PFLAGS_EXTRA)
AC_SUBST(PFLAGS_DEBUG)
AC_SUBST(PFLAGS_RELEASE)

])

#######################################
# Helper functions
#######################################

# SYNOPSIS
# 
#   AC_PROG_FPC_CHECK(RESULT, FPC_FLAGS, CODE)
#
# DESCRIPTION
#
#   Checks if FPC is able to compile CODE with FPC_FLAGS.
#   The result ("yes" on success, "no" otherwise) is
#   stored in [$RESULT]
#
#   Parameters:
#     RESULT:    Name of result variable
#     FPC_FLAGS: Flags passed to FPC
#     CODE:      

AC_DEFUN([AC_PROG_FPC_CHECK],
[
    # create test file
    rm -f conftest*
    echo "[$3]" > conftest.pp

    # compile test file
    ${PPC} [$2] conftest.pp >> config.log 2>&1

    # check if test file was compiled
    if test -f conftest || test -f conftest.exe; then
        [$1]="yes"
    else
        [$1]="no"
    fi

    # remove test file
    rm -f conftest*
])