source: trunk/base/m4/foundation.m4 @ 112684

Last change on this file since 112684 was 50735, checked in by toby@…, 11 years ago

more cleanup

  • Property svn:eol-style set to native
File size: 12.1 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, AS_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                        no)
91                                ;;
92                        *)
93                                AC_MSG_ERROR([${with_objc_runtime} is not a valid argument to --with-objc-runtime. Please specify either "GNU" or "apple"])
94                                ;;
95                esac
96        fi
97
98        AC_LANG_PUSH([Objective C])
99
100        if test x"${with_objc_runtime}" != x"no"; then
101       
102        # Check for common header, objc/objc.h
103        AC_CHECK_HEADERS([objc/objc.h], ,[AC_MSG_ERROR([Can't locate Objective C runtime headers])])
104
105        # Save LIBS & OBJCFLAGS
106        # depending on whether the cache is used,
107        # the variables may or may not be modified.
108        OLD_LIBS="${LIBS}"
109        OLD_OBJCFLAGS="${OBJCFLAGS}"
110
111        # Add -lobjc. The following tests will ensure that the library exists and functions with the detected Objective C compiler
112        LIBS="${LIBS} -lobjc"
113
114        # Test if pthreads are required to link against
115        # libobjc - this is the case on FreeBSD.
116
117        AC_MSG_CHECKING([if linking libobjc requires pthreads])
118        AC_CACHE_VAL(mp_cv_objc_req_pthread, [
119                # First, test if objc links without pthreads
120                # The following uses quadrigraphs
121                # '@<:@' = '['
122                # '@:>@' = ']'
123                AC_LINK_IFELSE([
124                                AC_LANG_PROGRAM([
125                                                #include <objc/objc.h>
126                                                #include <objc/Object.h>
127                                        ], [
128                                                Object *obj = @<:@Object alloc@:>@;
129                                                puts(@<:@obj name@:>@);
130                                        ])
131                                ], [
132                                        # Linked without -pthread
133                                        mp_cv_objc_req_pthread="no"
134                                ], [
135                                        # Failed to link without -pthread
136                                        mp_cv_objc_req_pthread="yes"
137                                ]
138                )
139
140                # If the above failed, try with pthreads
141                if test x"${mp_cv_objc_req_pthread}" = x"yes"; then
142                        LIBS="${LIBS} ${PTHREAD_LIBS}"
143                        OBJCFLAGS="${OBJCFLAGS} ${PTHREAD_CFLAGS}"
144                        AC_LINK_IFELSE([
145                                        AC_LANG_PROGRAM([
146                                                        #include <objc/objc.h>
147                                                        #include <objc/Object.h>
148                                                ], [
149                                                        Object *obj = @<:@Object alloc@:>@;
150                                                        puts(@<:@obj name@:>@);
151                                                ])
152                                        ], [
153                                                # Linked with -lpthread
154                                                mp_cv_objc_req_pthread="yes"
155                                        ], [
156                                                # Failed to link against objc at all
157                                                # This will be caught in the runtime
158                                                # checks below
159                                                mp_cv_objc_req_pthread="no"
160                                        ]
161                        )
162                fi
163        ])
164        AC_MSG_RESULT(${mp_cv_objc_req_pthread})
165
166        if test x"${mp_cv_objc_req_pthread}" = x"no"; then
167                OBJC_LIBS="-lobjc"
168                OBJC_PTHREAD_LIBS="${PTHREAD_LIBS}"
169                OBJC_PTHREAD_CFLAGS="${PTHREAD_CFLAGS}"
170        elif test x"${mp_cv_objc_req_pthread}" = x"yes"; then
171                OBJC_LIBS="-lobjc ${PTHREAD_LIBS}"
172                OBJCFLAGS="${OBJCFLAGS} ${PTHREAD_CFLAGS}"
173        fi
174
175        if test x"${with_objc_runtime}" = x || test x"${with_objc_runtime}" = x"apple"; then
176                AC_MSG_CHECKING([for Apple Objective-C runtime])
177                AC_CACHE_VAL(mp_cv_objc_runtime_apple, [
178                        # The following uses quadrigraphs
179                        # '@<:@' = '['
180                        # '@:>@' = ']'
181                        AC_LINK_IFELSE([
182                                        AC_LANG_PROGRAM([
183                                                        #include <objc/objc.h>
184                                                        #include <objc/objc-api.h>
185                                                ], [
186                                                        id class = objc_lookUpClass("Object");
187                                                        id obj = @<:@class alloc@:>@;
188                                                        puts(@<:@obj name@:>@);
189                                                ])
190                                        ], [
191                                                mp_cv_objc_runtime_apple="yes"
192                                        ], [
193                                                mp_cv_objc_runtime_apple="no"
194                                        ]
195                        )
196                ])
197                AC_MSG_RESULT(${mp_cv_objc_runtime_apple})
198        else
199                mp_cv_objc_runtime_apple="no"
200        fi
201
202        if test x"${with_objc_runtime}" = x || test x"${with_objc_runtime}" = x"GNU"; then
203                AC_MSG_CHECKING([for GNU Objective C runtime])
204                AC_CACHE_VAL(mp_cv_objc_runtime_gnu, [
205                        # The following uses quadrigraphs
206                        # '@<:@' = '['
207                        # '@:>@' = ']'
208                        AC_LINK_IFELSE([
209                                        AC_LANG_PROGRAM([
210                                                        #include <objc/objc.h>
211                                                        #include <objc/objc-api.h>
212                                                ], [
213                                                        id class = objc_lookup_class("Object");
214                                                        id obj = @<:@class alloc@:>@;
215                                                        puts(@<:@obj name@:>@);
216                                                ])
217                                        ], [
218                                                mp_cv_objc_runtime_gnu="yes"
219                                        ], [
220                                                mp_cv_objc_runtime_gnu="no"
221                                        ]
222                        )
223                ])
224                AC_MSG_RESULT(${mp_cv_objc_runtime_gnu})
225        else
226                mp_cv_objc_runtime_gnu="no"
227        fi
228
229        fi
230
231        # Apple runtime is prefered
232        if test x"${mp_cv_objc_runtime_apple}" = x"yes"; then
233                        OBJC_RUNTIME="APPLE_RUNTIME"
234                        OBJC_RUNTIME_FLAGS="-fnext-runtime"
235                        AC_MSG_NOTICE([Using Apple Objective-C runtime])
236                        AC_DEFINE([APPLE_RUNTIME], 1, [Define if using the Apple Objective-C runtime and compiler.])
237        elif test x"${mp_cv_objc_runtime_gnu}" = x"yes"; then
238                        OBJC_RUNTIME="GNU_RUNTIME"
239                        OBJC_RUNTIME_FLAGS="-fgnu-runtime"
240                        AC_MSG_NOTICE([Using GNU Objective-C runtime])
241                        AC_DEFINE([GNU_RUNTIME], 1, [Define if using the GNU Objective-C runtime and compiler.])
242        elif test x"${with_objc_runtime}" = x"no"; then
243                        OBJC_RUNTIME="none"
244                        AC_MSG_NOTICE([Not using Objective-C runtime])
245        else
246                        AC_MSG_FAILURE([Could not locate a working Objective-C runtime.])
247        fi
248
249        # Restore LIBS & OBJCFLAGS
250        LIBS="${OLD_LIBS}"
251        OBJCFLAGS="${OLD_OBJCFLAGS}"
252
253        AC_SUBST([OBJC_RUNTIME])
254        AC_SUBST([OBJC_RUNTIME_FLAGS])
255        AC_SUBST([OBJC_LIBS])
256
257        AC_SUBST([OBJC_PTHREAD_LIBS])
258        AC_SUBST([OBJC_PTHREAD_CFLAGS])
259
260        AC_LANG_POP([Objective C])
261])
262
263#------------------------------------------------------------------------
264# MP_OBJC_FOUNDATION --
265#
266#       Find a functional Foundation implementation.
267#       The NeXT Foundation implementation is prefered,
268#       as it is most likely to be the system provided
269#       Foundation.
270#
271# Arguments:
272#       None.
273#
274# Requires:
275#       OBJC_RUNTIME
276#
277# Depends:
278#       AC_PROG_OBJC from objc.m4
279#
280# Results:
281#
282#       Adds a --with-objc-foundation switch to configure.
283#       Result is cached.
284#
285#       Defines one of the following preprocessor macros:
286#               APPLE_FOUNDATION GNUSTEP_FOUNDATION
287#
288#       Substitutes the following variables:
289#               OBJC_FOUNDATION OBJC_FOUNDATION_LDFLAGS
290#               OBJC_FOUNDATION_CPPFLAGS OBJC_FOUNDATION_LIBS
291#------------------------------------------------------------------------
292AC_DEFUN([MP_OBJC_FOUNDATION],[
293        AC_REQUIRE([AC_PROG_OBJC])
294        AC_ARG_WITH(objc-foundation, [  --with-objc-foundation  Specify either "GNUstep" or "apple"], [with_objc_foundation=${withval}])
295
296        if test x"${with_objc_foundation}" != x; then
297                case "${with_objc_foundation}" in
298                        GNUstep)
299                                ;;
300                        GNU)
301                                with_objc_foundation="GNUstep"
302                                ;;
303                        apple)
304                                ;;
305                        no)
306                                ;;
307                        *)
308                                AC_MSG_ERROR([${with_objc_foundation} is not a valid argument to --with-objc-foundation. Please specify either "GNU" or "apple"])
309                                ;;
310                esac
311        fi
312
313        AC_LANG_PUSH([Objective C])
314
315        if test x"${with_objc_foundation}" != x"no"; then
316       
317        if test x"${with_objc_foundation}" == x || test x"${with_objc_foundation}" == x"apple"; then
318                # '@<:@' = '['
319                # '@:>@' = ']'
320                AC_MSG_CHECKING([for Apple Foundation library])
321
322                # Set NeXT LIBS and CFLAGS
323                APPLE_FOUNDATION_CFLAGS=""
324                APPLE_FOUNDATION_LIBS="-framework Foundation"
325
326                AC_CACHE_VAL(ac_cv_objc_foundation_apple, [
327                        # Save old LIBS and CFLAGS
328                        LIBS_OLD="${LIBS}"
329                        CFLAGS_OLD="${CFLAGS}"
330
331                        CFLAGS="${APPLE_FOUNDATION_CFLAGS} ${CFLAGS}"
332                        LIBS="${APPLE_FOUNDATION_LIBS} ${LIBS}"
333
334                        AC_LINK_IFELSE([
335                                        AC_LANG_PROGRAM([
336                                                                #include <Foundation/Foundation.h>
337                                                        ], [
338                                                                NSString *string = @<:@@<:@NSString alloc@:>@ initWithCString: "Hello World"@:>@;
339                                                                @<:@NSString length@:>@;
340                                                        ])
341                                        ],[
342                                                ac_cv_objc_foundation_apple="yes"
343                                        ],[
344                                                ac_cv_objc_foundation_apple="no"
345                                        ]
346                        )
347                        # Restore LIBS and CFLAGS
348                        LIBS="${LIBS_OLD}"
349                        CFLAGS="${CFLAGS_OLD}"
350                ])
351                AC_MSG_RESULT(${ac_cv_objc_foundation_apple})
352        else
353                ac_cv_objc_foundation_apple="no"
354        fi
355
356        if test x"${with_objc_foundation}" == x || test x${with_objc_foundation} == x"GNUstep"; then
357                GNUSTEP_CONFIG=/usr/bin/gnustep-config
358                if test ! -x "${GNUSTEP_CONFIG}" -a x"${GNUSTEP_SYSTEM_ROOT}" == x; then
359                        if test x"${with_objc_foundation}" == x"GNUstep"; then
360                                AC_MSG_ERROR([GNUSTEP_SYSTEM_ROOT is not defined in your environment, preventing the use of GNUstep's Foundation library])
361                        else
362                                AC_MSG_WARN([GNUSTEP_SYSTEM_ROOT is not defined in your environment, preventing the use of GNUstep's Foundation library])
363                        fi
364                else
365
366                        AC_MSG_CHECKING([for GNUstep Foundation library])
367
368                        # Set GNUstep LDFLAGS, CPPFLAGS, and LIBS
369                        if test -x ${GNUSTEP_CONFIG}; then
370                        GNUSTEP_LDFLAGS=`sh -c "MAKELEVEL=0 ${GNUSTEP_CONFIG} --objc-libs"`
371                        GNUSTEP_CPPFLAGS=`sh -c "MAKELEVEL=0 ${GNUSTEP_CONFIG} --objc-flags"`
372                        GNUSTEP_LIBS=`sh -c "MAKELEVEL=0 ${GNUSTEP_CONFIG} --base-libs"`
373                        else
374                        GNUSTEP_LDFLAGS="-L${GNUSTEP_SYSTEM_ROOT}/Library/Libraries/"
375                        GNUSTEP_CPPFLAGS="-I${GNUSTEP_SYSTEM_ROOT}/Library/Headers/"
376                        GNUSTEP_LIBS="-lgnustep-base"
377                        fi
378
379                        AC_CACHE_VAL(ac_cv_objc_foundation_gnustep, [
380                                # Save old LDFLAGS, CPPFLAGS, and LIBS
381                                LDFLAGS_OLD="${LDFLAGS}"
382                                CPPFLAGS_OLD="${CPPFLAGS}"
383                                LIBS_OLD="${LIBS}"
384
385                                LDFLAGS="${GNUSTEP_LDFLAGS} ${LDFLAGS}"
386                                CPPFLAGS="${GNUSTEP_CPPFLAGS} ${CPPFLAGS}"
387                                LIBS="${GNUSTEP_LIBS} ${LIBS}"
388
389                                AC_LINK_IFELSE([
390                                                AC_LANG_PROGRAM([
391                                                                        #include <Foundation/Foundation.h>
392                                                                ], [
393                                                                        NSString *string = @<:@@<:@NSString alloc@:>@ initWithCString: "Hello World"@:>@;
394                                                                        @<:@NSString length@:>@;
395                                                                ])
396                                                ],[
397                                                        ac_cv_objc_foundation_gnustep="yes"
398                                                ],[
399                                                        ac_cv_objc_foundation_gnustep="no"
400                                                ]
401                                )
402                                # Restore LDFLAGS, CPPFLAGS, and LIBS
403                                LDFLAGS="${LDFLAGS_OLD}"
404                                CPPFLAGS="${CPPFLAGS_OLD}"
405                                LIBS="${LIBS_OLD}"
406                        ])
407                        AC_MSG_RESULT(${ac_cv_objc_foundation_gnustep})
408                fi
409        else
410                ac_cv_objc_foundation_gnustep="no"
411        fi
412
413        fi
414       
415        # NeXT Foundation is prefered
416        if test x"${ac_cv_objc_foundation_apple}" == x"yes"; then
417                OBJC_FOUNDATION="Apple"
418                OBJC_FOUNDATION_CPPFLAGS="${APPLE_FOUNDATION_CFLAGS}"
419                OBJC_FOUNDATION_LIBS="${APPLE_FOUNDATION_LIBS}"
420                OBJC_FOUNDATION_LDFLAGS=""
421                AC_DEFINE([APPLE_FOUNDATION], 1, [Define if using the Apple Foundation framework])
422                AC_MSG_NOTICE([Using Apple Foundation library])
423        elif test x"${ac_cv_objc_foundation_gnustep}" == x"yes"; then
424                OBJC_FOUNDATION="GNUstep"
425                OBJC_FOUNDATION_CPPFLAGS="${GNUSTEP_CPPFLAGS}"
426                OBJC_FOUNDATION_LIBS="${GNUSTEP_LIBS}"
427                OBJC_FOUNDATION_LDFLAGS="${GNUSTEP_LDFLAGS}"
428                AC_DEFINE([GNUSTEP_FOUNDATION], 1, [Define if using the GNUstep Foundation library])
429                AC_MSG_NOTICE([Using GNUstep Foundation library])
430        elif test x"${with_objc_foundation}" = x"no"; then
431                OBJC_FOUNDATION="none"
432                AC_MSG_NOTICE([Not using Foundation implementation])
433        else
434                AC_MSG_ERROR([Could not find a working Foundation implementation])
435        fi
436
437        AC_SUBST([OBJC_FOUNDATION])
438        AC_SUBST([OBJC_FOUNDATION_LDFLAGS])
439        AC_SUBST([OBJC_FOUNDATION_CPPFLAGS])
440        AC_SUBST([OBJC_FOUNDATION_LIBS])
441
442        AC_LANG_POP([Objective C])
443])
Note: See TracBrowser for help on using the repository browser.