# 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*
])