comparison third_party/sqlite3/autosetup/teaish/feature.tcl @ 167:589bab390fb4

[ThirdParty] Added sqlite3 to the third_party.
author MrJuneJune <me@mrjunejune.com>
date Mon, 19 Jan 2026 16:28:45 -0800
parents
children
comparison
equal deleted inserted replaced
166:78ea8d5ccc87 167:589bab390fb4
1 ########################################################################
2 # 2025 April 7
3 #
4 # The author disclaims copyright to this source code. In place of
5 # a legal notice, here is a blessing:
6 #
7 # * May you do good and not evil.
8 # * May you find forgiveness for yourself and forgive others.
9 # * May you share freely, never taking more than you give.
10 #
11 ########################################################################
12 # ----- @module feature-tests.tcl -----
13 # @section TEA-ish collection of feature tests.
14 #
15 # Functions in this file with a prefix of teaish__ are
16 # private/internal APIs. Those with a prefix of teaish- are
17 # public APIs.
18
19
20 # @teaish-check-libz
21 #
22 # Checks for zlib.h and the function deflate in libz. If found,
23 # prepends -lz to the extension's ldflags and returns 1, else returns
24 # 0. It also defines LDFLAGS_LIBZ to the libs flag.
25 #
26 proc teaish-check-libz {} {
27 teaish-check-cached "Checking for libz" {
28 set rc 0
29 if {[msg-quiet cc-check-includes zlib.h] && [msg-quiet proj-check-function-in-lib deflate z]} {
30 teaish-ldflags-prepend [define LDFLAGS_LIBZ [get-define lib_deflate]]
31 undefine lib_deflate
32 incr rc
33 }
34 expr $rc
35 }
36 }
37
38 # @teaish-check-librt ?funclist?
39 #
40 # Checks whether -lrt is needed for any of the given functions. If
41 # so, appends -lrt via [teaish-ldflags-prepend] and returns 1, else
42 # returns 0. It also defines LDFLAGS_LIBRT to the libs flag or an
43 # empty string.
44 #
45 # Some systems (ex: SunOS) require -lrt in order to use nanosleep.
46 #
47 proc teaish-check-librt {{funclist {fdatasync nanosleep}}} {
48 teaish-check-cached -nostatus "Checking whether ($funclist) need librt" {
49 define LDFLAGS_LIBRT ""
50 foreach func $funclist {
51 if {[msg-quiet proj-check-function-in-lib $func rt]} {
52 set ldrt [get-define lib_${func}]
53 undefine lib_${func}
54 if {"" ne $ldrt} {
55 teaish-ldflags-prepend -r [define LDFLAGS_LIBRT $ldrt]
56 msg-result $ldrt
57 return 1
58 } else {
59 msg-result "no lib needed"
60 return 1
61 }
62 }
63 }
64 msg-result "not found"
65 return 0
66 }
67 }
68
69 # @teaish-check-stdint
70 #
71 # A thin proxy for [cc-with] which checks for <stdint.h> and the
72 # various fixed-size int types it declares. It defines HAVE_STDINT_T
73 # to 0 or 1 and (if it's 1) defines HAVE_XYZ_T for each XYZ int type
74 # to 0 or 1, depending on whether its available.
75 proc teaish-check-stdint {} {
76 teaish-check-cached "Checking for stdint.h" {
77 msg-quiet cc-with {-includes stdint.h} \
78 {cc-check-types int8_t int16_t int32_t int64_t intptr_t \
79 uint8_t uint16_t uint32_t uint64_t uintptr_t}
80 }
81 }
82
83 # @teaish-is-mingw
84 #
85 # Returns 1 if building for mingw, else 0.
86 proc teaish-is-mingw {} {
87 return [expr {
88 [string match *mingw* [get-define host]] &&
89 ![file exists /dev/null]
90 }]
91 }
92
93 # @teaish-check-libdl
94 #
95 # Checks for whether dlopen() can be found and whether it requires
96 # -ldl for linking. If found, returns 1, defines LDFLAGS_DLOPEN to the
97 # linker flags (if any), and passes those flags to
98 # teaish-ldflags-prepend. It unconditionally defines HAVE_DLOPEN to 0
99 # or 1 (the its return result value).
100 proc teaish-check-dlopen {} {
101 teaish-check-cached -nostatus "Checking for dlopen()" {
102 set rc 0
103 set lfl ""
104 if {[cc-with {-includes dlfcn.h} {
105 cctest -link 1 -declare "extern char* dlerror(void);" -code "dlerror();"}]} {
106 msg-result "-ldl not needed"
107 incr rc
108 } elseif {[cc-check-includes dlfcn.h]} {
109 incr rc
110 if {[cc-check-function-in-lib dlopen dl]} {
111 set lfl [get-define lib_dlopen]
112 undefine lib_dlopen
113 msg-result " dlopen() needs $lfl"
114 } else {
115 msg-result " - dlopen() not found in libdl. Assuming dlopen() is built-in."
116 }
117 } else {
118 msg-result "not found"
119 }
120 teaish-ldflags-prepend [define LDFLAGS_DLOPEN $lfl]
121 define HAVE_DLOPEN $rc
122 }
123 }
124
125 #
126 # @teaish-check-libmath
127 #
128 # Handles the --enable-math flag. Returns 1 if found, else 0.
129 # If found, it prepends -lm (if needed) to the linker flags.
130 proc teaish-check-libmath {} {
131 teaish-check-cached "Checking for libc math library" {
132 set lfl ""
133 set rc 0
134 if {[msg-quiet proj-check-function-in-lib ceil m]} {
135 incr rc
136 set lfl [get-define lib_ceil]
137 undefine lib_ceil
138 teaish-ldflags-prepend $lfl
139 msg-checking "$lfl "
140 }
141 define LDFLAGS_LIBMATH $lfl
142 expr $rc
143 }
144 }
145
146 # @teaish-import-features ?-flags? feature-names...
147 #
148 # For each $name in feature-names... it invokes:
149 #
150 # use teaish/feature/$name
151 #
152 # to load TEAISH_AUTOSETUP_DIR/feature/$name.tcl
153 #
154 # By default, if a proc named teaish-check-${name}-options is defined
155 # after sourcing a file, it is called and its result is passed to
156 # proj-append-options. This can be suppressed with the -no-options
157 # flag.
158 #
159 # Flags:
160 #
161 # -no-options: disables the automatic running of
162 # teaish-check-NAME-options,
163 #
164 # -run: if the function teaish-check-NAME exists after importing
165 # then it is called. This flag must not be used when calling this
166 # function from teaish-options. This trumps both -pre and -post.
167 #
168 # -pre: if the function teaish-check-NAME exists after importing
169 # then it is passed to [teaish-checks-queue -pre].
170 #
171 # -post: works like -pre but instead uses[teaish-checks-queue -post].
172 proc teaish-import-features {args} {
173 set pk ""
174 set doOpt 1
175 proj-parse-simple-flags args flags {
176 -no-options 0 {set doOpt 0}
177 -run 0 {expr 1}
178 -pre 0 {set pk -pre}
179 -post 0 {set pk -post}
180 }
181 #
182 # TODO: never import the same module more than once. The "use"
183 # command is smart enough to not do that but we would need to
184 # remember whether or not any teaish-check-${arg}* procs have been
185 # called before, and skip them.
186 #
187 if {$flags(-run) && "" ne $pk} {
188 proj-error "Cannot use both -run and $pk" \
189 " (called from [proj-scope 1])"
190 }
191
192 foreach arg $args {
193 uplevel "use teaish/feature/$arg"
194 if {$doOpt} {
195 set n "teaish-check-${arg}-options"
196 if {[llength [info proc $n]] > 0} {
197 if {"" ne [set x [$n]]} {
198 options-add $x
199 }
200 }
201 }
202 if {$flags(-run)} {
203 set n "teaish-check-${arg}"
204 if {[llength [info proc $n]] > 0} {
205 uplevel 1 $n
206 }
207 } elseif {"" ne $pk} {
208 set n "teaish-check-${arg}"
209 if {[llength [info proc $n]] > 0} {
210 teaish-checks-queue {*}$pk $n
211 }
212 }
213 }
214 }