Imported Upstream version 2.4.2
[platform/upstream/libtool.git] / tests / template.at
1 # template.at -- test C++ templates with libtool              -*- Autotest -*-
2 #
3 #   Copyright (C) 2005, 2007, 2008 Free Software Foundation, Inc.
4 #   Written by Markus Christen, 2005
5 #
6 #   This file is part of GNU Libtool.
7 #
8 # GNU Libtool is free software; you can redistribute it and/or
9 # modify it under the terms of the GNU General Public License as
10 # published by the Free Software Foundation; either version 2 of
11 # the License, or (at your option) any later version.
12 #
13 # GNU Libtool is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 # GNU General Public License for more details.
17 #
18 # You should have received a copy of the GNU General Public License
19 # along with GNU Libtool; see the file COPYING.  If not, a copy
20 # can be downloaded from  http://www.gnu.org/licenses/gpl.html,
21 # or obtained by writing to the Free Software Foundation, Inc.,
22 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23 ####
24
25 AT_BANNER([C++ template tests.])
26
27 AT_SETUP([simple template test])
28 LT_AT_TAG([CXX])
29 AT_KEYWORDS([libtool])
30
31 AT_DATA(aclib.h,
32 [[int cf(int);
33 ]])
34
35 AT_DATA(aclib.cpp,
36 [[#include "aclib.h"
37 template<typename T>
38
39 T cq(T b)
40 {
41   return b * 3;
42 }
43
44 int cf(int i)
45 {
46   return cq(i);
47 }
48 ]])
49
50 AT_DATA(alib.h,
51 [[int f(int);
52 ]])
53
54 AT_DATA(alib.cpp,
55 [[#include "alib.h"
56
57 template<typename T>
58 T q(T b)
59 {
60   return b * 2;
61 }
62
63 int f(int i)
64 {
65   return q(i);
66 }
67 ]])
68
69 AT_DATA(prog.cpp,
70 [[#include "alib.h"
71 #include "aclib.h"
72
73 int main()
74 {
75   return f(3) + 3 - cf(3) != 0;
76 }
77 ]])
78
79 AT_CHECK([$LIBTOOL --tag=CXX --mode=compile $CXX -I. $CPPFLAGS $CXXFLAGS -c -o alib.lo alib.cpp],
80          [0], [ignore], [ignore])
81 AT_CHECK([$LIBTOOL --tag=CXX --mode=compile $CXX -I. $CPPFLAGS $CXXFLAGS -c -o aclib.lo aclib.cpp],
82          [0], [ignore], [ignore])
83 AT_CHECK([$LIBTOOL --tag=CXX --mode=link $CXX $CPPFLAGS $CXXFLAGS $LDFLAGS -o libaclib.la aclib.lo],
84          [0], [ignore], [ignore])
85 AT_CHECK([$LIBTOOL --tag=CXX --mode=link $CXX $CPPFLAGS $CXXFLAGS $LDFLAGS -o libalib.la -rpath /nonexistent alib.lo libaclib.la],
86          [0], [ignore], [ignore])
87 AT_CHECK([$CXX -I. $CPPFLAGS $CXXFLAGS -c prog.cpp],
88          [0], [ignore], [ignore])
89 AT_CHECK([$LIBTOOL --tag=CXX --mode=link $CXX $CPPFLAGS $CXXFLAGS $LDFLAGS -o prog$EXEEXT prog.$OBJEXT libalib.la],
90          [0], [ignore], [ignore])
91
92 LT_AT_EXEC_CHECK([./prog], [0], [ignore], [ignore])
93
94
95 dnl with autoreconf, use:
96
97 dnl AT_DATA(configure.ac,
98 dnl [[AC_INIT([template_1], ]]AT_PACKAGE_VERSION[[, ]]AT_PACKAGE_BUGREPORT[[)
99 dnl AC_CONFIG_HEADERS([config.h:config-h.in])
100 dnl AC_CONFIG_MACRO_DIR([m4])
101 dnl AC_CONFIG_AUX_DIR([config])
102 dnl AM_INIT_AUTOMAKE([foreign])
103 dnl AC_LANG([C++])
104 dnl AC_PROG_CXX
105 dnl AC_PROG_LIBTOOL
106 dnl AC_CONFIG_FILES([Makefile])
107 dnl AC_OUTPUT
108 dnl ]])
109
110 dnl AT_DATA(Makefile.am,
111 dnl [[ACLOCAL_AMFLAGS = -I m4
112 dnl noinst_LTLIBRARIES = libaclib.la
113 dnl libaclib_la_SOURCES = aclib.cpp aclib.h
114 dnl lib_LTLIBRARIES = libalib.la
115 dnl include_HEADERS = alib.h
116 dnl libalib_la_SOURCES = alib.cpp
117 dnl libalib_la_LIBADD = libaclib.la
118 dnl bin_PROGRAMS = prog
119 dnl prog_SOURCES = prog.cpp
120 dnl LDADD = libalib.la
121 dnl ]])
122
123 AT_CLEANUP
124
125
126 AT_SETUP([template test with subdirs])
127 LT_AT_TAG([CXX])
128 AT_KEYWORDS([libtool])
129
130 noskip=:
131 # Mac OS X.
132 # The linker has issues with this test. 
133 case $host in
134 *-darwin*) noskip=false ;;
135 esac
136
137
138 CPPFLAGS="$CPPFLAGS -I../src/lib -I../src/lib2"
139
140 mkdir src obj
141 ( cd src; mkdir lib lib2 sub )
142 ( cd obj; mkdir lib lib2 sub )
143
144 AT_DATA(src/lib/a.hh,
145 [[template <class T>
146 unsigned int a(const T&);
147
148 template <class T>
149 unsigned int a(const T& t)
150 {
151   return sizeof t;
152 }
153
154 extern int a2(char t);
155
156 inline int a3(const double* t)
157 {
158   return a(t);
159 }
160 ]])
161
162 AT_DATA(src/lib/a.cpp,
163 [[#include "a.hh"
164
165 int a2(char t)
166 {
167   return a(t);
168 }
169 ]])
170
171 AT_DATA(src/lib2/b.hh,
172 [[#include "a.hh"
173
174 template <class T>
175 unsigned int b(T& t)
176 {
177   return a(t);
178 }
179 extern int b2(char* t);
180 struct bs { int bi; };
181 extern int b3(bs t);
182 ]])
183
184 AT_DATA(src/lib2/b.cpp,
185 [[#include "b.hh"
186
187 int b2(char* t)
188 {
189   return a2(t[0]);
190 }
191
192 int b3(bs t)
193 {
194   return b(t);
195 }
196 ]])
197
198 AT_DATA(src/sub/main.cpp,
199 [[#include "b.hh"
200
201 int main()
202 {
203   double foo;
204   const char s = ' ';
205   char d;
206   char *t = &d;
207   return b(foo) + a3(&foo) + b2(t) - a(s)
208          - (sizeof(double) + sizeof(double*));
209 }
210 ]])
211
212 cd obj
213
214 # If the compiler supports -c -o, we want to use it:
215 # it may make a difference for templates
216 eval `$LIBTOOL --tag=CXX --config | grep ^compiler_c_o=`
217 case $compiler_c_o in
218 yes)
219   main_o=sub/main.$OBJEXT
220   AT_CHECK([$CXX $CPPFLAGS $CXXFLAGS -c -o $main_o ../src/sub/main.cpp],
221            [0], [ignore], [ignore])
222   ;;
223 *)
224   main_o=main.$OBJEXT
225   AT_CHECK([$CXX $CPPFLAGS $CXXFLAGS -c ../src/sub/main.cpp],
226            [0], [ignore], [ignore])
227   ;;
228 esac
229
230 AT_CHECK([$LIBTOOL --tag=CXX --mode=compile $CXX $CPPFLAGS $CXXFLAGS -c -o lib/a.lo ../src/lib/a.cpp],
231          [0], [ignore], [ignore])
232 AT_CHECK([$LIBTOOL --tag=CXX --mode=compile $CXX $CPPFLAGS $CXXFLAGS -c -o lib2/b.lo ../src/lib2/b.cpp],
233          [0], [ignore], [ignore])
234 AT_CHECK([$CXX $CPPFLAGS $CXXFLAGS -c ../src/sub/main.cpp],
235          [0], [ignore], [ignore])
236 # both convenience
237 AT_CHECK([$LIBTOOL --tag=CXX --mode=link $CXX $CXXFLAGS $LDFLAGS -o lib/liba.la lib/a.lo],
238          [0], [ignore], [ignore])
239 AT_CHECK([$LIBTOOL --tag=CXX --mode=link $CXX $CXXFLAGS $LDFLAGS -o lib2/libb.la lib2/b.lo],
240          [0], [ignore], [ignore])
241 AT_CHECK([$LIBTOOL --tag=CXX --mode=link $CXX $CXXFLAGS $LDFLAGS -o sub/main$EXEEXT $main_o lib2/libb.la lib/liba.la],
242          [0], [ignore], [ignore])
243 LT_AT_EXEC_CHECK([./sub/main], [ignore])
244 # lib convenience
245 if $noskip; then
246   AT_CHECK([$LIBTOOL --tag=CXX --mode=link $CXX $CXXFLAGS $LDFLAGS -o lib2/libb.la lib2/b.lo -rpath /foo],
247            [0], [ignore], [ignore])
248   AT_CHECK([$LIBTOOL --tag=CXX --mode=link $CXX $CXXFLAGS $LDFLAGS -o sub/main$EXEEXT $main_o lib2/libb.la lib/liba.la],
249            [0], [ignore], [ignore])
250   LT_AT_EXEC_CHECK([./sub/main])
251 fi
252
253 # both installed
254 AT_CHECK([$LIBTOOL --tag=CXX --mode=link $CXX $CXXFLAGS $LDFLAGS -o lib/liba.la lib/a.lo -rpath /foo],
255          [0], [ignore], [ignore])
256 AT_CHECK([$LIBTOOL --tag=CXX --mode=link $CXX $CXXFLAGS $LDFLAGS -o lib2/libb.la lib2/b.lo -rpath /bar],
257          [0], [ignore], [ignore])
258 AT_CHECK([$LIBTOOL --tag=CXX --mode=link $CXX $CXXFLAGS $LDFLAGS -o sub/main$EXEEXT $main_o lib2/libb.la lib/liba.la],
259          [0], [ignore], [ignore])
260 LT_AT_EXEC_CHECK([./sub/main])
261 # both convenience, libb depending on liba
262 AT_CHECK([$LIBTOOL --tag=CXX --mode=link $CXX $CXXFLAGS $LDFLAGS -o lib/liba.la lib/a.lo],
263          [0], [ignore], [ignore])
264 AT_CHECK([$LIBTOOL --tag=CXX --mode=link $CXX $CXXFLAGS $LDFLAGS -o lib2/libb.la lib2/b.lo lib/liba.la],
265          [0], [ignore], [ignore])
266 AT_CHECK([$LIBTOOL --tag=CXX --mode=link $CXX $CXXFLAGS $LDFLAGS -o sub/main$EXEEXT $main_o lib2/libb.la],
267          [0], [ignore], [ignore])
268 LT_AT_EXEC_CHECK([./sub/main])
269 # lib convenience
270 if $noskip; then
271
272   AT_CHECK([$LIBTOOL --tag=CXX --mode=link $CXX $CXXFLAGS $LDFLAGS -o lib2/libb.la lib2/b.lo lib/liba.la -rpath /foo],
273          [0], [ignore], [ignore])
274   AT_CHECK([$LIBTOOL --tag=CXX --mode=link $CXX $CXXFLAGS $LDFLAGS -o sub/main$EXEEXT $main_o lib2/libb.la],
275          [0], [ignore], [ignore])
276   LT_AT_EXEC_CHECK([./sub/main])
277 fi
278 # both installed
279 if $noskip; then
280   AT_CHECK([$LIBTOOL --tag=CXX --mode=link $CXX $CXXFLAGS $LDFLAGS -o lib2/libb.la lib2/b.lo lib/liba.la -rpath /bar],
281          [0], [ignore], [ignore])
282   AT_CHECK([$LIBTOOL --tag=CXX --mode=link $CXX $CXXFLAGS $LDFLAGS -o sub/main$EXEEXT $main_o lib2/libb.la],
283          [0], [ignore], [ignore])
284   LT_AT_EXEC_CHECK([./sub/main])
285 fi
286
287 cd ..
288
289 AT_CHECK([$noskip || (exit 77)])
290
291 dnl with autoreconf use:
292 dnl
293 dnl AT_DATA(src/configure.ac,
294 dnl [[AC_INIT([template_2], ]]AT_PACKAGE_VERSION[[, ]]AT_PACKAGE_BUGREPORT[[)
295 dnl AC_CONFIG_HEADERS([config.h:config-h.in])
296 dnl AC_CONFIG_MACRO_DIR([m4])
297 dnl AC_CONFIG_AUX_DIR([config])
298 dnl AM_INIT_AUTOMAKE([foreign subdir-objects])
299 dnl AC_LANG([C++])
300 dnl AC_PROG_CXX
301 dnl AC_PROG_LIBTOOL
302 dnl AC_CONFIG_FILES([Makefile])
303 dnl AC_OUTPUT
304 dnl ]])
305 dnl
306 dnl AT_DATA(src/Makefile.am,
307 dnl [[ACLOCAL_AMFLAGS = -I m4
308 dnl INCLUDES = -I$(srcdir)/lib -I$(srcdir)/lib2
309 dnl bin_PROGRAMS = sub/main
310 dnl noinst_LTLIBRARIES = lib/liba.la lib2/libb.la
311 dnl lib_liba_la_SOURCES = lib/a.cpp lib/a.hh
312 dnl lib2_libb_la_SOURCES = lib2/b.cpp lib2/b.hh
313 dnl #lib2_libb_la_LIBADD = lib/liba.la
314 dnl sub_main_SOURCES = sub/main.cpp
315 dnl sub_main_LDADD = lib2/libb.la lib/liba.la
316 dnl ]])
317
318 AT_CLEANUP