aboutsummaryrefslogtreecommitdiffstats
path: root/dists/autogen/m4/fpc.m4
blob: 217fddc8169d16f30aa89c2c19a23109407b5057 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
# 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 -pv"], [])

# 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
if test -z "$FPCMAKE"; then
    AC_MSG_ERROR([fpcmake not 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*
])