1 # Copyright (c) 2011 WorkWare Systems http://www.workware.net.au/
6 # Provides a library of common tests on top of the 'cc' module.
14 # The equivalent of the AC_SYS_LARGEFILE macro
16 # defines 'HAVE_LFS' if LFS is available,
17 # and defines '_FILE_OFFSET_BITS=64' if necessary
19 # Returns 1 if 'LFS' is available or 0 otherwise
21 proc cc-check-lfs
{} {
22 cc-check-includes sys
/types.h
23 msg-checking
"Checking if -D_FILE_OFFSET_BITS=64 is needed..."
25 if {[msg-quiet cc-with
{-includes sys
/types.h
} {cc-check-sizeof off_t
}] == 8} {
27 } elseif
{[msg-quiet cc-with
{-includes sys
/types.h
-cflags -D_FILE_OFFSET_BITS=64} {cc-check-sizeof off_t
}] == 8} {
28 define _FILE_OFFSET_BITS
64
34 define-feature lfs
$lfs
40 # The equivalent of the AC_C_BIGENDIAN macro
42 # defines 'HAVE_BIG_ENDIAN' if endian is known to be big,
43 # or 'HAVE_LITTLE_ENDIAN' if endian is known to be little.
45 # Returns 1 if determined, or 0 if not.
47 proc cc-check-endian
{} {
48 cc-check-includes sys
/types.h sys
/param.h
50 msg-checking
"Checking endian..."
51 cc-with
{-includes {sys
/types.h sys
/param.h
}} {
53 #if !defined(BIG_ENDIAN) || !defined(BYTE_ORDER)
55 #elif BYTE_ORDER != BIG_ENDIAN
59 define-feature big-endian
62 } elseif
{[cctest
-code {
63 #if !defined(LITTLE_ENDIAN) || !defined(BYTE_ORDER)
65 #elif BYTE_ORDER != LITTLE_ENDIAN
69 define-feature little-endian
79 # @cc-check-flags flag ?...?
81 # Checks whether the given C/C++ compiler flags can be used. Defines feature
82 # names prefixed with 'HAVE_CFLAG' and 'HAVE_CXXFLAG' respectively, and
83 # appends working flags to '-cflags' and 'CFLAGS' or 'CXXFLAGS'.
84 proc cc-check-flags
{args
} {
86 array set opts
[cc-get-settings
]
87 switch -exact -- $opts(-lang) {
97 autosetup-error
"cc-check-flags failed with unknown language: $opts(-lang)"
101 msg-checking
"Checking whether the $lang compiler accepts $flag..."
102 if {[cctest
-cflags $flag]} {
104 define-feature
$prefix$flag
105 cc-with
[list -cflags [list $flag]]
106 define-append
${prefix
}S
$flag
115 # @cc-check-standards ver ?...?
117 # Checks whether the C/C++ compiler accepts one of the specified '-std=$ver'
118 # options, and appends the first working one to '-cflags' and 'CFLAGS' or
120 proc cc-check-standards
{args
} {
121 array set opts
[cc-get-settings
]
123 if {[cc-check-flags
-std=$std]} {
130 # Checks whether $keyword is usable as alignof
131 proc cctest_alignof
{keyword
} {
132 msg-checking
"Checking for $keyword..."
133 if {[cctest
-code [subst -nobackslashes {
134 printf
("minimum alignment is %d == %d\n", ${keyword
}(char
), ${keyword
}('x'
));
137 define-feature
$keyword
139 msg-result
"not found"
145 # Checks for several C11/C++11 extensions and their alternatives. Currently
146 # checks for '_Static_assert', '_Alignof', '__alignof__', '__alignof'.
147 proc cc-check-c11
{} {
148 msg-checking
"Checking for _Static_assert..."
150 _Static_assert
(1, "static assertions are available");
153 define-feature _Static_assert
155 msg-result
"not found"
158 cctest_alignof _Alignof
159 cctest_alignof __alignof__
160 cctest_alignof __alignof
165 # The equivalent of the AC_FUNC_ALLOCA macro
167 # Checks for the existence of alloca
168 # defines HAVE_ALLOCA and returns 1 if it exists
169 proc cc-check-alloca
{} {
170 cc-check-some-feature alloca
{
171 cctest
-includes alloca.h
-code { alloca
(2 * sizeof
(int
)); }
175 # @cc-signal-return-type
177 # The equivalent of the AC_TYPE_SIGNAL macro
179 # defines RETSIGTYPE to int or void
180 proc cc-signal-return-type
{} {
181 msg-checking
"Checking return type of signal handlers..."
182 cc-with
{-includes {sys
/types.h signal.h
}} {
183 if {[cctest
-code {return *(signal
(0, 0)) (0) == 1;}]} {
188 define RETSIGTYPE
$type