source: trunk/base/foundation.m4 @ 29223

Last change on this file since 29223 was 26709, checked in by landonf@…, 13 years ago

Avoid modifying CPPFLAGS/LDFLAGS directly when checking for Foundation.
Submitted by: afb@…

File size: 11.5 KB
Line 
1#------------------------------------------------------------------------
2# MP_COMPILER_ATTRIBUTE_LF_PRIVATE
3#
4#       Determines whether the compiler supports the symbol
5#       'visibility("hidden")' attribute
6#
7# Arguments:
8#       None.
9#
10# Requires:
11#       none
12#
13# Depends:
14#       none
15#
16# Results:
17#
18#       Defines the following macros:
19#               LF_PRIVATE
20#
21#------------------------------------------------------------------------
22
23AC_DEFUN([MP_COMPILER_ATTRIBUTE_LF_PRIVATE], [
24        AC_MSG_CHECKING([for gcc symbol visibility attribute])
25        AC_CACHE_VAL(mp_cv_attribute_mp_private, [
26                AC_COMPILE_IFELSE([
27                        AC_LANG_SOURCE([
28                                #if defined(__GNUC__) && defined(__APPLE__) && __GNUC__ < 4
29                                # error Darwin does not support the visibility attribute with gcc releases prior to 4
30                                #elif defined(WIN32) && __GNUC__ < 4
31                                # error MinGW/Cygwin do not support the visibility attribute with gcc releases prior to 4.
32                                #endif
33                                int a __attribute__ ((visibility("hidden")));
34                        ])
35                ],[
36                        mp_cv_attribute_mp_private="__attribute__((visibility(\"hidden\")))"
37                ],[
38                        mp_cv_attribute_mp_private="no"
39                ])
40        ])
41
42        AC_MSG_RESULT([$mp_cv_attribute_mp_private])
43       
44        if test x"$mp_cv_attribute_mp_private" = "xno"; then
45                MP_PRIVATE=""
46        else
47                MP_PRIVATE="$mp_cv_attribute_mp_private"
48        fi
49
50        AC_DEFINE_UNQUOTED(MP_PRIVATE, $MP_PRIVATE, [Mark private symbols])
51])
52
53
54#------------------------------------------------------------------------
55# MP_OBJC_RUNTIME --
56#
57#       Determine the default, working Objective C runtime
58#
59# Arguments:
60#       None.
61#
62# Requires:
63#       none
64#
65# Depends:
66#       AC_PROG_OBJC from objc.m4
67#
68# Results:
69#
70#       Adds a --with-objc-runtime switch to configure.
71#       Result is cached.
72#
73#       Defines one of the following preprocessor macros:
74#               APPLE_RUNTIME GNU_RUNTIME
75#
76#       Substitutes the following variables:
77#               OBJC_RUNTIME OBJC_RUNTIME_FLAGS OBJC_LIBS
78#               OBJC_PTHREAD_CFLAGS OBJC_PTHREAD_LIBS
79#------------------------------------------------------------------------
80AC_DEFUN([MP_OBJC_RUNTIME],[
81        AC_REQUIRE([AC_PROG_OBJC])
82        AC_ARG_WITH(objc-runtime, AC_HELP_STRING([--with-objc-runtime], [Specify either "GNU" or "apple"]), [with_objc_runtime=${withval}])
83
84        if test x"${with_objc_runtime}" != x; then
85                case "${with_objc_runtime}" in
86                        GNU)
87                                ;;
88                        apple)
89                                ;;
90                        *)
91                                AC_MSG_ERROR([${with_objc_runtime} is not a valid argument to --with-objc-runtime. Please specify either "GNU" or "apple"])
92                                ;;
93                esac
94        fi
95
96        AC_LANG_PUSH([Objective C])
97
98        # Check for common header, objc/objc.h
99        AC_CHECK_HEADERS([objc/objc.h], ,[AC_MSG_ERROR([Can't locate Objective C runtime headers])])
100
101        # Save LIBS & OBJCFLAGS
102        # depending on whether the cache is used,
103        # the variables may or may not be modified.
104        OLD_LIBS="${LIBS}"
105        OLD_OBJCFLAGS="${OBJCFLAGS}"
106
107        # Add -lobjc. The following tests will ensure that the library exists and functions with the detected Objective C compiler
108        LIBS="${LIBS} -lobjc"
109
110        # Test if pthreads are required to link against
111        # libobjc - this is the case on FreeBSD.
112
113        AC_MSG_CHECKING([if linking libobjc requires pthreads])
114        AC_CACHE_VAL(mp_cv_objc_req_pthread, [
115                # First, test if objc links without pthreads
116                # The following uses quadrigraphs
117                # '@<:@' = '['
118                # '@:>@' = ']'
119                AC_LINK_IFELSE([
120                                AC_LANG_PROGRAM([
121                                                #include <objc/objc.h>
122                                                #include <objc/Object.h>
123                                        ], [
124                                                Object *obj = @<:@Object alloc@:>@;
125                                                puts(@<:@obj name@:>@);
126                                        ])
127                                ], [
128                                        # Linked without -pthread
129                                        mp_cv_objc_req_pthread="no"
130                                ], [
131                                        # Failed to link without -pthread
132                                        mp_cv_objc_req_pthread="yes"
133                                ]
134                )
135
136                # If the above failed, try with pthreads
137                if test x"${mp_cv_objc_req_pthread}" = x"yes"; then
138                        LIBS="${LIBS} ${PTHREAD_LIBS}"
139                        OBJCFLAGS="${OBJCFLAGS} ${PTHREAD_CFLAGS}"
140                        AC_LINK_IFELSE([
141                                        AC_LANG_PROGRAM([
142                                                        #include <objc/objc.h>
143                                                        #include <objc/Object.h>
144                                                ], [
145                                                        Object *obj = @<:@Object alloc@:>@;
146                                                        puts(@<:@obj name@:>@);
147                                                ])
148                                        ], [
149                                                # Linked with -lpthread
150                                                mp_cv_objc_req_pthread="yes"
151                                        ], [
152                                                # Failed to link against objc at all
153                                                # This will be caught in the runtime
154                                                # checks below
155                                                mp_cv_objc_req_pthread="no"
156                                        ]
157                        )
158                fi
159        ])
160        AC_MSG_RESULT(${mp_cv_objc_req_pthread})
161
162        if test x"${mp_cv_objc_req_pthread}" = x"no"; then
163                OBJC_LIBS="-lobjc"
164                OBJC_PTHREAD_LIBS="${PTHREAD_LIBS}"
165                OBJC_PTHREAD_CFLAGS="${PTHREAD_CFLAGS}"
166        elif test x"${mp_cv_objc_req_pthread}" = x"yes"; then
167                OBJC_LIBS="-lobjc ${PTHREAD_LIBS}"
168                OBJCFLAGS="${OBJCFLAGS} ${PTHREAD_CFLAGS}"
169        fi
170
171        if test x"${with_objc_runtime}" = x || test x"${with_objc_runtime}" = x"apple"; then
172                AC_MSG_CHECKING([for Apple Objective-C runtime])
173                AC_CACHE_VAL(mp_cv_objc_runtime_apple, [
174                        # The following uses quadrigraphs
175                        # '@<:@' = '['
176                        # '@:>@' = ']'
177                        AC_LINK_IFELSE([
178                                        AC_LANG_PROGRAM([
179                                                        #include <objc/objc.h>
180                                                        #include <objc/objc-api.h>
181                                                ], [
182                                                        id class = objc_lookUpClass("Object");
183                                                        id obj = @<:@class alloc@:>@;
184                                                        puts(@<:@obj name@:>@);
185                                                ])
186                                        ], [
187                                                mp_cv_objc_runtime_apple="yes"
188                                        ], [
189                                                mp_cv_objc_runtime_apple="no"
190                                        ]
191                        )
192                ])
193                AC_MSG_RESULT(${mp_cv_objc_runtime_apple})
194        else
195                mp_cv_objc_runtime_apple="no"
196        fi
197
198        if test x"${with_objc_runtime}" = x || test x"${with_objc_runtime}" = x"GNU"; then
199                AC_MSG_CHECKING([for GNU Objective C runtime])
200                AC_CACHE_VAL(mp_cv_objc_runtime_gnu, [
201                        # The following uses quadrigraphs
202                        # '@<:@' = '['
203                        # '@:>@' = ']'
204                        AC_LINK_IFELSE([
205                                        AC_LANG_PROGRAM([
206                                                        #include <objc/objc.h>
207                                                        #include <objc/objc-api.h>
208                                                ], [
209                                                        id class = objc_lookup_class("Object");
210                                                        id obj = @<:@class alloc@:>@;
211                                                        puts(@<:@obj name@:>@);
212                                                ])
213                                        ], [
214                                                mp_cv_objc_runtime_gnu="yes"
215                                        ], [
216                                                mp_cv_objc_runtime_gnu="no"
217                                        ]
218                        )
219                ])
220                AC_MSG_RESULT(${mp_cv_objc_runtime_gnu})
221        else
222                mp_cv_objc_runtime_gnu="no"
223        fi
224
225        # Apple runtime is prefered
226        if test x"${mp_cv_objc_runtime_apple}" = x"yes"; then
227                        OBJC_RUNTIME="APPLE_RUNTIME"
228                        OBJC_RUNTIME_FLAGS="-fnext-runtime"
229                        AC_MSG_NOTICE([Using Apple Objective-C runtime])
230                        AC_DEFINE([APPLE_RUNTIME], 1, [Define if using the Apple Objective-C runtime and compiler.])
231        elif test x"${mp_cv_objc_runtime_gnu}" = x"yes"; then
232                        OBJC_RUNTIME="GNU_RUNTIME"
233                        OBJC_RUNTIME_FLAGS="-fgnu-runtime"
234                        AC_MSG_NOTICE([Using GNU Objective-C runtime])
235                        AC_DEFINE([GNU_RUNTIME], 1, [Define if using the GNU Objective-C runtime and compiler.])
236        else
237                        AC_MSG_FAILURE([Could not locate a working Objective-C runtime.])
238        fi
239
240        # Restore LIBS & OBJCFLAGS
241        LIBS="${OLD_LIBS}"
242        OBJCFLAGS="${OLD_OBJCFLAGS}"
243
244        AC_SUBST([OBJC_RUNTIME])
245        AC_SUBST([OBJC_RUNTIME_FLAGS])
246        AC_SUBST([OBJC_LIBS])
247
248        AC_SUBST([OBJC_PTHREAD_LIBS])
249        AC_SUBST([OBJC_PTHREAD_CFLAGS])
250
251        AC_LANG_POP([Objective C])
252])
253
254#------------------------------------------------------------------------
255# MP_OBJC_FOUNDATION --
256#
257#       Find a functional Foundation implementation.
258#       The NeXT Foundation implementation is prefered,
259#       as it is most likely to be the system provided
260#       Foundation.
261#
262# Arguments:
263#       None.
264#
265# Requires:
266#       OBJC_RUNTIME
267#
268# Depends:
269#       AC_PROG_OBJC from objc.m4
270#
271# Results:
272#
273#       Adds a --with-objc-foundation switch to configure.
274#       Result is cached.
275#
276#       Defines one of the following preprocessor macros:
277#               APPLE_FOUNDATION GNUSTEP_FOUNDATION
278#
279#       Substitutes the following variables:
280#               OBJC_FOUNDATION OBJC_FOUNDATION_LDFLAGS
281#               OBJC_FOUNDATION_CPPFLAGS OBJC_FOUNDATION_LIBS
282#------------------------------------------------------------------------
283AC_DEFUN([MP_OBJC_FOUNDATION],[
284        AC_REQUIRE([AC_PROG_OBJC])
285        AC_ARG_WITH(objc-foundation, [  --with-objc-foundation  Specify either "GNUstep" or "apple"], [with_objc_foundation=${withval}])
286
287        if test x"${with_objc_foundation}" != x; then
288                case "${with_objc_foundation}" in
289                        GNUstep)
290                                ;;
291                        GNU)
292                                with_objc_foundation="GNUstep"
293                                ;;
294                        apple)
295                                ;;
296                        *)
297                                AC_MSG_ERROR([${with_objc_foundation} is not a valid argument to --with-objc-foundation. Please specify either "GNU" or "apple"])
298                                ;;
299                esac
300        fi
301
302        AC_LANG_PUSH([Objective C])
303
304        if test x"${with_objc_foundation}" == x || test x"${with_objc_foundation}" == x"apple"; then
305                # '@<:@' = '['
306                # '@:>@' = ']'
307                AC_MSG_CHECKING([for Apple Foundation library])
308
309                # Set NeXT LIBS and CFLAGS
310                APPLE_FOUNDATION_CFLAGS="-framework Foundation"
311                APPLE_FOUNDATION_LIBS="-framework Foundation"
312
313                AC_CACHE_VAL(ac_cv_objc_foundation_apple, [
314                        # Save old LIBS and CFLAGS
315                        LIBS_OLD="${LIBS}"
316                        CFLAGS_OLD="${CFLAGS}"
317
318                        CFLAGS="${APPLE_FOUNDATION_CFLAGS} ${CFLAGS}"
319                        LIBS="${APPLE_FOUNDATION_LIBS} ${LIBS}"
320
321                        AC_LINK_IFELSE([
322                                        AC_LANG_PROGRAM([
323                                                                #include <Foundation/Foundation.h>
324                                                        ], [
325                                                                NSString *string = @<:@@<:@NSString alloc@:>@ initWithCString: "Hello World"@:>@;
326                                                                @<:@NSString length@:>@;
327                                                        ])
328                                        ],[
329                                                ac_cv_objc_foundation_apple="yes"
330                                        ],[
331                                                ac_cv_objc_foundation_apple="no"
332                                        ]
333                        )
334                        # Restore LIBS and CFLAGS
335                        LIBS="${LIBS_OLD}"
336                        CFLAGS="${CFLAGS_OLD}"
337                ])
338                AC_MSG_RESULT(${ac_cv_objc_foundation_apple})
339        else
340                ac_cv_objc_foundation_apple="no"
341        fi
342
343        if test x"${with_objc_foundation}" == x || test x${with_objc_foundation} == x"GNUstep"; then
344                if test x"${GNUSTEP_SYSTEM_ROOT}" == x; then
345                        if test x"${with_objc_foundation}" == x"GNUstep"; then
346                                AC_MSG_ERROR([GNUSTEP_SYSTEM_ROOT is not defined in your environment, preventing the use of GNUstep's Foundation library])
347                        else
348                                AC_MSG_WARN([GNUSTEP_SYSTEM_ROOT is not defined in your environment, preventing the use of GNUstep's Foundation library])
349                        fi
350                else
351
352                        AC_MSG_CHECKING([for GNUstep Foundation library])
353
354                        # Set GNUstep LDFLAGS, CPPFLAGS, and LIBS
355                        GNUSTEP_LDFLAGS="-L${GNUSTEP_SYSTEM_ROOT}/Library/Libraries/"
356                        GNUSTEP_CPPFLAGS="-I${GNUSTEP_SYSTEM_ROOT}/Library/Headers/"
357                        GNUSTEP_LIBS="-lgnustep-base"
358
359                        AC_CACHE_VAL(ac_cv_objc_foundation_gnustep, [
360                                # Save old LDFLAGS, CPPFLAGS, and LIBS
361                                LDFLAGS_OLD="${LDFLAGS}"
362                                CPPFLAGS_OLD="${CPPFLAGS}"
363                                LIBS_OLD="${LIBS}"
364
365                                LDFLAGS="${GNUSTEP_LDFLAGS} ${LDFLAGS}"
366                                CPPFLAGS="${GNUSTEP_CPPFLAGS} ${CPPFLAGS}"
367                                LIBS="${GNUSTEP_LIBS} ${LIBS}"
368
369                                AC_LINK_IFELSE([
370                                                AC_LANG_PROGRAM([
371                                                                        #include <Foundation/Foundation.h>
372                                                                ], [
373                                                                        NSString *string = @<:@@<:@NSString alloc@:>@ initWithCString: "Hello World"@:>@;
374                                                                        @<:@NSString length@:>@;
375                                                                ])
376                                                ],[
377                                                        ac_cv_objc_foundation_gnustep="yes"
378                                                ],[
379                                                        ac_cv_objc_foundation_gnustep="no"
380                                                ]
381                                )
382                                # Restore LDFLAGS, CPPFLAGS, and LIBS
383                                LDFLAGS="${LDFLAGS_OLD}"
384                                CPPFLAGS="${CPPFLAGS_OLD}"
385                                LIBS="${LIBS_OLD}"
386                        ])
387                        AC_MSG_RESULT(${ac_cv_objc_foundation_gnustep})
388                fi
389        else
390                ac_cv_objc_foundation_gnustep="no"
391        fi
392
393        # NeXT Foundation is prefered
394        if test x"${ac_cv_objc_foundation_apple}" == x"yes"; then
395                OBJC_FOUNDATION="Apple"
396                OBJC_FOUNDATION_CPPFLAGS="${APPLE_FOUNDATION_CFLAGS}"
397                OBJC_FOUNDATION_LIBS="${APPLE_FOUNDATION_LIBS}"
398                OBJC_FOUNDATION_LDFLAGS=""
399                AC_DEFINE([APPLE_FOUNDATION], 1, [Define if using the Apple Foundation framework])
400                AC_MSG_NOTICE([Using Apple Foundation library])
401        elif test x"${ac_cv_objc_foundation_gnustep}" == x"yes"; then
402                OBJC_FOUNDATION="GNUstep"
403                OBJC_FOUNDATION_CPPFLAGS="${GNUSTEP_CPPFLAGS}"
404                OBJC_FOUNDATION_LIBS="${GNUSTEP_LIBS}"
405                OBJC_FOUNDATION_LDFLAGS="${GNUSTEP_LDFLAGS}"
406                AC_DEFINE([GNUSTEP_FOUNDATION], 1, [Define if using the GNUstep Foundation library])
407                AC_MSG_NOTICE([Using GNUstep Foundation library])
408        else
409                AC_MSG_ERROR([Could not find a working Foundation implementation])
410        fi
411
412        AC_SUBST([OBJC_FOUNDATION])
413        AC_SUBST([OBJC_FOUNDATION_LDFLAGS])
414        AC_SUBST([OBJC_FOUNDATION_CPPFLAGS])
415        AC_SUBST([OBJC_FOUNDATION_LIBS])
416
417        AC_LANG_POP([Objective C])
418])
Note: See TracBrowser for help on using the repository browser.