makedefs revision 1.14 1 #!/bin/sh
2
3 # To view the formatted manual page of this file, type:
4 # POSTFIXSOURCE/mantools/srctoman - makedefs | nroff -man
5
6 #++
7 # NAME
8 # makedefs 1
9 # SUMMARY
10 # Postfix makefile configuration utility
11 # SYNOPSIS
12 # \fBmake makefiles \fIname=value...\fR
13 # DESCRIPTION
14 # The \fBmakedefs\fR command identifies the compilation
15 # environment, and emits macro definitions on the standard
16 # output stream that can be prepended to template Makefiles.
17 # These macros implement an internal interface and are subject
18 # to change without notice.
19 # NAME=VALUE OVERRIDES
20 # .ad
21 # .fi
22 # Default settings can be overruled by specifying them as
23 # environment variables (or as name=value pairs on the "make"
24 # command line). Use quotes if variables contain whitespace
25 # or shell meta characters.
26 #
27 # The command "\fBmake makefiles name=value...\fR" will replace
28 # the string \fBMAIL_VERSION\fR at the end of a value with the
29 # Postfix version (\fImajor.minor.patchlevel\fR for a stable
30 # release, \fImajor.minor-date\fR for a development release).
31 # Do not try to specify something like \fB$mail_version\fR:
32 # that produces inconsistent results with different implementations
33 # of the make(1) command.
34 # .IP \fBAUXLIBS=\fIobject_library...\fR
35 # Specifies one or more non-default object libraries. Postfix
36 # 3.0 and later specify some of their database library
37 # dependencies with AUXLIBS_CDB, AUXLIBS_LDAP, AUXLIBS_LMDB,
38 # AUXLIBS_MYSQL, AUXLIBS_PCRE, AUXLIBS_PGSQL, AUXLIBS_SDBM,
39 # and AUXLIBS_SQLITE, respectively.
40 # .IP \fBCC=\fIcompiler_command\fR
41 # Specifies a non-default compiler. On many systems, the default
42 # is \fBgcc\fR.
43 # .IP \fBCCARGS=\fIcompiler_arguments\fR
44 # Specifies non-default compiler arguments, for example, a non-default
45 # \fIinclude\fR directory.
46 # The following directives are special:
47 # .RS
48 # .IP \fB-DNO_DB\fR
49 # Do not build with Berkeley DB support.
50 # .IP \fB-DNO_DEVPOLL\fR
51 # Do not build with Solaris /dev/poll support.
52 # By default, /dev/poll support is compiled in on platforms that
53 # are known to support it.
54 # .IP \fB-DNO_DNSSEC\fR
55 # Do not build with DNSSEC support, even if the resolver
56 # library appears to support it.
57 # .IP \fB-DNO_EPOLL\fR
58 # Do not build with Linux EPOLL support.
59 # By default, EPOLL support is compiled in on platforms that
60 # are known to support it.
61 # .IP \fB-DNO_EAI\fR
62 # Do not build with EAI (SMTPUTF8) support. By default, EAI
63 # support is compiled in when the "pkg-config" command is
64 # found, or the deprecated "icu-config" command.
65 # .IP \fB-DNO_INLINE\fR
66 # Do not require support for C99 "inline" functions. Instead,
67 # implement argument typechecks for non-(printf/scanf)-like
68 # functions with ternary operators and unreachable code.
69 # .IP \fB-DNO_IPV6\fR
70 # Do not build with IPv6 support.
71 # By default, IPv6 support is compiled in on platforms that
72 # are known to have IPv6 support.
73 #
74 # Note: this directive is for debugging and testing only. It
75 # is not guaranteed to work on all platforms. If you don't
76 # want IPv6 support, set "inet_protocols = ipv4" in main.cf.
77 # .IP \fB-DNO_IP_CYRUS_SASL_AUTH\fR
78 # Don't pass remote SMTP client and Postfix SMTP server IP
79 # address and port information to the Cyrus SASL library.
80 # This is compatible with Postfix < 3.2.
81 # .IP \fB-DNO_KQUEUE\fR
82 # Do not build with FreeBSD/NetBSD/OpenBSD/MacOSX KQUEUE support.
83 # By default, KQUEUE support is compiled in on platforms that
84 # are known to support it.
85 # .IP \fB-DNO_NIS\fR
86 # Do not build with NIS or NISPLUS support. Support for NIS
87 # is unavailable on some recent Linux distributions.
88 # .IP \fB-DNO_NISPLUS\fR
89 # Do not build with NISPLUS support. Support for NISPLUS
90 # is unavailable on some recent Solaris distributions.
91 # .IP \fB-DNO_PCRE\fR
92 # Do not build with PCRE support.
93 # By default, PCRE support is compiled in when the \fBpcre-config\fR
94 # utility is installed.
95 # .IP \fB-DNO_POSIX_GETPW_R\fR
96 # Disable support for POSIX getpwnam_r/getpwuid_r.
97 # .IP \fB-DNO_SIGSETJMP\fR
98 # Use setjmp()/longjmp() instead of sigsetjmp()/siglongjmp().
99 # By default, Postfix uses sigsetjmp()/siglongjmp() when they
100 # appear to work.
101 # .IP \fB-DNO_SNPRINTF\fR
102 # Use sprintf() instead of snprintf(). By default, Postfix
103 # uses snprintf() except on ancient systems.
104 # .RE
105 # .IP \fBDEBUG=\fIdebug_level\fR
106 # Specifies a non-default debugging level. The default is \fB-g\fR.
107 # Specify \fBDEBUG=\fR to turn off debugging.
108 # .IP \fBOPT=\fIoptimization_level\fR
109 # Specifies a non-default optimization level. The default is \fB-O\fR.
110 # Specify \fBOPT=\fR to turn off optimization.
111 # .IP \fBPOSTFIX_INSTALL_OPTS=\fI-option...\fR
112 # Specifies options for the postfix-install command, separated
113 # by whitespace. Currently, the only supported option is
114 # \fB-keep-build-mtime\fR.
115 # .IP \fBSHLIB_CFLAGS=\fIflags\fR
116 # Override the compiler flags (typically, "-fPIC") for Postfix
117 # dynamically-linked libraries and database plugins.
118 #
119 # This feature was introduced with Postfix 3.0.
120 # .IP \fBSHLIB_RPATH=\fIrpath\fR
121 # Override the runpath (typically, "'-Wl,-rpath,${SHLIB_DIR}'")
122 # for Postfix dynamically-linked libraries.
123 #
124 # This feature was introduced with Postfix 3.0.
125 # .IP \fBSHLIB_SUFFIX=\fIsuffix\fR
126 # Override the filename suffix (typically, ".so") for Postfix
127 # dynamically-linked libraries and database plugins.
128 #
129 # This feature was introduced with Postfix 3.0.
130 # .IP \fBshared=yes\fR
131 # .IP \fBshared=no\fR
132 # Enable (disable) Postfix builds with dynamically-linked
133 # libraries typically named $shlib_directory/libpostfix-*.so.*.
134 #
135 # This feature was introduced with Postfix 3.0.
136 # .IP \fBdynamicmaps=yes\fR
137 # .IP \fBdynamicmaps=no\fR
138 # Enable (disable) Postfix builds with the configuration file
139 # $meta_directory/dynamicmaps.cf and dynamically-loadable
140 # database plugins typically named postfix-*.so.*. The setting
141 # "dynamicmaps=yes" implicitly enables Postfix dynamically-linked
142 # libraries.
143 #
144 # This feature was introduced with Postfix 3.0.
145 # .IP \fBpie=yes\fR
146 # .IP \fBpie=no\fR
147 # Enable (disable) Postfix builds with position-independent
148 # executables, on platforms where this is supported.
149 #
150 # This feature was introduced with Postfix 3.0.
151 # .IP \fIinstallation_parameter\fB=\fIvalue\fR...
152 # Override the compiled-in default value of the specified
153 # installation parameter(s). The following parameters are
154 # supported in this context:
155 #
156 # command_directory config_directory daemon_directory
157 # data_directory default_database_type html_directory
158 # mail_spool_directory mailq_path manpage_directory meta_directory
159 # newaliases_path queue_directory readme_directory sendmail_path
160 # shlib_directory openssl_path
161 #
162 # See the postconf(5) manpage for a description of these
163 # parameters.
164 #
165 # This feature was introduced with Postfix 3.0.
166 # .IP \fBWARN=\fIwarning_flags\fR
167 # Specifies non-default gcc compiler warning options for use when
168 # "make" is invoked in a source subdirectory only.
169 # LICENSE
170 # .ad
171 # .fi
172 # The Secure Mailer license must be distributed with this software.
173 # AUTHOR(S)
174 # Wietse Venema
175 # IBM T.J. Watson Research
176 # P.O. Box 704
177 # Yorktown Heights, NY 10598, USA
178 #
179 # Wietse Venema
180 # Google, Inc.
181 # 111 8th Avenue
182 # New York, NY 10011, USA
183 #--
184
185 # Emit system-dependent Makefile macro definitions to standard output.
186
187 echo "#----------------------------------------------------------------"
188 echo "# Start of summary of user-configurable 'make makefiles' options."
189 echo "# CCARGS=$CCARGS"
190 echo "# AUXLIBS=$AUXLIBS"
191 env | grep '^AUXLIBS_' | sed 's/^/# /'
192 echo "# shared=$shared"
193 echo "# dynamicmaps=$dynamicmaps"
194 echo "# pie=$pie"
195
196 # Defaults for most sane systems
197
198 RANLIB=ranlib
199 SYSLIBS=
200 AR=ar
201 ARFL=rv
202
203 # Ugly function to make our error message more visible among the
204 # garbage that is output by some versions of make(1).
205
206 # By now all shells must have functions.
207
208 error() {
209 # Alas, tput(1) is not portable so we can't use visual effects.
210 echo "ATTENTION:" 1>&2;
211 echo "ATTENTION:" $* 1>&2;
212 echo "ATTENTION:" 1>&2;
213 exit 1
214 }
215
216 case $# in
217 # Officially supported usage.
218 0) SYSTEM=`(uname -s) 2>/dev/null`
219 RELEASE=`(uname -r) 2>/dev/null`
220 # No ${x%%y} support in Solaris 11 /bin/sh
221 RELEASE_MAJOR=`expr "$RELEASE" : '\([0-9]*\)'` || exit 1
222 VERSION=`(uname -v) 2>/dev/null`
223 case "$VERSION" in
224 dcosx*) SYSTEM=$VERSION;;
225 esac;;
226 # Unsupported debug-only mode. Not suitable for cross-platform tests.
227 2) SYSTEM="$1"; RELEASE="$2";;
228 *) echo usage: $0 [system release] 1>&2; exit 1;;
229 esac
230
231 case "$SYSTEM" in
232 Linux)
233 case "`PATH=/bin:/usr/bin ldd /bin/sh`" in
234 *-musl-*)
235 case "$CCARGS" in
236 *-DNO_DNSSEC*) ;;
237 *) echo Warning: libc-musl breaks DANE/TLSA security. 1>&2
238 echo This build will not support DANE/TLSA. 1>&2
239 CCARGS="$CCARGS -DNO_DNSSEC";;
240 esac;;
241 esac;;
242 esac
243
244 case "$SYSTEM.$RELEASE" in
245 SCO_SV.3.2) SYSTYPE=SCO5
246 # Use the native compiler by default
247 : ${CC="/usr/bin/cc -b elf"}
248 CCARGS="$CCARGS -DPIPES_CANT_FIONREAD $CCARGS"
249 SYSLIBS="-lsocket -ldbm"
250 RANLIB=echo
251 ;;
252 UnixWare.5*) SYSTYPE=UW7
253 # Use the native compiler by default
254 : ${CC=/usr/bin/cc}
255 RANLIB=echo
256 SYSLIBS="-lresolv -lsocket -lnsl"
257 ;;
258 UNIX_SV.4.2*) case "`uname -v`" in
259 2.1*) SYSTYPE=UW21
260 # Use the native compiler by default
261 : ${CC=/usr/bin/cc}
262 RANLIB=echo
263 SYSLIBS="-lresolv -lsocket -lnsl -lc -L/usr/ucblib -lucb"
264 ;;
265 *) error "Seems to be UnixWare`uname -v`. Untested.";;
266 esac
267 ;;
268 FreeBSD.2*) SYSTYPE=FREEBSD2
269 ;;
270 FreeBSD.3*) SYSTYPE=FREEBSD3
271 ;;
272 FreeBSD.4*) SYSTYPE=FREEBSD4
273 ;;
274 FreeBSD.5*) SYSTYPE=FREEBSD5
275 ;;
276 FreeBSD.6*) SYSTYPE=FREEBSD6
277 ;;
278 FreeBSD.7*) SYSTYPE=FREEBSD7
279 ;;
280 FreeBSD.8*) SYSTYPE=FREEBSD8
281 : ${SHLIB_SUFFIX=.so}
282 : ${SHLIB_CFLAGS=-fPIC}
283 : ${SHLIB_LD="${CC-gcc} -shared"' -Wl,-soname,${LIB}'}
284 : ${SHLIB_RPATH='-Wl,-rpath,${SHLIB_DIR}'}
285 : ${SHLIB_ENV="LD_LIBRARY_PATH=`pwd`/lib"}
286 : ${PLUGIN_LD="${CC-gcc} -shared"}
287 ;;
288 FreeBSD.9*) SYSTYPE=FREEBSD9
289 : ${SHLIB_SUFFIX=.so}
290 : ${SHLIB_CFLAGS=-fPIC}
291 : ${SHLIB_LD="${CC-gcc} -shared"' -Wl,-soname,${LIB}'}
292 : ${SHLIB_RPATH='-Wl,-rpath,${SHLIB_DIR}'}
293 : ${SHLIB_ENV="LD_LIBRARY_PATH=`pwd`/lib"}
294 : ${PLUGIN_LD="${CC-gcc} -shared"}
295 ;;
296 FreeBSD.10*) SYSTYPE=FREEBSD10
297 : ${CC=cc}
298 : ${SHLIB_SUFFIX=.so}
299 : ${SHLIB_CFLAGS=-fPIC}
300 : ${SHLIB_LD="${CC} -shared"' -Wl,-soname,${LIB}'}
301 : ${SHLIB_RPATH='-Wl,-rpath,${SHLIB_DIR}'}
302 : ${SHLIB_ENV="LD_LIBRARY_PATH=`pwd`/lib"}
303 : ${PLUGIN_LD="${CC} -shared"}
304 ;;
305 FreeBSD.11*) SYSTYPE=FREEBSD11
306 : ${CC=cc}
307 : ${SHLIB_SUFFIX=.so}
308 : ${SHLIB_CFLAGS=-fPIC}
309 : ${SHLIB_LD="${CC} -shared"' -Wl,-soname,${LIB}'}
310 : ${SHLIB_RPATH='-Wl,-rpath,${SHLIB_DIR}'}
311 : ${SHLIB_ENV="LD_LIBRARY_PATH=`pwd`/lib"}
312 : ${PLUGIN_LD="${CC} -shared"}
313 ;;
314 DragonFly.*) SYSTYPE=DRAGONFLY
315 ;;
316 OpenBSD.2*) SYSTYPE=OPENBSD2
317 ;;
318 OpenBSD.3*) SYSTYPE=OPENBSD3
319 ;;
320 OpenBSD.4*) SYSTYPE=OPENBSD4
321 ;;
322 OpenBSD.5*) SYSTYPE=OPENBSD5
323 : ${CC=cc}
324 : ${SHLIB_SUFFIX=.so.1.0}
325 : ${SHLIB_CFLAGS=-fPIC}
326 : ${SHLIB_LD="${CC} -shared"' -Wl,-soname,${LIB}'}
327 : ${SHLIB_RPATH='-Wl,-rpath,${SHLIB_DIR}'}
328 : ${SHLIB_ENV="LD_LIBRARY_PATH=`pwd`/lib"}
329 : ${PLUGIN_LD="${CC} -shared"}
330 ;;
331 OpenBSD.6*) SYSTYPE=OPENBSD6
332 : ${CC=cc}
333 : ${SHLIB_SUFFIX=.so.1.0}
334 : ${SHLIB_CFLAGS=-fPIC}
335 : ${SHLIB_LD="${CC} -shared"' -Wl,-soname,${LIB}'}
336 : ${SHLIB_RPATH='-Wl,-rpath,${SHLIB_DIR}'}
337 : ${SHLIB_ENV="LD_LIBRARY_PATH=`pwd`/lib"}
338 : ${PLUGIN_LD="${CC} -shared"}
339 ;;
340 ekkoBSD.1*) SYSTYPE=EKKOBSD1
341 ;;
342 NetBSD.1*) SYSTYPE=NETBSD1
343 ;;
344 NetBSD.2*) SYSTYPE=NETBSD2
345 ;;
346 NetBSD.3*) SYSTYPE=NETBSD3
347 ;;
348 NetBSD.4*) SYSTYPE=NETBSD4
349 ;;
350 NetBSD.5*) SYSTYPE=NETBSD5
351 ;;
352 NetBSD.6*) SYSTYPE=NETBSD6
353 : ${SHLIB_SUFFIX=.so}
354 : ${SHLIB_CFLAGS=-fPIC}
355 : ${SHLIB_LD="${CC-gcc} -shared"' -Wl,-soname,${LIB}'}
356 : ${SHLIB_RPATH='-Wl,-rpath,${SHLIB_DIR}'}
357 : ${SHLIB_ENV="LD_LIBRARY_PATH=`pwd`/lib"}
358 : ${PLUGIN_LD="${CC-gcc} -shared"}
359 ;;
360 NetBSD.7*) SYSTYPE=NETBSD7
361 : ${SHLIB_SUFFIX=.so}
362 : ${SHLIB_CFLAGS=-fPIC}
363 : ${SHLIB_LD="${CC-gcc} -shared"' -Wl,-soname,${LIB}'}
364 : ${SHLIB_RPATH='-Wl,-rpath,${SHLIB_DIR}'}
365 : ${SHLIB_ENV="LD_LIBRARY_PATH=`pwd`/lib"}
366 : ${PLUGIN_LD="${CC-gcc} -shared"}
367 ;;
368 BSD/OS.2*) SYSTYPE=BSDI2
369 ;;
370 BSD/OS.3*) SYSTYPE=BSDI3
371 ;;
372 BSD/OS.4*) SYSTYPE=BSDI4
373 ;;
374 OSF1.V[3-5].*) SYSTYPE=OSF1
375 # Use the native compiler by default
376 : ${CC=cc}
377 : ${DEBUG="-g3"}
378 case $RELEASE in
379 V[0-4].*) CCARGS="$CCARGS -DNO_IPV6";;
380 esac
381 ;;
382 SunOS.4*) SYSTYPE=SUNOS4
383 SYSLIBS=-lresolv
384 ;;
385 SunOS.5*) SYSTYPE=SUNOS5
386 RANLIB=echo
387 SYSLIBS="-lresolv -lsocket -lnsl -ldl"
388 : ${SHLIB_SUFFIX=.so}
389 : ${SHLIB_CFLAGS=-fPIC}
390 : ${SHLIB_LD="${CC-gcc} -shared"' -Wl,-h,${LIB}'}
391 : ${SHLIB_ENV="LD_LIBRARY_PATH=`pwd`/lib"}
392 : ${SHLIB_RPATH='-Wl,-R,${SHLIB_DIR}'}
393 : ${PLUGIN_LD="${CC-gcc} -shared"}
394 # Stock awk breaks with >10 files.
395 test -x /usr/xpg4/bin/awk && AWK=/usr/xpg4/bin/awk
396 # Solaris 2.5 added usleep(), POSIX regexp, POSIX getpwnam/uid_r
397 case $RELEASE in
398 5.[0-4]) CCARGS="$CCARGS -DMISSING_USLEEP -DNO_POSIX_REGEXP -DNO_POSIX_GETPW_R";;
399 esac
400 # Solaris 2.6 added snprintf()
401 case $RELEASE in
402 5.[0-5]) CCARGS="$CCARGS -DNO_SNPRINTF";;
403 esac
404 # Solaris 8 added IPv6 and /dev/poll
405 case $RELEASE in
406 5.[0-7]|5.[0-7].*) CCARGS="$CCARGS -DNO_IPV6 -DNO_DEVPOLL";;
407 esac
408 # Solaris 9 added closefrom(), futimesat() and /dev/*random
409 # and appears to have solid UNIX-domain sockets.
410 case $RELEASE in
411 5.[0-8]|5.[0-8].*) CCARGS="$CCARGS -DNO_CLOSEFROM -DNO_DEV_URANDOM -DNO_FUTIMESAT -DSTREAM_CONNECTIONS";;
412 esac
413 # Solaris 10 added setenv(), unsetenv().
414 case $RELEASE in
415 5.[0-9]|5.[0-9].*) CCARGS="$CCARGS -DMISSING_SETENV";;
416 esac
417 # NISPLUS was removed after Solaris 10.
418 case $RELEASE in
419 5.[0-9][0-9]*) CCARGS="$CCARGS -DNO_NISPLUS";;
420 esac
421 # Work around broken str*casecmp(). Do it all here instead
422 # of having half the solution in the sys_defs.h file.
423 CCARGS="$CCARGS -Dstrcasecmp=fix_strcasecmp \
424 -Dstrncasecmp=fix_strncasecmp"
425 STRCASE="strcasecmp.o"
426 # Avoid common types of braindamage
427 case "$LD_LIBRARY_PATH" in
428 ?*) error "Don't set LD_LIBRARY_PATH";;
429 esac
430 case "${CC}" in
431 *" "*) ;;
432 *ucb*) error "Don't use /usr/ucb/cc or ucblib";;
433 cc*) case `which ${CC}` in
434 *ucb*) error "Don't use /usr/ucb/cc or ucblib";;
435 esac;;
436 esac
437 ;;
438 ULTRIX.4*) SYSTYPE=ULTRIX4
439 if [ -f /usr/local/lib/libdb.a ]; then
440 SYSLIBS="$SYSLIBS -ldb"
441 CCARGS="$CCARGS -DHAS_DB"
442 if [ -d /usr/local/include/db ]; then
443 CCARGS="$CCARGS -I/usr/local/include/db"
444 fi
445 fi
446 for l in syslog resolv; do
447 if [ -f /usr/local/lib/lib$l.a ]; then
448 SYSLIBS="$SYSLIBS -l$l"
449 fi
450 done
451 ;;
452 AIX.*) case "`uname -v`" in
453 6) SYSTYPE=AIX6
454 CCARGS="$CCARGS -DNO_DNSSEC"
455 case "$CC" in
456 cc|*/cc|xlc|*/xlc) CCARGS="$CCARGS -w -blibpath:/usr/lib:/lib:/usr/local/lib";;
457 esac
458 CCARGS="$CCARGS -D_ALL_SOURCE -DHAS_POSIX_REGEXP"
459 ;;
460 5) SYSTYPE=AIX5
461 CCARGS="$CCARGS -DNO_DNSSEC"
462 case "$CC" in
463 cc|*/cc|xlc|*/xlc) CCARGS="$CCARGS -w -blibpath:/usr/lib:/lib:/usr/local/lib";;
464 esac
465 CCARGS="$CCARGS -D_ALL_SOURCE -DHAS_POSIX_REGEXP"
466 ;;
467 4) SYSTYPE=AIX4
468 CCARGS="$CCARGS -DNO_DNSSEC"
469 # How embarrassing...
470 case "$CC" in
471 cc|*/cc|xlc|*/xlc) OPT=; CCARGS="$CCARGS -w -blibpath:/usr/lib:/lib:/usr/local/lib";;
472 esac
473 CCARGS="$CCARGS -D_ALL_SOURCE -DHAS_POSIX_REGEXP"
474 ;;
475 3) SYSTYPE=AIX3
476 CCARGS="$CCARGS -DNO_DNSSEC"
477 # How embarrassing...
478 case "$CC" in
479 cc|*/cc|xlc|*/xlc) OPT=; CCARGS="$CCARGS -w";;
480 esac
481 CCARGS="$CCARGS -D_ALL_SOURCE"
482 ;;
483 *) error "Unknown AIX version: `uname -v`.";;
484 esac;;
485 # Tested with RedHat 3.03 on 20020729.
486 Linux.1*) SYSTYPE=LINUX1
487 case "$CCARGS" in
488 *-DNO_DB*) ;;
489 *-DHAS_DB*) ;;
490 *) SYSLIBS="-ldb";;
491 esac
492 ;;
493 Linux.2*) SYSTYPE=LINUX2
494 case "$CCARGS" in
495 *-DNO_DB*) ;;
496 *-DHAS_DB*) ;;
497 *) if [ -f /usr/include/db.h ]
498 then
499 : we are all set
500 elif [ -f /usr/include/db/db.h ]
501 then
502 CCARGS="$CCARGS -I/usr/include/db"
503 else
504 # No, we're not going to try db1 db2 db3 etc.
505 # On a properly installed system, Postfix builds
506 # by including <db.h> and by linking with -ldb
507 echo "No <db.h> include file found." 1>&2
508 echo "Install the appropriate db*-devel package first." 1>&2
509 exit 1
510 fi
511 SYSLIBS="-ldb"
512 ;;
513 esac
514 for name in nsl resolv $GDBM_LIBS
515 do
516 for lib in /usr/lib64 /lib64 /usr/lib /lib
517 do
518 test -e $lib/lib$name.a -o -e $lib/lib$name.so && {
519 SYSLIBS="$SYSLIBS -l$name"
520 break
521 }
522 done
523 done
524 # Kernel 2.4 added IPv6
525 case "$RELEASE" in
526 2.[0-3].*) CCARGS="$CCARGS -DNO_IPV6";;
527 esac
528 # Kernel 2.6 added EPOLL
529 case "$RELEASE" in
530 2.[0-5].*) CCARGS="$CCARGS -DNO_EPOLL";;
531 # Workaround for retarded libc
532 2.6.*)
533 if [ `expr "X$CCARGS" : "X.*-DNO_EPOLL"` -gt 0 ]
534 then
535 :
536 elif [ ! -e /usr/include/sys/epoll.h ]
537 then
538 echo CCARGS="$CCARGS -DNO_EPOLL"
539 else
540 trap 'rm -f makedefs.test makedefs.test.[co]' 1 2 3 15
541 cat >makedefs.test.c <<'EOF'
542 #include <sys/types.h>
543 #include <sys/epoll.h>
544 #include <errno.h>
545 #include <stdio.h>
546 #include <stdlib.h>
547
548 int main(int argc, char **argv)
549 {
550 int epoll_handle;
551
552 if ((epoll_handle = epoll_create(1)) < 0) {
553 perror("epoll_create");
554 exit(1);
555 }
556 exit(0);
557 }
558 EOF
559 ${CC-gcc} -o makedefs.test makedefs.test.c || exit 1
560 ./makedefs.test 2>/dev/null ||
561 CCARGS="$CCARGS -DNO_EPOLL"
562 rm -f makedefs.test makedefs.test.[co]
563 fi;;
564 esac
565 SYSLIBS="$SYSLIBS -ldl"
566 : ${SHLIB_SUFFIX=.so}
567 : ${SHLIB_CFLAGS=-fPIC}
568 : ${SHLIB_LD="${CC-gcc} -shared"' -Wl,-soname,${LIB}'}
569 : ${SHLIB_RPATH='-Wl,--enable-new-dtags -Wl,-rpath,${SHLIB_DIR}'}
570 : ${SHLIB_ENV="LD_LIBRARY_PATH=`pwd`/lib"}
571 : ${PLUGIN_LD="${CC-gcc} -shared"}
572 ;;
573 Linux.[345].*) SYSTYPE=LINUX$RELEASE_MAJOR
574 case "$CCARGS" in
575 *-DNO_DB*) ;;
576 *-DHAS_DB*) ;;
577 *) if [ -f /usr/include/db.h ]
578 then
579 : we are all set
580 elif [ -f /usr/include/db/db.h ]
581 then
582 CCARGS="$CCARGS -I/usr/include/db"
583 else
584 # On a properly installed system, Postfix builds
585 # by including <db.h> and by linking with -ldb
586 echo "No <db.h> include file found." 1>&2
587 echo "Install the appropriate db*-devel package first." 1>&2
588 exit 1
589 fi
590 SYSLIBS="-ldb"
591 ;;
592 esac
593 for name in nsl resolv
594 do
595 for lib in /usr/lib64 /lib64 /usr/lib /usr/lib/* /lib /lib/*
596 do
597 test -e $lib/lib$name.a -o -e $lib/lib$name.so && {
598 SYSLIBS="$SYSLIBS -l$name"
599 break
600 }
601 done
602 done
603 SYSLIBS="$SYSLIBS -ldl"
604 : ${SHLIB_SUFFIX=.so}
605 : ${SHLIB_CFLAGS=-fPIC}
606 : ${SHLIB_LD="${CC-gcc} -shared"' -Wl,-soname,${LIB}'}
607 : ${SHLIB_RPATH='-Wl,--enable-new-dtags -Wl,-rpath,${SHLIB_DIR}'}
608 : ${SHLIB_ENV="LD_LIBRARY_PATH=`pwd`/lib"}
609 : ${PLUGIN_LD="${CC-gcc} -shared"}
610 ;;
611 GNU.0*|GNU/kFreeBSD.[567]*)
612 SYSTYPE=GNU0
613 case "$CCARGS" in
614 *-DNO_DB*) ;;
615 *) if [ -f /usr/include/db.h ]
616 then
617 : we are all set
618 elif [ -f /usr/include/db/db.h ]
619 then
620 CCARGS="$CCARGS -I/usr/include/db"
621 else
622 # On a properly installed system, Postfix builds
623 # by including <db.h> and by linking with -ldb
624 echo "No <db.h> include file found." 1>&2
625 echo "Install the appropriate db*-devel package first." 1>&2
626 exit 1
627 fi
628 SYSLIBS="-ldb"
629 ;;
630 esac
631 for name in nsl resolv
632 do
633 for lib in /usr/lib64 /lib64 /usr/lib /lib
634 do
635 test -e $lib/lib$name.a -o -e $lib/lib$name.so && {
636 SYSLIBS="$SYSLIBS -l$name"
637 break
638 }
639 done
640 done
641 case "`uname -s`" in
642 GNU)
643 # currently no IPv6 support on Hurd
644 CCARGS="$CCARGS -DNO_IPV6"
645 ;;
646 esac
647 ;;
648 IRIX*.5.*) SYSTYPE=IRIX5
649 # Use the native compiler by default
650 : ${CC=cc} ${DEBUG="-g3"}
651 RANLIB=echo
652 ;;
653 IRIX*.6.*) SYSTYPE=IRIX6
654 # Use the native compiler by default, and allow nested comments.
655 : ${CC="cc -woff 1009,1116,1412"}
656 RANLIB=echo
657 ;;
658 HP-UX.A.09.*) SYSTYPE=HPUX9
659 SYSLIBS=-ldbm
660 CCARGS="$CCARGS -DMISSING_USLEEP -DNO_SNPRINTF"
661 if [ -f /usr/lib/libdb.a ]; then
662 CCARGS="$CCARGS -DHAS_DB"
663 SYSLIBS="$SYSLIBS -ldb"
664 fi
665 ;;
666 HP-UX.B.10.*) SYSTYPE=HPUX10
667 CCARGS="$CCARGS `nm /usr/lib/libc.a 2>/dev/null |
668 (grep usleep >/dev/null || echo '-DMISSING_USLEEP')`"
669 CCARGS="$CCARGS -DNO_SNPRINTF"
670 if [ -f /usr/lib/libdb.a ]; then
671 CCARGS="$CCARGS -DHAS_DB"
672 SYSLIBS=-ldb
673 fi
674 ;;
675 HP-UX.B.11.*) SYSTYPE=HPUX11
676 SYSLIBS=-lnsl
677 if [ -f /usr/lib/libdb.a ]; then
678 CCARGS="$CCARGS -DHAS_DB"
679 SYSLIBS="$SYSLIBS -ldb"
680 fi
681 ;;
682 ReliantUNIX-?.5.43) SYSTYPE=ReliantUnix543
683 RANLIB=echo
684 SYSLIBS="-lresolv -lsocket -lnsl"
685 ;;
686 Darwin.*) SYSTYPE=MACOSX
687 # Use the native compiler by default
688 : ${CC=cc}
689 CCARGS="$CCARGS"
690 # Darwin > 1.3 uses awk and flat_namespace
691 case $RELEASE in
692 1.[0-3]) AWK=gawk;;
693 *) AWK=awk
694 SYSLIBS="$SYSLIBS -flat_namespace";;
695 esac
696 # Darwin 7 adds IPv6 support, BIND_8_COMPAT, NO_NETINFO
697 case $RELEASE in
698 [1-6].*) CCARGS="$CCARGS -DNO_IPV6";;
699 *) CCARGS="$CCARGS -DBIND_8_COMPAT -DNO_NETINFO";;
700 esac
701 # Darwin 9.0 (MacOS X 10.5) adds POSIX getpwnam_r/getpwuid_r
702 case $RELEASE in
703 [1-8].*) CCARGS="$CCARGS -DNO_POSIX_GETPW_R";;
704 esac
705 # Darwin 10.3.0 no longer has <nameser8_compat.h>.
706 case $RELEASE in
707 ?.*) CCARGS="$CCARGS -DRESOLVE_H_NEEDS_NAMESER8_COMPAT_H";;
708 *) CCARGS="$CCARGS -DRESOLVE_H_NEEDS_ARPA_NAMESER_COMPAT_H";;
709 esac
710 # Darwin 11.x (MacOS X 10.7.x), maybe earlier, needs libresolv.
711 case $RELEASE in
712 ?.*|10.*) ;;
713 *) SYSLIBS="$SYSLIBS -lresolv";;
714 esac
715 # kqueue and/or poll are broken in MacOS X 10.5 (Darwin 9).
716 # kqueue works in Mac OS X 10.8 (Darwin 12).
717 case $RELEASE in
718 ?.*|1[0-1].*) CCARGS="$CCARGS -DNO_KQUEUE";;
719 esac
720 : ${SHLIB_CFLAGS=-fPIC}
721 : ${SHLIB_SUFFIX=.dylib}
722 : ${SHLIB_LD='cc -shared -Wl,-flat_namespace -Wl,-undefined,dynamic_lookup -Wl,-install_name,@rpath/${LIB}'}
723 : ${SHLIB_RPATH='-Wl,-rpath,${SHLIB_DIR}'}
724 # In MacOS/X 10.11.x /bin/sh unsets DYLD_LIBRARY_PATH, so we
725 # have export it into postfix-install indirectly!
726 : ${SHLIB_ENV="DYLD_LIBRARY_PATH=`pwd`/lib SHLIB_ENV_VAR=DYLD_LIBRARY_PATH SHLIB_ENV_VAL=`pwd`/lib"}
727 : ${PLUGIN_LD='cc -shared -Wl,-flat_namespace -Wl,-undefined,dynamic_lookup'}
728 ;;
729 dcosx.1*) SYSTYPE=DCOSX1
730 RANLIB=echo
731 SYSLIBS="-lresolv -lsocket -lnsl -lc -lrpcsvc -L/usr/ucblib -lucb"
732 ;;
733
734 ".") if [ -d /NextApps ]; then
735 SYSTYPE=`hostinfo | sed -n \
736 's/^.*NeXT Mach 3.*$/NEXTSTEP3/;/NEXTSTEP3/{p;q;}'`
737 if [ "$SYSTYPE" = "" ]; then
738 SYSTYPE=`hostinfo | sed -n \
739 's/^.*NeXT Mach 4.*$/OPENSTEP4/;/OPENSTEP4/{p;q;}'`
740 fi
741 : ${CC=cc}
742 RANLIB="sleep 5; ranlib"
743 else
744 error "Unable to determine your system type."
745 fi
746 ;;
747 *) error "Unknown system type: $SYSTEM $RELEASE";;
748 esac
749
750 #
751 # sigsetjmp()/siglongjmp() can be "better" than setjmp()/longjmp()
752 # if used wisely (that is: almost never, just like signals).
753 # Unfortunately some implementations have been buggy in the past.
754 #
755 case "$CCARGS" in
756 *-DNO_SIGSETJMP*) ;;
757 *) trap 'rm -f makedefs.test makedefs.test.[co]' 1 2 3 15
758 cat >makedefs.test.c <<'EOF'
759 #include <setjmp.h>
760 #include <stdlib.h>
761 #include <stdio.h>
762
763 static int count = 0;
764
765 int main(int argc, char **argv)
766 {
767 sigjmp_buf env;
768 int retval;
769
770 switch (retval = sigsetjmp(env, 1)) {
771 case 0:
772 siglongjmp(env, 12345);
773 case 12345:
774 break;
775 default:
776 fprintf(stderr, "Error: siglongjmp ignores second argument\n");
777 exit(1);
778 }
779
780 switch (retval = sigsetjmp(env, 1)) {
781 case 0:
782 if (count++ > 0) {
783 fprintf(stderr, "Error: not overriding siglongjmp(env, 0)\n");
784 exit(1);
785 }
786 siglongjmp(env, 0);
787 case 1:
788 break;
789 default:
790 fprintf(stderr, "Error: overriding siglongjmp(env, 0) with %d\n",
791 retval);
792 exit(1);
793 }
794 exit(0);
795 }
796 EOF
797 ${CC-gcc} -o makedefs.test makedefs.test.c || exit 1
798 ./makedefs.test 2>/dev/null ||
799 CCARGS="$CCARGS -DNO_SIGSETJMP"
800 rm -f makedefs.test makedefs.test.[co]
801 esac
802
803 #
804 # Look for the ICU library and enable unicode email if available.
805 #
806 case "$CCARGS" in
807 *-DNO_EAI*) CCARGS="$CCARGS "'-DDEF_SMTPUTF8_ENABLE=\"no\"';;
808 *) icu_cppflags=`((pkg-config --cflags icu-uc icu-i18n) ||
809 (icu-config --cppflags)) 2>/dev/null` && {
810 icu_ldflags=`((pkg-config --libs icu-uc icu-i18n) ||
811 (icu-config --ldflags)) 2>/dev/null` && {
812 trap 'rm -f makedefs.test makedefs.test.[co]' 1 2 3 15
813 cat >makedefs.test.c <<'EOF'
814 #include <unicode/uidna.h>
815 #include <stdlib.h>
816
817 int main(int argc, char **argv)
818 {
819 char buf[1024];
820 UErrorCode error = U_ZERO_ERROR;
821 UIDNAInfo info = UIDNA_INFO_INITIALIZER;
822 UIDNA *idna = uidna_openUTS46(UIDNA_DEFAULT, &error);
823
824 exit(uidna_labelToUnicodeUTF8(idna,
825 "xn--lgbbat1ad8j", /* an arabic TLD */
826 15,
827 buf,
828 sizeof(buf),
829 &info,
830 &error) != 14);
831 }
832 EOF
833 ${CC-gcc} -o makedefs.test makedefs.test.c $icu_cppflags \
834 $icu_ldflags >/dev/null 2>&1
835 if ./makedefs.test 2>/dev/null ; then
836 CCARGS="$CCARGS $icu_cppflags"
837 SYSLIBS="$SYSLIBS $icu_ldflags"
838 else
839 CCARGS="$CCARGS -DNO_EAI"
840 fi
841 rm -f makedefs.test makedefs.test.[co]
842 }
843 } || CCARGS="$CCARGS -DNO_EAI"' -DDEF_SMTPUTF8_ENABLE=\"no\"'
844 esac
845
846 #
847 # OpenSSL has no configuration query utility, but we don't try to
848 # guess. We assume includes in /usr/include/openssl and libraries in
849 # /usr/lib, or in their /usr/local equivalents. If the OpenSSL files
850 # are in a non-standard place, their locations need to be specified.
851 #
852 #case "$CCARGS" in
853 # *-DUSE_TLS*) ;;
854 # *-DNO_TLS*) ;;
855 # *) CCARGS="$CCARGS -DUSE_TLS"
856 # AUXLIBS="$AUXLIBS -lssl -lcrypto"
857 # ;;
858 #esac
859
860 #
861 # We don't know all systems that have /dev/urandom, so we probe.
862 #
863 test -r /dev/urandom && CCARGS="$CCARGS -DHAS_DEV_URANDOM"
864
865 #
866 # PCRE 3.x has a pcre-config utility so we don't have to guess.
867 #
868 case "$CCARGS" in
869 *-DHAS_PCRE*) ;;
870 *-DNO_PCRE*) ;;
871 *) pcre_cflags=`(pcre-config --cflags) 2>/dev/null` &&
872 pcre_libs=`(pcre-config --libs) 2>/dev/null` && {
873 CCARGS="$CCARGS -DHAS_PCRE $pcre_cflags"
874 AUXLIBS_PCRE="$pcre_libs"
875 }
876 ;;
877 esac
878
879 # Defaults that can be overruled (make makefiles CC=cc OPT=-O6 DEBUG=)
880 # Disable optimizations by default when compiling for Purify. Disable
881 # optimizations by default with gcc 2.8, until the compiler is known to
882 # be OK. Those who dare can still overrule this (make makefiles OPT=-O).
883
884 case "$CC" in
885 *purify*) : ${OPT=};;
886 */gcc|gcc) case `$CC -v` in
887 "gcc version 2.8"*) : ${OPT=};;
888 esac;;
889 *CC) error "Don't use CC. That's the C++ compiler";;
890 *) : ${OPT='-O'};;
891 esac
892
893 # Snapshot only.
894 #CCARGS="$CCARGS -DSNAPSHOT"
895
896 # Non-production: needs thorough testing, or major changes are still
897 # needed before the code stabilizes.
898 #CCARGS="$CCARGS -DNONPROD"
899
900 # Workaround: prepend Postfix include files before other include files.
901 CCARGS="-I. -I../../include $CCARGS"
902
903 # Portability and usability considerations.
904 #
905 # In an ideal world we would be able to provide the option to say
906 # "make makefiles shlib_directory=/some/where/'$mail_version'". This
907 # would allow a running system to be upggraded without worries about
908 # tempororary program-library ABI incompatibilities (the Postfix
909 # library API changes incompatibly from one version to the next).
910 #
911 # Unfortunately, gmake performs macro expansion on values in name=value
912 # command-line arguments. In the specific example above, gmake would
913 # eat up the "$" and "m" before it even invokes makedefs, and it
914 # ould replace "'${mail_version}'" and "'$(mail_version)'" with
915 # nothing.
916 #
917 # Requiring people to specify $$ is not a good option. Instead we
918 # replace the string MAIL_VERSION at the end of parameter values in
919 # "make makefiles name=value...". The replacement depends on usage
920 # context: the expanded release version in actual pathnames, or the
921 # unexpanded ${mail_version} in configuration parameter values (both
922 # main.cf and and built-in defaults).
923
924 # Helper function to determine DEF_MAIL_VERSION.
925
926 def_mail_version()
927 {
928 trap 'rm -f makedefs.test makedefs.test.[co]' 1 2 3 15
929 cat > makedefs.test.c <<'EOF'
930 #include <stdlib.h>
931 #include <stdio.h>
932 EOF
933 # Avoid "nested comment" warnings. Top-of-file comments start in
934 # column 1 and have no code after "*/", not even in header files.
935 # If this is insufficient, kill the problem with #ifndef MAKEDEFS.
936 sed '/^\/\*/,/\*\//d' src/global/mail_version.h >>makedefs.test.c
937 cat >>makedefs.test.c <<EOF
938 #include <stdlib.h>
939 #include <stdio.h>
940 #include <string.h>
941 int main(void)
942 {
943 printf("%s\n", DEF_MAIL_VERSION);
944 fflush(stdout);
945 exit(ferror(stdout) ? 1 : 0);
946 }
947 EOF
948 eval ${CC-gcc} ${CCARGS} -o makedefs.test makedefs.test.c || exit 1
949 ./makedefs.test || exit 1
950 rm -f makedefs.test makedefs.test.[co]
951 }
952
953 # Helper to expand MAIL_VERSION at the end of a command-line parameter value.
954
955 # Note that MAIL_VERSION) does not anchor the match at the end.
956
957 process_input_parameter()
958 {
959 echo "#" $parm_name=$parm_val
960 case "$parm_val" in
961 *MAIL_VERSION*)
962 cparm_val=`echo "$parm_val" | \
963 sed 's/MAIL_VERSION$/\\\\$${mail_version}/g'`|| exit 1
964 case "$mail_version" in
965 "") mail_version=`def_mail_version` || exit 1
966 esac
967 parm_val=`echo "$parm_val" | sed 's/MAIL_VERSION$/'"$mail_version/g"` ||
968 exit 1
969 case "$parm_val" in
970 *MAIL_VERSION*)
971 error "MAIL_VERSION not at end of parameter value: $parm_val"
972 esac
973 eval ${parm_name}=\""\$parm_val"\";;
974 *) cparm_val="$parm_val";;
975 esac
976 CCARGS="$CCARGS -D$parm_macro=\\\"$cparm_val\\\""
977 }
978
979 # Optionally override installation-parameter default settings.
980
981 command_directory_macro=DEF_COMMAND_DIR
982 config_directory_macro=DEF_CONFIG_DIR
983 daemon_directory_macro=DEF_DAEMON_DIR
984 data_directory_macro=DEF_DATA_DIR
985 mail_spool_directory_macro=DEF_MAIL_SPOOL_DIR
986 mailq_path_macro=DEF_MAILQ_PATH
987 meta_directory_macro=DEF_META_DIR
988 newaliases_path_macro=DEF_NEWALIAS_PATH
989 queue_directory_macro=DEF_QUEUE_DIR
990 sendmail_path_macro=DEF_SENDMAIL_PATH
991 shlib_directory_macro=DEF_SHLIB_DIR
992 openssl_path_macro=DEF_OPENSSL_PATH
993
994 # shlib_directory is checked here because "no" is not a good answer.
995 # Instead, build with "dynamicmaps=no" and "shared=no" as appropriate.
996
997 for parm_name in command_directory config_directory daemon_directory \
998 data_directory mail_spool_directory mailq_path meta_directory \
999 newaliases_path queue_directory sendmail_path shlib_directory \
1000 openssl_path
1001 do
1002 eval parm_val=\"\$$parm_name\"
1003 eval parm_macro=\"\$${parm_name}_macro\"
1004 case "$parm_val" in
1005 "") ;;
1006 /*) process_input_parameter;;
1007 *) error "$parm_name must specify an absolute path name";;
1008 esac
1009 done
1010
1011 html_directory_macro=DEF_HTML_DIR
1012 manpage_directory_macro=DEF_MANPAGE_DIR
1013 readme_directory_macro=DEF_README_DIR
1014
1015 for parm_name in html_directory manpage_directory readme_directory
1016 do
1017 eval parm_val=\"\$$parm_name\"
1018 eval parm_macro=\"\$${parm_name}_macro\"
1019 case "$parm_val" in
1020 "") ;;
1021 /*|no) process_input_parameter;;
1022 *) error "$parm_name must specify \"no\" or an absolute path name";;
1023 esac
1024 done
1025
1026 default_database_type_macro=DEF_DB_TYPE
1027
1028 for parm_name in default_database_type
1029 do
1030 eval parm_val=\"\$$parm_name\"
1031 eval parm_macro=\"\$${parm_name}_macro\"
1032 case "$parm_val" in
1033 "") ;;
1034 *) process_input_parameter;;
1035 esac
1036 done
1037
1038 echo "# End of summary of user-configurable 'make makefiles' options."
1039 echo "#--------------------------------------------------------------"
1040
1041 # The following are for non-shared libsasl and libmilter builds.
1042
1043 _AR=$AR
1044 _RANLIB=$RANLIB
1045
1046 # Choose between dynamic and static library builds.
1047
1048 case "$dynamicmaps" in
1049 yes) shared=yes;;
1050 ""|no) ;;
1051 *) error "Specify \"dynamicmaps=yes\" or \"dynamicmaps=no\"";;
1052 esac
1053
1054 case "$shared" in
1055 yes)
1056 if [ -z "$SHLIB_SUFFIX" ]
1057 then
1058 error "Shared libraries are requested, but not supported on this platform"
1059 fi
1060 AR=:
1061 RANLIB=:
1062 CCARGS="$CCARGS -DUSE_DYNAMIC_LIBS"
1063 case "$dynamicmaps" in
1064 yes) NON_PLUGIN_MAP_OBJ=
1065 PLUGIN_MAP_OBJ='$(MAP_OBJ)'
1066 PLUGIN_MAP_OBJ_UPDATE=plugin_map_obj_update
1067 PLUGIN_MAP_SO_MAKE=plugin_map_so_make
1068 PLUGIN_MAP_SO_UPDATE=plugin_map_so_update
1069 CCARGS="$CCARGS -DUSE_DYNAMIC_MAPS"
1070 ;;
1071 *) NON_PLUGIN_MAP_OBJ='$(MAP_OBJ)'
1072 PLUGIN_MAP_OBJ=
1073 PLUGIN_MAP_OBJ_UPDATE=
1074 PLUGIN_MAP_SO_MAKE=
1075 PLUGIN_MAP_SO_UPDATE=
1076 PLUGIN_LD=
1077 CCARGS="$CCARGS -UUSE_DYNAMIC_MAPS"
1078 ;;
1079 esac
1080
1081 # Determine the dynamically-linked library and plugin installation
1082 # directory.
1083
1084 parm_name=shlib_directory
1085 eval parm_val=\"\$$parm_name\"
1086 eval parm_macro=\"\$${parm_name}_macro\"
1087 case "$parm_val" in
1088 /*|no) # CCARGS was already updated above.
1089 ;;
1090 "") trap 'rm -f makedefs.test makedefs.test.[co]' 1 2 3 15
1091 sed -n '
1092 /_SHLIB_DIR/,/^$/p
1093 ' src/global/mail_params.h >makedefs.test.c
1094 cat >>makedefs.test.c <<EOF
1095 #include <stdlib.h>
1096 #include <stdio.h>
1097 int main(void)
1098 {
1099 printf("%s\n", $parm_macro);
1100 fflush(stdout);
1101 exit(ferror(stdout) ? 1 : 0);
1102 }
1103 EOF
1104 eval ${CC-gcc} ${CCARGS} -o makedefs.test makedefs.test.c || exit 1
1105 parm_val=`./makedefs.test` || exit 1
1106 rm -f makedefs.test makedefs.test.[co]
1107 eval ${parm_name}=\""\$parm_val"\"
1108 #CCARGS="$CCARGS -D$parm_macro=\\\"$parm_val\\\""
1109 ;;
1110 *) # this parameter was already checked above.
1111 error "Can't happen in $0 - $parm_val is not an absolute path"
1112 ;;
1113 esac
1114
1115 LIB_PREFIX=postfix-
1116 LIB_SUFFIX=${SHLIB_SUFFIX}
1117 ;;
1118
1119 no|"")
1120 shlib_directory=no
1121 CCARGS="$CCARGS -UUSE_DYNAMIC_LIBS -DDEF_SHLIB_DIR=\\\"no\\\""
1122 CCARGS="$CCARGS -UUSE_DYNAMIC_MAPS"
1123 SHLIB_CFLAGS=
1124 SHLIB_SUFFIX=
1125 SHLIB_LD=:
1126 SHLIB_SYSLIBS=
1127 SHLIB_RPATH=
1128 SHLIB_ENV=
1129 LIB_PREFIX=
1130 LIB_SUFFIX=.a
1131 NON_PLUGIN_MAP_OBJ='$(MAP_OBJ)'
1132 PLUGIN_MAP_OBJ=
1133 PLUGIN_MAP_OBJ_UPDATE=
1134 PLUGIN_MAP_SO_MAKE=
1135 PLUGIN_MAP_SO_UPDATE=
1136 PLUGIN_LD=
1137 ;;
1138
1139 *) error "Specify \"shared=yes\" or \"shared=no\""
1140 ;;
1141 esac
1142
1143 # "gcc -W" 3.4.2 no longer reports functions that fail to return a
1144 # result. Use "gcc -Wall -Wno-comment" instead. We'll figure out
1145 # later if the other -Wmumble options are really redundant. Having
1146 # een burned once by a compiler that lies about what warnings it
1147 # produces, not taking that chance again.
1148
1149 : ${CC=gcc} ${OPT='-O'} ${DEBUG='-g'} ${AWK=awk} \
1150 ${WARN='-Wall -Wno-comment -Wformat -Wimplicit -Wmissing-prototypes \
1151 -Wparentheses -Wstrict-prototypes -Wswitch -Wuninitialized \
1152 -Wunused -Wno-missing-braces -fcommon'}
1153
1154 # Extract map type names from -DHAS_XXX compiler options. We avoid
1155 # problems with tr(1) range syntax by using enumerations instead,
1156 # and we don't try to figure out which awk versions have tolower().
1157 # The following was validated in 2014 on FreeBSD/Linux and Solaris 9.
1158
1159 DEFINED_MAP_TYPES=`
1160 echo $CCARGS | tr -cd '\- _ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' |
1161 tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | ${AWK} '
1162 { for (n = 1; n <= NF; n++)
1163 if ($n ~ /^-dhas_/)
1164 if (seen[name = substr($n, 7)]++ == 0)
1165 printf(" %s", name) }
1166 '`
1167
1168 # Propagate AUXLIBS_FOO or merge them into global AUXLIBS (i.e. SYSLIBS).
1169
1170 PLUGGABLE_MAPS="CDB LDAP LMDB MYSQL PCRE PGSQL SDBM SQLITE"
1171
1172 case "$dynamicmaps" in
1173 yes) for name in $PLUGGABLE_MAPS
1174 do
1175 eval test -n "\"\$AUXLIBS_$name\"" &&
1176 eval PLUGIN_AUXLIBS="\"\$PLUGIN_AUXLIBS
1177 AUXLIBS_$name = \$AUXLIBS_$name\""
1178 done;;
1179 *) for name in $PLUGGABLE_MAPS
1180 do
1181 eval AUXLIBS="\"\$AUXLIBS \$AUXLIBS_$name\""
1182 done;;
1183 esac
1184
1185 # Remove static libraries from SYSLIBS when building shared objects,
1186 # Can't use the shell "case" patterns to detect names ending in *.a.
1187
1188 case "$shared" in
1189 yes) SHLIB_SYSLIBS=`${AWK} '
1190 BEGIN { wc = split("'"$AUXLIBS $SYSLIBS"'", words)
1191 for (n = 1; n <= wc; n++)
1192 if (words[n] !~ /\.a$/)
1193 printf(" %s", words[n])
1194 }
1195 '`
1196 esac
1197
1198 # Choose between PIE and non-PIE builds.
1199
1200 case "$pie" in
1201 yes) case "$shared" in
1202 yes) CCARGS_PIE="-fPIC";;
1203 *) CCARGS_PIE="-fPIE";;
1204 esac
1205 case " $CCARGS " in
1206 *" $CCARGS_PIE "*) CCARGS_PIE=;;
1207 esac
1208 SYSLIBS_PIE="-pie";;
1209 ""|no) ;;
1210 *) error "Specify \"pie=yes\" or \"pie=no\"";;
1211 esac
1212
1213 # Don't permit random overrides.
1214 allowed_user_install_opts="-keep-build-mtime"
1215 for opt in $POSTFIX_INSTALL_OPTS
1216 do
1217 (for allowed in -keep-build-mtime
1218 do
1219 test "$opt" = "$allowed" && exit 0
1220 done; exit 1) || error "invalid option '$opt' in POSTFIX_INSTALL_OPTS"
1221 done
1222
1223 # Finally...
1224
1225 sed 's/ */ /g' <<EOF
1226 # System-dependent settings and compiler/linker overrides.
1227 SYSTYPE = $SYSTYPE
1228 _AR = $_AR
1229 ARFL = $ARFL
1230 _RANLIB = $_RANLIB
1231 SYSLIBS = $SYSLIBS_PIE $AUXLIBS $SYSLIBS $PLUGIN_AUXLIBS
1232 CC = $CC $CCARGS_PIE $CCARGS \$(WARN)
1233 OPT = $OPT
1234 DEBUG = $DEBUG
1235 AWK = $AWK
1236 STRCASE = $STRCASE
1237 EXPORT = CCARGS='$CCARGS' OPT='$OPT' DEBUG='$DEBUG'
1238 WARN = $WARN
1239 DEFINED_MAP_TYPES = $DEFINED_MAP_TYPES
1240 MAKE_FIX = $MAKE_FIX
1241 # Switch between Postfix static and dynamically-linked libraries.
1242 AR = $AR
1243 RANLIB = $RANLIB
1244 LIB_PREFIX = $LIB_PREFIX
1245 LIB_SUFFIX = $LIB_SUFFIX
1246 SHLIB_CFLAGS = $SHLIB_CFLAGS
1247 SHLIB_DIR = $shlib_directory
1248 SHLIB_ENV = $SHLIB_ENV
1249 SHLIB_LD = $SHLIB_LD
1250 SHLIB_SYSLIBS = $SHLIB_SYSLIBS
1251 SHLIB_RPATH = $SHLIB_RPATH
1252 # Switch between dynamicmaps.cf plugins and hard-linked databases.
1253 NON_PLUGIN_MAP_OBJ = $NON_PLUGIN_MAP_OBJ
1254 PLUGIN_MAP_OBJ = $PLUGIN_MAP_OBJ
1255 PLUGIN_MAP_OBJ_UPDATE = $PLUGIN_MAP_OBJ_UPDATE
1256 PLUGIN_MAP_SO_MAKE = $PLUGIN_MAP_SO_MAKE
1257 PLUGIN_MAP_SO_UPDATE = $PLUGIN_MAP_SO_UPDATE
1258 PLUGIN_LD = $PLUGIN_LD
1259 POSTFIX_INSTALL_OPTS = $POSTFIX_INSTALL_OPTS
1260 # Application-specific rules.
1261 EOF
1262