Summary: minor, rewrite linker checks to use the compiler front-end and XFLAG
[sxemacs] / m4 / sxe-linker.m4
1 dnl sxe-linker.m4 -- Linker stuff, esp. dynamic linking
2 dnl needed for emodules for one
3
4 AC_DEFUN([SXE_CHECK_LINKER_FLAGS], [dnl
5 dnl just like SXE_CHECK_COMPILER_FLAGS but calls the linker
6         AC_MSG_CHECKING([whether linker accepts $1])
7
8         dnl Some hackery here since AC_CACHE_VAL can't handle a non-literal varname:
9         SXE_LANG_WERROR([push+on])
10         AS_LITERAL_IF([$1], [
11                 AC_CACHE_VAL(AS_TR_SH(sxe_cv_[]_AC_LANG_ABBREV[]_flags_$1), [
12                         sxe_save_FLAGS=$[]_AC_LANG_PREFIX[]FLAGS
13                         _AC_LANG_PREFIX[]FLAGS="${XFLAG} $1"
14                         AC_LINK_IFELSE([AC_LANG_PROGRAM()],
15                                 AS_TR_SH(sxe_cv_[]_AC_LANG_ABBREV[]_flags_$1)="yes",
16                                 AS_TR_SH(sxe_cv_[]_AC_LANG_ABBREV[]_flags_$1)="no")
17                         _AC_LANG_PREFIX[]FLAGS=$sxe_save_FLAGS])], [
18                 sxe_save_FLAGS=$[]_AC_LANG_PREFIX[]FLAGS
19                 _AC_LANG_PREFIX[]FLAGS="$1"
20                 AC_LINK_IFELSE([AC_LANG_PROGRAM()],
21                         eval AS_TR_SH(sxe_cv_[]_AC_LANG_ABBREV[]_flags_$1)="yes",
22                         eval AS_TR_SH(sxe_cv_[]_AC_LANG_ABBREV[]_flags_$1)="no")
23                 _AC_LANG_PREFIX[]FLAGS=$sxe_save_FLAGS])
24         eval sxe_check_linker_flags=$AS_TR_SH(sxe_cv_[]_AC_LANG_ABBREV[]_flags_$1)
25         SXE_LANG_WERROR([pop])
26
27         AC_MSG_RESULT([$sxe_check_linker_flags])
28         if test "$sxe_check_linker_flags" = "yes"; then
29                 m4_default([$2], :)
30         else
31                 m4_default([$3], :)
32         fi
33 ])dnl SXE_CHECK_LINKER_FLAGS
34
35
36 AC_DEFUN([SXE_CHECK_LD_ZFLAG], [dnl
37         pushdef([LD_ZFLAG], [$1])
38         pushdef([cv_zflag], [sxe_cv_ld__z_]translit(LD_ZFLAG,[-.=],[___]))
39
40         AC_CACHE_CHECK([whether linker supports -z ]LD_ZFLAG[],
41                 []cv_zflag[], [_SXE_CHECK_LD_ZFLAG(LD_ZFLAG)])
42
43         popdef([cv_zflag])
44         popdef([LD_ZFLAG])
45 ])dnl SXE_CHECK_LD_ZFLAG
46
47 AC_DEFUN([_SXE_CHECK_LD_ZFLAG], [dnl
48         ## arg1 is the flag to check for
49         pushdef([LD_ZFLAG], [$1])
50         pushdef([cv_zflag], [sxe_cv_ld__z_]translit(LD_ZFLAG,[-.=],[___]))
51
52         SXE_CHECK_LINKER_FLAGS([-z ]LD_ZFLAG[])
53
54 dnl     if test "$GCC" = "yes"; then
55 dnl             if test "($CC -Xlinker --help 2>&1 | \
56 dnl                     grep \"-z []LD_ZFLAG[]\" > /dev/null 2>&1 ) "; then
57 dnl                     cv_zflag="yes"
58 dnl             else
59 dnl                     cv_zflag="no"
60 dnl             fi
61 dnl     elif test -n "$LD"; then
62 dnl             if test "($LD --help 2>&1 | \
63 dnl                     grep \"-z []LD_ZFLAG[]\" > /dev/null 2>&1 )"; then
64 dnl                     cv_zflag="yes"
65 dnl             else
66 dnl                     cv_zflag="no"
67 dnl             fi
68 dnl     else
69 dnl             cv_zflag="no"
70 dnl     fi
71
72         popdef([cv_zflag])
73         popdef([LD_ZFLAG])
74 ])dnl _SXE_CHECK_LD_ZFLAG
75
76
77 AC_DEFUN([SXE_CHECK_LDFLAGS], [dnl
78         ## if libtool then
79         case "${LD}" in
80         *"libtool"*)
81                 XFLAG="-XCClinker"
82                 ;;
83         *"ld"*)
84                 ## no XFLAG needed
85                 ;;
86         *)
87                 XFLAG="-Xlinker"
88                 ;;
89         esac
90
91         ## relocation
92         SXE_CHECK_LD_ZFLAG([combreloc])
93         SXE_CHECK_LD_ZFLAG([nocombreloc])
94         ## symbols
95         SXE_CHECK_LD_ZFLAG([defs])
96         SXE_CHECK_LD_ZFLAG([muldefs])
97         ## search paths
98         SXE_CHECK_LD_ZFLAG([nodefaultlib])
99         ## binding policy
100         SXE_CHECK_LD_ZFLAG([lazy])
101         SXE_CHECK_LD_ZFLAG([now])
102
103         ## icc related
104         ## default flags for needed features
105         SXE_CHECK_LINKER_FLAGS([-static-intel], [
106                 ldflags="${ldflags} ${XFLAG} -static-intel"])
107         SXE_CHECK_LINKER_FLAGS([-static-libgcc], [
108                 ldflags="${ldflags} ${XFLAG} -static-libgcc"])
109
110         LDFLAGS="${ldflags} ${ac_cv_env_LDFLAGS_value}"
111         AC_MSG_CHECKING([for preferred LDFLAGS])
112         AC_MSG_RESULT([${LDFLAGS}])
113
114         AC_MSG_NOTICE([
115 If you wish to ADD your own flags you want to stop here and rerun the
116 configure script like so:
117   configure LDFLAGS=<to-be-added-flags>
118
119 You can always override the determined LDFLAGS, partially or totally,
120 using
121   make -C <directory> LDFLAGS=<your-own-flags> [target]
122 or
123   make LDFLAGS=<your-own-flags> [target]
124 respectively
125
126 NOTE: -C <directory> option is not available on all systems
127                 ])
128 ])dnl SXE_CHECK_LDFLAGS
129
130 AC_DEFUN([SXE_PREPEND_LINKER_FLAG], [dnl
131         ## a convenience function to add such linker flags to variables
132         ## arg1 is the flag to add (must include -z if applicable)
133         ## arg2 is the variable whither to prepend
134         pushdef([FLAG], [$1])
135         pushdef([__FLAG], [-Wl,]patsubst([$1], [ ], [[,]]))
136         pushdef([VAR], [$2])
137
138         []VAR[]="[]__FLAG[] $[]VAR[]"
139         if test "$extra_verbose" = "yes"; then
140                 echo "    Prepending linker flag \"[]__FLAG[]\" to \$[]VAR[]"
141         fi
142
143         popdef([VAR])
144         popdef([__FLAG])
145         popdef([FLAG])
146 ])dnl SXE_PREPEND_LINKER_FLAG
147
148 dnl sxe-linker.m4 ends here