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

Last change on this file since 140641 was 120127, checked in by jmr@…, 6 years ago

make missing foundation non-fatal on platforms other than OS X, and fix some test(1) syntax

  • 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                                                ], [
212                                                        id class = objc_lookup_class("Object");
213                                                        id obj = @<:@class alloc@:>@;
214                                                        puts(@<:@obj name@:>@);
215                                                ])
216                                        ], [
217                                                mp_cv_objc_runtime_gnu="yes"
218                                        ], [
219                                                mp_cv_objc_runtime_gnu="no"
220                                        ]
221                        )
222                ])
223                AC_MSG_RESULT(${mp_cv_objc_runtime_gnu})
224        else
225                mp_cv_objc_runtime_gnu="no"
226        fi
227
228        fi
229
230        # Apple runtime is prefered
231        if test x"${mp_cv_objc_runtime_apple}" = x"yes"; then
232                        OBJC_RUNTIME="APPLE_RUNTIME"
233                        OBJC_RUNTIME_FLAGS="-fnext-runtime"
234                        AC_MSG_NOTICE([Using Apple Objective-C runtime])
235                        AC_DEFINE([APPLE_RUNTIME], 1, [Define if using the Apple Objective-C runtime and compiler.])
236        elif test x"${mp_cv_objc_runtime_gnu}" = x"yes"; then
237                        OBJC_RUNTIME="GNU_RUNTIME"
238                        OBJC_RUNTIME_FLAGS="-fgnu-runtime"
239                        AC_MSG_NOTICE([Using GNU Objective-C runtime])
240                        AC_DEFINE([GNU_RUNTIME], 1, [Define if using the GNU Objective-C runtime and compiler.])
241        elif test x"${with_objc_runtime}" = x"no"; then
242                        OBJC_RUNTIME="none"
243                        AC_MSG_NOTICE([Not using Objective-C runtime])
244        else
245                        AC_MSG_FAILURE([Could not locate a working Objective-C runtime.])
246        fi
247
248        # Restore LIBS & OBJCFLAGS
249        LIBS="${OLD_LIBS}"
250        OBJCFLAGS="${OLD_OBJCFLAGS}"
251
252        AC_SUBST([OBJC_RUNTIME])
253        AC_SUBST([OBJC_RUNTIME_FLAGS])
254        AC_SUBST([OBJC_LIBS])
255
256        AC_SUBST([OBJC_PTHREAD_LIBS])
257        AC_SUBST([OBJC_PTHREAD_CFLAGS])
258
259        AC_LANG_POP([Objective C])
260])
261
262#------------------------------------------------------------------------
263# MP_OBJC_FOUNDATION --
264#
265#       Find a functional Foundation implementation.
266#       The NeXT Foundation implementation is prefered,
267#       as it is most likely to be the system provided
268#       Foundation.
269#
270# Arguments:
271#       None.
272#
273# Requires:
274#       OBJC_RUNTIME
275#
276# Depends:
277#       AC_PROG_OBJC from objc.m4
278#
279# Results:
280#
281#       Adds a --with-objc-foundation switch to configure.
282#       Result is cached.
283#
284#       Defines one of the following preprocessor macros:
285#               APPLE_FOUNDATION GNUSTEP_FOUNDATION
286#
287#       Substitutes the following variables:
288#               OBJC_FOUNDATION OBJC_FOUNDATION_LDFLAGS
289#               OBJC_FOUNDATION_CPPFLAGS OBJC_FOUNDATION_LIBS
290#------------------------------------------------------------------------
291AC_DEFUN([MP_OBJC_FOUNDATION],[
292        AC_REQUIRE([AC_PROG_OBJC])
293        AC_ARG_WITH(objc-foundation, [  --with-objc-foundation  Specify either "GNUstep" or "apple"], [with_objc_foundation=${withval}])
294
295        if test x"${with_objc_foundation}" != x; then
296                case "${with_objc_foundation}" in
297                        GNUstep)
298                                ;;
299                        GNU)
300                                with_objc_foundation="GNUstep"
301                                ;;
302                        apple)
303                                ;;
304                        no)
305                                ;;
306                        *)
307                                AC_MSG_ERROR([${with_objc_foundation} is not a valid argument to --with-objc-foundation. Please specify either "GNU" or "apple"])
308                                ;;
309                esac
310        fi
311
312        AC_LANG_PUSH([Objective C])
313
314        if test x"${with_objc_foundation}" != x"no"; then
315       
316        if test x"${with_objc_foundation}" = x || test x"${with_objc_foundation}" = x"apple"; then
317                # '@<:@' = '['
318                # '@:>@' = ']'
319                AC_MSG_CHECKING([for Apple Foundation library])
320
321                # Set NeXT LIBS and CFLAGS
322                APPLE_FOUNDATION_CFLAGS=""
323                APPLE_FOUNDATION_LIBS="-framework Foundation"
324
325                AC_CACHE_VAL(ac_cv_objc_foundation_apple, [
326                        # Save old LIBS and CFLAGS
327                        LIBS_OLD="${LIBS}"
328                        CFLAGS_OLD="${CFLAGS}"
329
330                        CFLAGS="${APPLE_FOUNDATION_CFLAGS} ${CFLAGS}"
331                        LIBS="${APPLE_FOUNDATION_LIBS} ${LIBS}"
332
333                        AC_LINK_IFELSE([
334                                        AC_LANG_PROGRAM([
335                                                                #include <Foundation/Foundation.h>
336                                                        ], [
337                                                                NSString *string = @<:@@<:@NSString alloc@:>@ initWithCString: "Hello World"@:>@;
338                                                                @<:@NSString length@:>@;
339                                                        ])
340                                        ],[
341                                                ac_cv_objc_foundation_apple="yes"
342                                        ],[
343                                                ac_cv_objc_foundation_apple="no"
344                                        ]
345                        )
346                        # Restore LIBS and CFLAGS
347                        LIBS="${LIBS_OLD}"
348                        CFLAGS="${CFLAGS_OLD}"
349                ])
350                AC_MSG_RESULT(${ac_cv_objc_foundation_apple})
351        else
352                ac_cv_objc_foundation_apple="no"
353        fi
354
355        if test x"${with_objc_foundation}" = x || test x"${with_objc_foundation}" = x"GNUstep"; then
356                GNUSTEP_CONFIG=/usr/bin/gnustep-config
357                if test ! -x "${GNUSTEP_CONFIG}" -a x"${GNUSTEP_SYSTEM_ROOT}" = x; then
358                        if test x"${with_objc_foundation}" = x"GNUstep"; then
359                                AC_MSG_ERROR([GNUSTEP_SYSTEM_ROOT is not defined in your environment, preventing the use of GNUstep's Foundation library])
360                        else
361                                AC_MSG_WARN([GNUSTEP_SYSTEM_ROOT is not defined in your environment, preventing the use of GNUstep's Foundation library])
362                        fi
363                else
364
365                        AC_MSG_CHECKING([for GNUstep Foundation library])
366
367                        # Set GNUstep LDFLAGS, CPPFLAGS, and LIBS
368                        if test -x ${GNUSTEP_CONFIG}; then
369                        GNUSTEP_LDFLAGS=`sh -c "MAKELEVEL=0 ${GNUSTEP_CONFIG} --objc-libs"`
370                        GNUSTEP_CPPFLAGS=`sh -c "MAKELEVEL=0 ${GNUSTEP_CONFIG} --objc-flags"`
371                        GNUSTEP_LIBS=`sh -c "MAKELEVEL=0 ${GNUSTEP_CONFIG} --base-libs"`
372                        else
373                        GNUSTEP_LDFLAGS="-L${GNUSTEP_SYSTEM_ROOT}/Library/Libraries/"
374                        GNUSTEP_CPPFLAGS="-I${GNUSTEP_SYSTEM_ROOT}/Library/Headers/"
375                        GNUSTEP_LIBS="-lgnustep-base"
376                        fi
377
378                        AC_CACHE_VAL(ac_cv_objc_foundation_gnustep, [
379                                # Save old LDFLAGS, CPPFLAGS, and LIBS
380                                LDFLAGS_OLD="${LDFLAGS}"
381                                CPPFLAGS_OLD="${CPPFLAGS}"
382                                LIBS_OLD="${LIBS}"
383
384                                LDFLAGS="${GNUSTEP_LDFLAGS} ${LDFLAGS}"
385                                CPPFLAGS="${GNUSTEP_CPPFLAGS} ${CPPFLAGS}"
386                                LIBS="${GNUSTEP_LIBS} ${LIBS}"
387
388                                AC_LINK_IFELSE([
389                                                AC_LANG_PROGRAM([
390                                                                        #include <Foundation/Foundation.h>
391                                                                ], [
392                                                                        NSString *string = @<:@@<:@NSString alloc@:>@ initWithCString: "Hello World"@:>@;
393                                                                        @<:@NSString length@:>@;
394                                                                ])
395                                                ],[
396                                                        ac_cv_objc_foundation_gnustep="yes"
397                                                ],[
398                                                        ac_cv_objc_foundation_gnustep="no"
399                                                ]
400                                )
401                                # Restore LDFLAGS, CPPFLAGS, and LIBS
402                                LDFLAGS="${LDFLAGS_OLD}"
403                                CPPFLAGS="${CPPFLAGS_OLD}"
404                                LIBS="${LIBS_OLD}"
405                        ])
406                        AC_MSG_RESULT(${ac_cv_objc_foundation_gnustep})
407                fi
408        else
409                ac_cv_objc_foundation_gnustep="no"
410        fi
411
412        fi
413       
414        # NeXT Foundation is prefered
415        if test x"${ac_cv_objc_foundation_apple}" = x"yes"; then
416                OBJC_FOUNDATION="Apple"
417                OBJC_FOUNDATION_CPPFLAGS="${APPLE_FOUNDATION_CFLAGS}"
418                OBJC_FOUNDATION_LIBS="${APPLE_FOUNDATION_LIBS}"
419                OBJC_FOUNDATION_LDFLAGS=""
420                AC_DEFINE([APPLE_FOUNDATION], 1, [Define if using the Apple Foundation framework])
421                AC_MSG_NOTICE([Using Apple Foundation library])
422        elif test x"${ac_cv_objc_foundation_gnustep}" = x"yes"; then
423                OBJC_FOUNDATION="GNUstep"
424                OBJC_FOUNDATION_CPPFLAGS="${GNUSTEP_CPPFLAGS}"
425                OBJC_FOUNDATION_LIBS="${GNUSTEP_LIBS}"
426                OBJC_FOUNDATION_LDFLAGS="${GNUSTEP_LDFLAGS}"
427                AC_DEFINE([GNUSTEP_FOUNDATION], 1, [Define if using the GNUstep Foundation library])
428                AC_MSG_NOTICE([Using GNUstep Foundation library])
429        elif test x"${with_objc_foundation}" = x"no" || test x"$MACOSX_VERSION" = x; then
430                OBJC_FOUNDATION="none"
431                AC_MSG_NOTICE([Not using Foundation implementation])
432        else
433                AC_MSG_ERROR([Could not find a working Foundation implementation])
434        fi
435
436        AC_SUBST([OBJC_FOUNDATION])
437        AC_SUBST([OBJC_FOUNDATION_LDFLAGS])
438        AC_SUBST([OBJC_FOUNDATION_CPPFLAGS])
439        AC_SUBST([OBJC_FOUNDATION_LIBS])
440
441        AC_LANG_POP([Objective C])
442])
Note: See TracBrowser for help on using the repository browser.