123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- # Copyright (c) 2011 WorkWare Systems http://www.workware.net.au/
- # All rights reserved
- # @synopsis:
- #
- # Provides a library of common tests on top of the 'cc' module.
- use cc
- # @cc-check-lfs
- #
- # The equivalent of the 'AC_SYS_LARGEFILE' macro.
- #
- # defines 'HAVE_LFS' if LFS is available,
- # and defines '_FILE_OFFSET_BITS=64' if necessary
- #
- # Returns 1 if 'LFS' is available or 0 otherwise
- #
- proc cc-check-lfs {} {
- cc-check-includes sys/types.h
- msg-checking "Checking if -D_FILE_OFFSET_BITS=64 is needed..."
- set lfs 1
- if {[msg-quiet cc-with {-includes sys/types.h} {cc-check-sizeof off_t}] == 8} {
- msg-result no
- } elseif {[msg-quiet cc-with {-includes sys/types.h -cflags -D_FILE_OFFSET_BITS=64} {cc-check-sizeof off_t}] == 8} {
- define _FILE_OFFSET_BITS 64
- msg-result yes
- } else {
- set lfs 0
- msg-result none
- }
- define-feature lfs $lfs
- return $lfs
- }
- # @cc-check-endian
- #
- # The equivalent of the 'AC_C_BIGENDIAN' macro.
- #
- # defines 'HAVE_BIG_ENDIAN' if endian is known to be big,
- # or 'HAVE_LITTLE_ENDIAN' if endian is known to be little.
- #
- # Returns 1 if determined, or 0 if not.
- #
- proc cc-check-endian {} {
- cc-check-includes sys/types.h sys/param.h
- set rc 0
- msg-checking "Checking endian..."
- cc-with {-includes {sys/types.h sys/param.h}} {
- if {[cctest -code {
- #if !defined(BIG_ENDIAN) || !defined(BYTE_ORDER)
- #error unknown
- #elif BYTE_ORDER != BIG_ENDIAN
- #error little
- #endif
- }]} {
- define-feature big-endian
- msg-result "big"
- set rc 1
- } elseif {[cctest -code {
- #if !defined(LITTLE_ENDIAN) || !defined(BYTE_ORDER)
- #error unknown
- #elif BYTE_ORDER != LITTLE_ENDIAN
- #error big
- #endif
- }]} {
- define-feature little-endian
- msg-result "little"
- set rc 1
- } else {
- msg-result "unknown"
- }
- }
- return $rc
- }
- # @cc-check-flags flag ?...?
- #
- # Checks whether the given C/C++ compiler flags can be used. Defines feature
- # names prefixed with 'HAVE_CFLAG' and 'HAVE_CXXFLAG' respectively, and
- # appends working flags to '-cflags' and 'AS_CFLAGS' or 'AS_CXXFLAGS'.
- proc cc-check-flags {args} {
- set result 1
- array set opts [cc-get-settings]
- switch -exact -- $opts(-lang) {
- c++ {
- set lang C++
- set prefix CXXFLAG
- }
- c {
- set lang C
- set prefix CFLAG
- }
- default {
- autosetup-error "cc-check-flags failed with unknown language: $opts(-lang)"
- }
- }
- foreach flag $args {
- msg-checking "Checking whether the $lang compiler accepts $flag..."
- if {[cctest -cflags $flag]} {
- msg-result yes
- define-feature $prefix$flag
- cc-with [list -cflags [list $flag]]
- define-append AS_${prefix}S $flag
- } else {
- msg-result no
- set result 0
- }
- }
- return $result
- }
- # @cc-check-standards ver ?...?
- #
- # Checks whether the C/C++ compiler accepts one of the specified '-std=$ver'
- # options, and appends the first working one to '-cflags' and 'AS_CFLAGS' or
- # 'AS_CXXFLAGS'.
- proc cc-check-standards {args} {
- array set opts [cc-get-settings]
- foreach std $args {
- if {[cc-check-flags -std=$std]} {
- return $std
- }
- }
- return ""
- }
- # Checks whether $keyword is usable as alignof
- proc cctest_alignof {keyword} {
- msg-checking "Checking for $keyword..."
- if {[cctest -code "int x = ${keyword}(char), y = ${keyword}('x');"]} then {
- msg-result ok
- define-feature $keyword
- } else {
- msg-result "not found"
- }
- }
- # @cc-check-c11
- #
- # Checks for several C11/C++11 extensions and their alternatives. Currently
- # checks for '_Static_assert', '_Alignof', '__alignof__', '__alignof'.
- proc cc-check-c11 {} {
- msg-checking "Checking for _Static_assert..."
- if {[cctest -code {
- _Static_assert(1, "static assertions are available");
- }]} then {
- msg-result ok
- define-feature _Static_assert
- } else {
- msg-result "not found"
- }
- cctest_alignof _Alignof
- cctest_alignof __alignof__
- cctest_alignof __alignof
- }
- # @cc-check-alloca
- #
- # The equivalent of the 'AC_FUNC_ALLOCA' macro.
- #
- # Checks for the existence of 'alloca'
- # defines 'HAVE_ALLOCA' and returns 1 if it exists.
- proc cc-check-alloca {} {
- cc-check-some-feature alloca {
- cctest -includes alloca.h -code { alloca (2 * sizeof (int)); }
- }
- }
- # @cc-signal-return-type
- #
- # The equivalent of the 'AC_TYPE_SIGNAL' macro.
- #
- # defines 'RETSIGTYPE' to 'int' or 'void'.
- proc cc-signal-return-type {} {
- msg-checking "Checking return type of signal handlers..."
- cc-with {-includes {sys/types.h signal.h}} {
- if {[cctest -code {return *(signal (0, 0)) (0) == 1;}]} {
- set type int
- } else {
- set type void
- }
- define RETSIGTYPE $type
- msg-result $type
- }
- }
|