diff third_party/sqlite3/autosetup/cc-lib.tcl @ 173:827c6ac504cd hg-web

Merged in default here.
author MrJuneJune <me@mrjunejune.com>
date Mon, 19 Jan 2026 18:59:10 -0800
parents 589bab390fb4
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/third_party/sqlite3/autosetup/cc-lib.tcl	Mon Jan 19 18:59:10 2026 -0800
@@ -0,0 +1,187 @@
+# 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
+	}
+}