188 lines
4.4 KiB
Tcl
188 lines
4.4 KiB
Tcl
|
# 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
|
||
|
}
|
||
|
}
|