Glue channel bindings into the TTLS code
[freeradius.git] / scripts / libtool.mk
1 # Copyright 2008, 2009, 2010 Dan Moulding, Alan T. DeKok
2 #
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation, either version 3 of the License, or
6 # (at your option) any later version.
7 #
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 # GNU General Public License for more details.
12 #
13 # You should have received a copy of the GNU General Public License
14 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
16 # Add these rules only when LIBTOOL is being used.
17 ifneq "${LIBTOOL}" ""
18
19 # JLIBTOOL - check if we're using the local (fast) jlibtool, rather
20 #   than the GNU (slow) libtool shell script.  If so, add rules
21 #   to build it.
22
23 ifeq "${LIBTOOL}" "JLIBTOOL"
24     JLIBTOOL := ${BUILD_DIR}/make/jlibtool
25
26     # Add a rule to build jlibtool BEFORE any other targets.  This
27     # means that we can use it to build the later targets.
28     all install: ${JLIBTOOL}
29
30     # Note that we need to use a compilation rule that does NOT
31     # include referencing ${LIBTOOL}, as we don't have a jlibtool
32     # binary!
33     ${JLIBTOOL}: ${top_makedir}/jlibtool.c
34         $(Q)mkdir -p $(dir $@)
35         $(Q)echo CC jlibtool.c
36         $(Q)${CC} $< -o $@
37
38     clean: jlibtool_clean
39
40     .PHONY: jlibtool_clean
41     jlibtool_clean:
42         $(Q)rm -f ${JLIBTOOL}
43
44     # Tell GNU Make to use this value, rather than anything specified
45     # on the command line.
46     override LIBTOOL := ${JLIBTOOL}
47 endif    # else we're not using jlibtool
48
49 # When using libtool, it produces a '.libs' directory.  Ensure that it
50 # is removed on "make clean", too.
51 #
52 clean: .libs_clean
53
54 .PHONY: .libs_clean
55 .libs_clean:
56         $(Q)rm -rf ${BUILD_DIR}/.libs/
57
58 # Re-define compilers and linkers
59 #
60 OBJ_EXT = lo
61 COMPILE.c = ${LIBTOOL} --silent --mode=compile ${CC}
62 COMPILE.cxx = ${LIBTOOL} --mode=compile ${CXX}
63 LINK.c = ${LIBTOOL} --silent --mode=link ${CC}
64 LINK.cxx = ${LIBTOOL} --mode=link ${CXX}
65 PROGRAM_INSTALL = ${LIBTOOL} --silent --mode=install ${INSTALL}
66
67
68 # LIBTOOL_ENDINGS - Given a library ending in ".a" or ".so", replace that
69 #   extension with ".la".
70 #
71 define LIBTOOL_ENDINGS
72 $(patsubst %.a,%.la,$(patsubst %.so,%.la,${1}))
73 endef
74
75 # ADD_TARGET_RULE.la - Build a ".la" target.
76 #
77 #   USE WITH EVAL
78 #
79 define ADD_TARGET_RULE.la
80     # So "make ${1}" works
81     .PHONY: ${1}
82     ${1}: $${${1}_BUILD}/${1}
83
84     # Create libtool library ${1}
85     $${${1}_BUILD}/${1}: $${${1}_OBJS} $${${1}_PRLIBS}
86             @$(strip mkdir -p $(dir $${${1}_BUILD}/${1}))
87             @$(ECHO) LINK $${${1}_BUILD}/${1}
88             @$${${1}_LINKER} -o $${${1}_BUILD}/${1} $${RPATH_FLAGS} $${LDFLAGS} \
89                 $${${1}_LDFLAGS} $${${1}_OBJS} $${LDLIBS} $${${1}_LDLIBS} \
90                 $${${1}_PRLIBS}
91             @$${${1}_POSTMAKE}
92
93     ifneq "${ANALYZE.c}" ""
94         scan.${1}: $${${1}_PLISTS}
95     endif
96 endef
97
98 # ADD_RELINK_RULE.exe - Parametric "function" that adds a rule to relink
99 #   the target before installation, so that the paths are correct.
100 #
101 #   USE WITH EVAL
102 #
103 define ADD_RELINK_RULE.exe
104     ${1}: $${${1}_BUILD}/$${RELINK}${1}
105
106     # used to fix up RPATH for ${1} on install.
107     $${${1}_BUILD}/$${${1}_RELINK}: $${${1}_OBJS} $${${1}_PRBIN} $${${1}_R_PRLIBS}
108             @$(strip mkdir -p $${${1}_BUILD}/${RELINK}/)
109             @$${${1}_LINKER} -o $${${1}_BUILD}/$${RELINK}${1} $${RELINK_FLAGS} $${LDFLAGS} \
110                 $${${1}_LDFLAGS} $${${1}_OBJS} $${${1}_R_PRLIBS} \
111                 $${LDLIBS} $${${1}_LDLIBS}
112             @$${${1}_POSTMAKE}
113 endef
114
115 # ADD_RELINK_RULE.la - Parametric "function" that adds a rule to relink
116 #   the target before installation, so that the paths are correct.
117 #
118 #   USE WITH EVAL
119 #
120 define ADD_RELINK_RULE.la
121     ${1}: $${${1}_BUILD}/$${RELINK}${1}
122
123     # used to fix up RPATH for ${1} on install.
124     $${${1}_BUILD}/$${${1}_RELINK}: $${${1}_OBJS} $${${1}_PRLIBS}
125             @$(strip mkdir -p $${${1}_BUILD}/${RELINK}/)
126             @$${${1}_LINKER} -o $${${1}_BUILD}/$${RELINK}${1} $${RELINK_FLAGS} $${LDFLAGS} \
127                 $${${1}_LDFLAGS} $${${1}_OBJS} $${LDLIBS} $${${1}_LDLIBS}
128             @$${${1}_POSTMAKE}
129
130 endef
131
132 # By default, if libdir is defined, we build shared libraries.
133 # However, we can disable shared libraries if explicitly told to.
134 ifneq "${libdir}" ""
135     ifneq "${bm_shared_libs}" "no"
136         bm_shared_libs := yes
137     endif
138 endif
139
140 # Default to building static libraries, too.
141 ifneq "${bm_static_libs}" "no"
142     bm_static_libs := yes
143 endif
144
145 # Check if we build shared libraries.
146 ifeq "${bm_shared_libs}" "yes"
147     RELINK := local/
148
149     # RPATH  : flags use to build executables that are installed,
150     #          with no dependency on the source.
151     # RELINL : flags use to build executables that can be run
152     #          from the build directory / source tree.
153     RPATH_FLAGS := -rpath ${libdir}
154     RELINK_FLAGS := -rpath $(abspath ${BUILD_DIR})/lib/${RELINK}/.libs
155
156     RELINK_FLAGS_MIN := -rpath ${libdir}
157
158     ifneq "${bm_static_libs}" "yes"
159         RPATH_FLAGS += --shared
160         RELINK_FLAGS += --shared
161     endif
162 else
163     ifneq "${bm_static_libs}" "yes"
164         $(error Building without static libraries requires you to set 'INSTALL' or 'libdir')
165     endif
166
167     RPATH_FLAGS := -static
168 endif
169
170 # UPDATE_TARGET_ENDINGS - Function to turn target into a libtool target
171 #   e.g. "libfoo.a" -> libfoo.la"
172 #
173 #   If the target is an executable, then its extension doesn't change
174 #   when we use libtool, and we don't do any re-writing.
175 #
176 #   USE WITH EVAL
177 #
178 define ADD_LIBTOOL_SUFFIX
179     ifneq "$$(call LIBTOOL_ENDINGS,$${TGT})" "$${TGT}"
180         TGT_NOLIBTOOL := $${TGT}
181         TGT := $$(call LIBTOOL_ENDINGS,$${TGT})
182         $${TGT}_NOLIBTOOL := $${TGT_NOLIBTOOL}
183     endif
184
185     ifneq "$${RELINK_FLAGS}" ""
186         $${TGT}_RELINK := ${RELINK}$${TGT}
187     endif
188
189     # re-write all of the dependencies to have the libtool endings.
190     TGT_PREREQS := $$(call LIBTOOL_ENDINGS,$${TGT_PREREQS})
191 endef
192
193 # ADD_LIBTOOL_TARGET - Function to ensure that the object files depend
194 #   on our jlibtool target.  This ensures that jlibtool is built before
195 #   it's used to build the object files.
196 #
197 #   USE WITH EVAL
198 #
199 define ADD_LIBTOOL_TARGET
200     ifneq "${JLIBTOOL}" ""
201         $${$${TGT}_OBJS}: $${JLIBTOOL}
202     endif
203
204     ifneq "$${$${TGT}_NOLIBTOOL}" ""
205         $$(notdir $${$${TGT}_NOLIBTOOL}): $${TGT}
206     endif
207
208     # If we need to relink, add the relink targets now.
209     ifneq "$${$${TGT}_RELINK}" ""
210         # add rules to relink the target
211
212         $${TGT}_R_PRLIBS := $$(subst /lib/,/lib/${RELINK},$${$${TGT}_PRLIBS})
213
214         $$(eval $$(call ADD_RELINK_RULE$${$${TGT}_SUFFIX},$${TGT}))
215
216         $$(eval $$(call ADD_CLEAN_RULE,$${$${TGT}_RELINK}_libtool))
217
218         ifneq "$${$${TGT}_NOLIBTOOL}" ""
219             $$(eval $$(call ADD_CLEAN_RULE,$${$${TGT}_NOLIBTOOL}_libtool))
220         endif
221     endif
222
223 endef
224
225
226 endif