diff options
Diffstat (limited to 'auto.def')
| -rw-r--r-- | auto.def | 1005 |
1 files changed, 1005 insertions, 0 deletions
diff --git a/auto.def b/auto.def new file mode 100644 index 0000000..c7295a7 --- /dev/null +++ b/auto.def @@ -0,0 +1,1005 @@ +# System autoconfiguration. Try: ./configure --help + +# This must be above "options" below because it implicitly brings in the +# default Autosetup options, things like --prefix. +use cc cc-lib local + +options { + with-openssl:path|auto|tree|none + => {Look for OpenSSL in the given path, automatically, in the source tree, or none} + with-zlib:path|auto|tree + => {Look for zlib in the given path, automatically, or in the source tree} + with-sqlite:path|auto|tree + => {Look for sqlite in the given path, automatically, or in the source tree.} + with-exec-rel-paths=0 + => {Enable relative paths for external diff/gdiff} + with-sanitizer: => {Build with C compiler's -fsanitize=LIST; e.g. address,enum,null,undefined} + with-th1-docs=0 => {Enable TH1 for embedded documentation pages} + with-th1-hooks=0 => {Enable TH1 hooks for commands and web pages} + with-tcl:path => {Enable Tcl integration, with Tcl in the specified path} + with-tcl-stubs=0 => {Enable Tcl integration via stubs library mechanism} + with-tcl-private-stubs=0 + => {Enable Tcl integration via private stubs mechanism} + with-mman=0 => {Enable use of POSIX memory APIs from "sys/mman.h"} + with-see=0 => {Enable the SQLite Encryption Extension (SEE)} + print-minimum-sqlite-version=0 + => {print the minimum SQLite version number required, and exit} + internal-sqlite=1 => {Don't use the internal SQLite, use the system one} + static=0 => {Link a static executable} + fusefs=1 => {Disable the Fuse Filesystem} + fossil-debug=0 => {Build with fossil debugging enabled} + no-opt=0 => {Build without optimization} + json=0 => {Build with fossil JSON API enabled} + with-emsdk:path => {Directory containing the Emscripten SDK} + compile-commands=0 => + "Check for compile_commands.json support." +} + +# Update the minimum required SQLite version number here, and also +# in src/main.c near the sqlite3_libversion_number() call. Take care +# that both places agree! +define MINIMUM_SQLITE_VERSION "3.54.0" + +# This is useful for people wanting Fossil to use an external SQLite library +# to compare the one they have against the minimum required +if {[opt-bool print-minimum-sqlite-version]} { + puts [get-define MINIMUM_SQLITE_VERSION] + exit 0 +} + +# Space characters have never been allowed in either the source +# tree nor the build directory. But the resulting error messages +# could be confusing. The following checks make the reason for the +# failure clear. +# +set ::dirSrc $::autosetup(srcdir) +if {[string first " " $$::dirSrc] != -1} { + user-error "The pathname of the source tree\ + may not contain space characters" +} +if {[string first " " $autosetup(builddir)] != -1} { + user-error "The pathname of the build directory\ + may not contain space characters" +} + +set outOfTreeBuild 0 +if {![file exists fossil.1]} { + puts "This appears to be an out-of-tree build." + set outOfTreeBuild 1 +} + +# sqlite wants these types if possible +cc-with {-includes {stdint.h inttypes.h}} { + cc-check-types uint32_t uint16_t int16_t uint8_t +} + +# Use pread/pwrite system calls in place of seek + read/write if possible +define USE_PREAD [cc-check-functions pread] + +# If we have cscope here, we'll use it in the "tags" target +if {[cc-check-progs cscope]} { + define COLLECT_CSCOPE_DATA "cscope -bR $$::dirSrc/src/*.\[ch\]" +} else { + define COLLECT_CSCOPE_DATA "" +} + +# Find tclsh for the test suite. +# +# We can't use jimsh for this: the test suite uses features of Tcl that +# Jim doesn't support, either statically or due to the way it's built by +# autosetup. For example, Jim supports `file normalize`, but only if +# you build it with HAVE_REALPATH, which won't ever be defined in this +# context because autosetup doesn't try to discover platform-specific +# details like that before it decides to build jimsh0. Besides which, +# autosetup won't build jimsh0 at all if it can find tclsh itself. +# Ironically, this means we may right now be running under either jimsh0 +# or a version of tclsh that we find unsuitable below! +cc-check-progs tclsh +set hbtd /usr/local/Cellar/tcl-tk +if {[string equal false [get-define TCLSH]]} { + msg-result "WARNING: 'make test' will not run here." + set v 8.6 +} else { + set v [exec sh -c "echo 'puts \$tcl_version' | tclsh"] + if {$v >= 8.6} { + msg-result "Found Tclsh version $v in the PATH." + define TCLSH tclsh + } elseif {[file isdirectory $hbtd]} { + # This is a macOS system with the Homebrew version of Tcl/Tk + # installed. Select the newest version. It won't normally be + # in the PATH to avoid shadowing /usr/bin/tclsh, and even if it + # were in the PATH, it's bad practice to put /usr/local/bin (the + # Homebrew default) ahead of /usr/bin, especially given that + # it's user-writeable by default with Homebrew. Thus, we can be + # pretty sure the only way to call it is with an absolute path. + set v [exec ls -tr $hbtd | tail -1] + set path "$hbtd/$v/bin/tclsh" + define TCLSH $path + msg-result "Using Homebrew Tcl/Tk version $path." + } else { + msg-result "WARNING: tclsh $v found; need >= 8.6 for 'make test'." + define TCLSH false ;# force "make test" failure via /usr/bin/false + } +} + +define CFLAGS [get-env CFLAGS "-g -Os"] +define EXTRA_CFLAGS "-Wall" +define EXTRA_LDFLAGS "" +define USE_SYSTEM_SQLITE 0 +define USE_LINENOISE 0 +define USE_MMAN_H 0 +define USE_SEE 0 +define SQLITE3_ORIGIN 0 +# SQLITE3_ORIGIN 0 = src/sqlite3, 1=src/sqlite3-see.c, 2=client-provided +define SQLITE_OPTIONS_EXT "" +# SQLITE_OPTIONS_EXT => build-dependent CFLAGS for sqlite3.c and shell.c + +# Maintain the C89/C90-style order of variable declarations before statements. +# Check if the compiler supports the respective warning flag. +if {[cctest -cflags -Wdeclaration-after-statement]} { + define-append EXTRA_CFLAGS -Wdeclaration-after-statement +} + + +# This procedure is a customized version of "cc-check-function-in-lib", +# that does not modify the LIBS variable. Its use prevents prematurely +# pulling in libraries that will be added later anyhow (e.g. "-ldl"). +proc check-function-in-lib {function libs {otherlibs {}}} { + if {[string length $otherlibs]} { + msg-checking "Checking for $function in $libs with $otherlibs..." + } else { + msg-checking "Checking for $function in $libs..." + } + set found 0 + cc-with [list -libs $otherlibs] { + if {[cctest_function $function]} { + msg-result "none needed" + define lib_$function "" + incr found + } else { + foreach lib $libs { + cc-with [list -libs -l$lib] { + if {[cctest_function $function]} { + msg-result -l$lib + define lib_$function -l$lib + incr found + break + } + } + } + } + } + if {$found} { + define [feature-define-name $function] + } else { + msg-result "no" + } + return $found +} + +if {![opt-bool internal-sqlite]} { + proc find_system_sqlite {} { + + # On some systems (slackware), libsqlite3 requires -ldl to link. So + # search for the system SQLite once with -ldl, and once without. If + # the library can only be found with $extralibs set to -ldl, then + # the code below will append -ldl to LIBS. + # + foreach extralibs {{} {-ldl}} { + + # Locate the system SQLite by searching for sqlite3_open(). Then check + # if sqlite3_stmt_isexplain can be found as well. If we can find open() but + # not stmt_isexplain(), then the system SQLite is too old to link against + # fossil. + # + if {[check-function-in-lib sqlite3_open sqlite3 $extralibs]} { + # Success. Update symbols and return. + # + define USE_SYSTEM_SQLITE 1 + define-append LIBS -lsqlite3 + define-append LIBS $extralibs + return + } + } + user-error "system sqlite3 not found" + } + + find_system_sqlite + + proc test_system_sqlite {} { + # Check compatibility of the system SQLite library by running the + # sqlcompttest.c program in the source tree passes + # MINIMUM_SQLITE_VERSION set at the top of this file to + # sqlcompttest.c + # + set cmdline {} + lappend cmdline {*}[get-define CCACHE] + lappend cmdline {*}[get-define CC] {*}[get-define CFLAGS] + lappend cmdline $::dirSrc/tools/sqlcompattest.c + lappend cmdline -o conftest__ + lappend cmdline {*}[get-define LDFLAGS] + lappend cmdline {*}[get-define LIBS] + set sqlite-version [string cat "-D MINIMUM_SQLITE_VERSION=" [get-define MINIMUM_SQLITE_VERSION]] + lappend cmdline {*}[set sqlite-version] + set ok 1 + set err [catch {exec-with-stderr {*}$cmdline} result errinfo] + if {$err} { + configlog "Failed: [join $cmdline]" + if {[string length $result]>0} {configlog $result} + configlog "============" + set ok 0 + } elseif {$::autosetup(debug)} { + configlog "Compiled OK: [join $cmdline]" + configlog "============" + } + if {!$ok} { + user-error "unable to compile SQLite compatibility test program" + } + set err [catch {exec-with-stderr ./conftest__} result errinfo] + if {[get-define build] eq [get-define host]} { + set err [catch {exec-with-stderr ./conftest__} result errinfo] + if {$err} { + user-error $result + } + } + file delete ./conftest__ + } + test_system_sqlite + +} + +proc is_mingw {} { + return [expr { + [string match *mingw* [get-define host]] && + ![file exists "/dev/null"] + }] +} + +if {[is_mingw]} { + define-append EXTRA_CFLAGS -DBROKEN_MINGW_CMDLINE + define-append LIBS -lkernel32 -lws2_32 +} else { + # + # NOTE: All platforms except MinGW should use the linenoise + # package. It is currently unsupported on Win32. + # + define USE_LINENOISE 1 +} + +if {[string match *-solaris* [get-define host]]} { + define-append EXTRA_CFLAGS {-D__EXTENSIONS__} +} + +if {[opt-bool fossil-debug]} { + define CFLAGS {-g -O0 -Wall} + define-append CFLAGS -DFOSSIL_DEBUG + msg-result "Debugging support enabled" +} + +if {[opt-bool no-opt]} { + define CFLAGS {-g -O0 -Wall} + msg-result "Builting without compiler optimization" + if {[opt-bool fossil-debug]} { + define-append CFLAGS -DFOSSIL_DEBUG + } +} + +if {[opt-bool with-mman]} { + define-append EXTRA_CFLAGS -DUSE_MMAN_H + define USE_MMAN_H 1 + msg-result "Enabling \"sys/mman.h\" support" +} + +if {[opt-bool with-see]} { + define-append EXTRA_CFLAGS -DUSE_SEE + define USE_SEE 1 + define SQLITE3_ORIGIN 1 + msg-result "Enabling encryption support" +} + +if {[opt-bool json]} { + # Reminder/FIXME (stephan): FOSSIL_ENABLE_JSON + # is required in the CFLAGS because json*.c + # have #ifdef guards around the whole file without + # reading config.h first. + define-append EXTRA_CFLAGS -DFOSSIL_ENABLE_JSON + define FOSSIL_ENABLE_JSON + msg-result "JSON support enabled" +} + +if {[opt-bool with-exec-rel-paths]} { + define-append EXTRA_CFLAGS -DFOSSIL_ENABLE_EXEC_REL_PATHS + define FOSSIL_ENABLE_EXEC_REL_PATHS + msg-result "Relative paths in external diff/gdiff enabled" +} + +if {[opt-bool with-th1-docs]} { + define-append EXTRA_CFLAGS -DFOSSIL_ENABLE_TH1_DOCS + define FOSSIL_ENABLE_TH1_DOCS + msg-result "TH1 embedded documentation support enabled" +} + +if {[opt-bool with-th1-hooks]} { + define-append EXTRA_CFLAGS -DFOSSIL_ENABLE_TH1_HOOKS + define FOSSIL_ENABLE_TH1_HOOKS + msg-result "TH1 hooks support enabled" +} + +#if {[opt-bool markdown]} { +# # no-op. Markdown is now enabled by default. +# msg-result "Markdown support enabled" +#} + +if {[opt-bool static]} { + # XXX: This will not work on all systems. + define-append EXTRA_LDFLAGS -static + msg-result "Trying to link statically" +} else { + define-append EXTRA_CFLAGS -DFOSSIL_DYNAMIC_BUILD=1 + define FOSSIL_DYNAMIC_BUILD +} + +# Check for libraries that need to be sorted out early +cc-check-function-in-lib iconv iconv + +cc-check-function-in-lib sin m +cc-check-function-in-lib dlopen dl + +# Helper for OpenSSL checking +proc check-for-openssl {msg {cflags {}} {libs {-lssl -lcrypto -lpthread}}} { + msg-checking "Checking for $msg..." + set rc 0 + if {[is_mingw]} { + lappend libs -lgdi32 -lwsock32 -lcrypt32 + } + if {[info exists ::zlib_lib]} { + lappend libs $::zlib_lib + } + msg-quiet cc-with [list -cflags $cflags -libs $libs] { + if {[cc-check-includes openssl/ssl.h] && \ + [cc-check-functions SSL_new]} { + incr rc + } + } + if {!$rc && ![is_mingw]} { + # On some systems, OpenSSL appears to require -ldl to link. + lappend libs -ldl + msg-quiet cc-with [list -cflags $cflags -libs $libs] { + if {[cc-check-includes openssl/ssl.h] && \ + [cc-check-functions SSL_new]} { + incr rc + } + } + } + if {$rc} { + msg-result "ok" + return 1 + } else { + msg-result "no" + return 0 + } +} + +# +# Check for zlib, using the given location if specified +# +proc handle-zlib {} { + set ::zlibpath [opt-val with-zlib]; # used by downstream tcl tests + if {$::zlibpath eq "tree"} { + set ::zlibdir [file dirname $::autosetup(dir)]/compat/zlib + if {![file isdirectory $::zlibdir]} { + user-error "The zlib in source tree directory does not exist" + } elseif { ([llength [glob -nocomplain -directory $::zlibdir libz*]] == 0) } { + user-error "With --with-zlib=tree, $::zlibdir must be configured and built first." + } + cc-with [list -cflags "-I$::zlibdir -L$::zlibdir"] + define-append EXTRA_CFLAGS -I$::zlibdir + define-append LIBS $::zlibdir/libz.a + set ::zlib_lib $::zlibdir/libz.a + msg-result "Using zlib in source tree" + } else { + set cftry {""} + set ldtry {""} + if {$::zlibpath ni {auto ""}} { + lappend cftry "-I$::zlibpath" + lappend cftry "-I$::zlibpath/include" + lappend ldtry "-L$::zlibpath" + lappend ldtry "-L$::zlibpath/lib" + } + + # Reverse the list of tests so we check most-specific to least, else + # platform devel files will shadow local --with-zlib overrides. + foreach c [lreverse $cftry] { + if {[cc-with [list -cflags $c] {cc-check-includes zlib.h}]} { + if {$c eq ""} { + msg-result "Found zlib.h in default include path" + } else { + define-append EXTRA_CFLAGS "$c" + msg-result "Found zlib.h via $c" + } + set cfound $c + break + } + } + if {![info exists cfound]} { + user-error "zlib.h not found; either install it or specify its location via --with-zlib" + } + foreach lcheck [lreverse $ldtry] { + if {[cc-with [list -cflags "$cfound $lcheck"] {check-function-in-lib inflateEnd z}]} { + if {$lcheck eq ""} { + msg-result "Linked to zlib via default library path" + } else { + define-append EXTRA_LDFLAGS "$lcheck" + msg-result "Linked to zlib via $lcheck" + } + if {![check-function-in-lib compressBound z]} { + puts "Notice: disabling zlib compression in the SQL shell" + define-append SQLITE_OPTIONS_EXT {-USQLITE_HAVE_ZLIB} + } + break + } + } + set ::zlib_lib -lz + } +}; # handle-zlib +handle-zlib + +# +# Handle the --with-openssl flag and, incidentally, update @LIBS@ for +# zlib if openssl is _not_ used (if it is, we get zlib via libssl). +# +# This function should be called as late as possible in the configure +# script to avoid that its updates to @LIBS@ break tests which follow +# it when a custom local build of openssl is used, as discussed in +# <https://fossil-scm.org/forum/forumpost/15e3d9cdc137030c>. +# +proc handle-with-openssl {} { + set ssldirs [opt-val with-openssl] + if {$ssldirs ne "none"} { + set found 0 + if {$ssldirs eq "tree"} { + set ssldir [file dirname $::autosetup(dir)]/compat/openssl + if {![file isdirectory $ssldir]} { + user-error "The OpenSSL in source tree directory does not exist" + } + set msg "openssl in $ssldir" + set cflags "-I$ssldir/include" + set ldflags "-L$ssldir" + set ssllibs "$ssldir/libssl.a $ssldir/libcrypto.a -lpthread" + set found [check-for-openssl "openssl in source tree" "$cflags $ldflags" $ssllibs] + } else { + if {$ssldirs in {auto ""}} { + catch { + # TODO?: use autosetup's pkg-config support + set cflags [exec pkg-config openssl --cflags-only-I] + set ldflags [exec pkg-config openssl --libs-only-L] + set found [check-for-openssl "ssl via pkg-config" "$cflags $ldflags"] + } msg + if {!$found} { + set ssldirs "{} /usr/sfw /usr/local/ssl /usr/lib/ssl /usr/ssl \ + /usr/pkg /usr/local /usr /usr/local/opt/openssl \ + /opt/homebrew/opt/openssl" + } + } + if {!$found} { + foreach dir $ssldirs { + if {$dir eq ""} { + set msg "system openssl" + set cflags "" + set ldflags "" + } else { + set msg "openssl in $dir" + set cflags "-I$dir/include" + if {[file readable $dir/libssl.a]} { + set ldflags -L$dir + } elseif {[file readable $dir/lib/libssl.a]} { + set ldflags -L$dir/lib + } elseif {[file isdir $dir/lib]} { + set ldflags "-L$dir -L$dir/lib" + } else { + set ldflags -L$dir + } + } + if {[check-for-openssl $msg "$cflags $ldflags"]} { + incr found + break + } + if {$dir ne ""} { + set ldflags "" + set msg "static build of openssl in $dir" + set ssllibs "$dir/libssl.a $dir/libcrypto.a -lpthread" + if {[check-for-openssl $msg "$cflags $ldflags" $ssllibs]} { + incr found + break + } + # This test should arguably fail here if --with-openssl=X + # points to an invalid X. + } + } + } + } + if {$found} { + define FOSSIL_ENABLE_SSL + define-append EXTRA_CFLAGS $cflags + define-append EXTRA_LDFLAGS $ldflags + if {[info exists ssllibs]} { + define-append LIBS $ssllibs + } else { + define-append LIBS -lssl -lcrypto + } + if {[info exists ::zlib_lib]} { + define-append LIBS $::zlib_lib + } + if {[is_mingw]} { + define-append LIBS -lgdi32 -lwsock32 -lcrypt32 + } + msg-result "HTTPS support enabled" + + # Silence OpenSSL deprecation warnings on Mac OS X 10.7. + if {[string match *-darwin* [get-define host]]} { + if {[cctest -cflags {-Wdeprecated-declarations}]} { + define-append EXTRA_CFLAGS -Wdeprecated-declarations + } + } + } else { + user-error "OpenSSL not found. Consider --with-openssl=none to disable HTTPS support" + } + } else { + if {[info exists ::zlib_lib]} { + define-append LIBS $::zlib_lib + } + } +}; # handle-with-openssl + +# +# CFLAGS_INCLUDE is ONLY for -I... flags and their order is +# significant so that --with-sqlite=PATH's header can shadow our +# own. <s>One caveat with this is that we cannot point +# --with-sqlite=PATH to the root of sqlite3's own build tree because +# that dir has a config.h which ends up shadowing src/config.h, +# breaking our build.</s> (That is no longer true: that that config.h +# was renamed to sqlite_cfg.h at some point.) +# +define CFLAGS_INCLUDE {} + +######################################################################## +# --with-sqlite=PATH checks for the first it finds of the following... +# - PATH/sqlite3.c and PATH/sqlite3.h +# - PATH/sqlite3.o (and assumes sqlite3.h is with it) +# - PATH/lib/libsqlite3* and PATH/include/sqlite3.h +proc handle-with-sqlite {} { + set sq3path [opt-val with-sqlite] + define SQLITE3_SRC.2 {} + define SQLITE3_OBJ.2 {} + define SQLITE3_SHELL_SRC.2 {$(SQLITE3_SHELL_SRC.0)} + if {$sq3path in {tree ""}} { + msg-result "Using sqlite3.c from this source tree." + } else { + # SQLITE3_ORIGIN: + # 0 = local source tree + # 1 = use external lib or sqlite3.o + # 2 = use external sqlite3.c and (if found) shell.c + define USE_SYSTEM_SQLITE 1 + define SQLITE3_ORIGIN 2 + if {$sq3path != "auto"} { + if {([file exists $sq3path/sqlite3.c]) && + ([file exists $sq3path/sqlite3.h]) } { + # Prefer sqlite3.[ch] if found. + define SQLITE3_SRC.2 $sq3path/sqlite3.c + define SQLITE3_OBJ.2 {$(SQLITE3_OBJ.0)} + define USE_SYSTEM_SQLITE 2 + define SQLITE3_ORIGIN 2 + if {[file exists $sq3path/shell.c]} { + define SQLITE3_SHELL_SRC.2 $sq3path/shell.c + } + define-append CFLAGS_INCLUDE -I$sq3path + define-append EXTRA_LDFLAGS -lpthread + # ^^^ additional -lXXX flags are conservative estimates + msg-result "Using sqlite3.c and sqlite3.h from $sq3path" + } elseif {[file exists $sq3path/sqlite3.o]} { + # Use sqlite3.o if found. + define SQLITE3_OBJ.2 $sq3path/sqlite3.o + define-append CFLAGS_INCLUDE -I$sq3path + define-append EXTRA_LDFLAGS $sq3path/sqlite3.o -lpthread + # ^^^ additional -lXXX flags are conservative estimates + msg-result "Using sqlite3.o from $sq3path" + } elseif { ([llength [glob -nocomplain -directory $sq3path/lib libsqlite3*]] != 0) \ + && ([file exists $sq3path/include/sqlite3.h]) } { + # e.g. --with-sqlite=/usr/local. Try $sq3path/lib/libsqlite3* + # and $sq3path/include/sqlite3.h + define-append CFLAGS_INCLUDE -I$sq3path/include + define-append EXTRA_LDFLAGS -L$sq3path/lib -lsqlite3 -lpthread + # ^^^ additional -lXXX flags are conservative estimates + msg-result "Using -lsqlite3 from $sq3path" + } else { + # Assume $sq3path holds both the lib and header + cc-with [list -cflags "-I$sq3path -L$sq3path"] + define-append CFLAGS_INCLUDE -I$sq3path + define-append EXTRA_LDFLAGS -L$sq3path -lsqlite3 -lpthread + # ^^^ additional -lXXX flags are conservative estimates + msg-result "Using -lsqlite3 from $sq3path" + } + } elseif {![cc-check-includes sqlite3.h] || ![check-function-in-lib sqlite3_open_v2 sqlite3]} { + user-error "libsqlite3 not found please install it or specify the location with --with-sqlite" + } + } +}; # handle-with-sqlite +handle-with-sqlite +define-append CFLAGS_INCLUDE {-I. -I$(SRCDIR) -I$(SRCDIR_extsrc)}; # must be after handle-with-sqlite + +# +# Handle the --with-tcl flag. +# +proc handle-with-tcl {} { + global v + set tclpath [opt-val with-tcl] + if {$tclpath eq ""} { + return + } + set tclprivatestubs [opt-bool with-tcl-private-stubs] + # Note parse-tclconfig-sh is in autosetup/local.tcl + if {$tclpath eq "1"} { + if {$v >= 9.0} { + set tcldir [file dirname $::autosetup(dir)]/compat/tcl-9.0 + } else { + set tcldir [file dirname $::autosetup(dir)]/compat/tcl-8.6 + } + if {$tclprivatestubs} { + set tclconfig(TCL_INCLUDE_SPEC) -I$tcldir/generic + set tclconfig(TCL_VERSION) {Private Stubs} + set tclconfig(TCL_PATCH_LEVEL) {} + set tclconfig(TCL_PREFIX) $tcldir + set tclconfig(TCL_LD_FLAGS) { } + } else { + # Use the system Tcl. Look in some likely places. + array set tclconfig [parse-tclconfig-sh \ + $tcldir/unix $tcldir/win \ + /usr /usr/local /usr/share /opt/local] + set msg "on your system" + } + } else { + array set tclconfig [parse-tclconfig-sh $tclpath] + set msg "at $tclpath" + } + if {[opt-bool static]} { + set tclconfig(TCL_LD_FLAGS) { } + } + if {![info exists tclconfig(TCL_INCLUDE_SPEC)]} { + user-error "Cannot find Tcl $msg" + } + set tclstubs [opt-bool with-tcl-stubs] + if {$tclprivatestubs} { + define FOSSIL_ENABLE_TCL_PRIVATE_STUBS + define USE_TCL_STUBS + } elseif {$tclstubs && $tclconfig(TCL_SUPPORTS_STUBS)} { + set libs "$tclconfig(TCL_STUB_LIB_SPEC)" + define FOSSIL_ENABLE_TCL_STUBS + define USE_TCL_STUBS + } else { + set libs "$tclconfig(TCL_LIB_SPEC) $tclconfig(TCL_LIBS)" + } + set cflags $tclconfig(TCL_INCLUDE_SPEC) + if {!$tclprivatestubs} { + set foundtcl 0; # Did we find a working Tcl library? + cc-with [list -cflags $cflags -libs $libs] { + if {$tclstubs} { + if {[cc-check-functions Tcl_InitStubs]} { + set foundtcl 1 + } + } else { + if {[cc-check-functions Tcl_CreateInterp]} { + set foundtcl 1 + } + } + } + if {!$foundtcl && [string match *-lieee* $libs]} { + # On some systems, using "-lieee" from TCL_LIB_SPEC appears + # to cause issues. + msg-result "Removing \"-lieee\" and retrying for Tcl..." + set libs [string map [list -lieee ""] $libs] + cc-with [list -cflags $cflags -libs $libs] { + if {$tclstubs} { + if {[cc-check-functions Tcl_InitStubs]} { + set foundtcl 1 + } + } else { + if {[cc-check-functions Tcl_CreateInterp]} { + set foundtcl 1 + } + } + } + } + if {!$foundtcl && ![string match *-lpthread* $libs]} { + # On some systems, TCL_LIB_SPEC appears to be missing + # "-lpthread". Try adding it. + msg-result "Adding \"-lpthread\" and retrying for Tcl..." + set libs "$libs -lpthread" + cc-with [list -cflags $cflags -libs $libs] { + if {$tclstubs} { + if {[cc-check-functions Tcl_InitStubs]} { + set foundtcl 1 + } + } else { + if {[cc-check-functions Tcl_CreateInterp]} { + set foundtcl 1 + } + } + } + } + if {!$foundtcl} { + if {$tclstubs} { + user-error "Cannot find a usable Tcl stubs library $msg" + } else { + user-error "Cannot find a usable Tcl library $msg" + } + } + } + set version $tclconfig(TCL_VERSION)$tclconfig(TCL_PATCH_LEVEL) + msg-result "Found Tcl $version at $tclconfig(TCL_PREFIX)" + if {!$tclprivatestubs} { + define-append LIBS $libs + } + define-append EXTRA_CFLAGS $cflags + define-append CFLAGS $cflags + if {[info exists ::zlibpath] && $::zlibpath eq "tree"} { + # + # NOTE: When using zlib in the source tree, prevent Tcl from + # pulling in the system one. + # + set tclconfig(TCL_LD_FLAGS) [string map [list -lz ""] \ + $tclconfig(TCL_LD_FLAGS)] + } + # + # NOTE: Remove "-ldl" from the TCL_LD_FLAGS because it will be + # be checked for near the bottom of this file. + # + set tclconfig(TCL_LD_FLAGS) [string map [list -ldl ""] \ + $tclconfig(TCL_LD_FLAGS)] + define-append EXTRA_LDFLAGS $tclconfig(TCL_LD_FLAGS) + define FOSSIL_ENABLE_TCL +}; # handle-with-tcl +handle-with-tcl + +# Network functions require libraries on some systems +cc-check-function-in-lib gethostbyname nsl +if {![cc-check-function-in-lib socket {socket network}]} { + # Last resort, may be Windows + if {[is_mingw]} { + define-append LIBS -lwsock32 + } +} + +# Some systems (ex: SunOS) require -lrt in order to use nanosleep +cc-check-function-in-lib nanosleep rt + +# The SMTP module requires special libraries and headers for MX DNS +# record lookups and such. +cc-check-includes arpa/nameser.h +cc-include-needs bind/resolv.h netinet/in.h +cc-check-includes bind/resolv.h +cc-check-includes resolv.h +if { !(([cc-check-function-in-lib dn_expand resolv] || + [cc-check-function-in-lib ns_name_uncompress {bind resolv}] || + [cc-check-function-in-lib __ns_name_uncompress {bind resolv}]) && + ([cc-check-function-in-lib ns_parserr {bind resolv}] || + [cc-check-function-in-lib __ns_parserr {bind resolv}]) && + ([cc-check-function-in-lib res_query {bind resolv}] || + [cc-check-function-in-lib __res_query {bind resolv}]))} { + msg-result "WARNING: SMTP feature will not be able to look up local MX." +} +cc-check-function-in-lib res_9_ns_initparse resolv + +# Other nonstandard function checks +cc-check-functions utime +cc-check-functions usleep +cc-check-functions strchrnul +cc-check-functions pledge +cc-check-functions backtrace + +# Termux on Android adds "getpass(char *)" to unistd.h, so check this so we +# guard against including it again; use cctest as cc-check-functions and +# cctest_function check for "getpass()" with no args and fail +if {[cctest -link 1 -includes {unistd.h} -code "getpass(0);"]} { + define FOSSIL_HAVE_GETPASS 1 + msg-result "Found getpass() with unistd.h" +} + +# Check for getloadavg(), and if it doesn't exist, define FOSSIL_OMIT_LOAD_AVERAGE +if {![cc-check-functions getloadavg] || + ![cctest -link 1 -includes {unistd.h} -code "double a\[3\]; getloadavg(a,3);"]} { + define FOSSIL_OMIT_LOAD_AVERAGE 1 + msg-result "Load average support unavailable" +} + +# Check for getpassphrase() for Solaris 10 where getpass() truncates to 10 chars +if {![cc-check-functions getpassphrase]} { + # Haiku needs this + cc-check-function-in-lib getpass bsd +} + +# Check for the FuseFS library +if {[opt-bool fusefs]} { + if {[opt-bool static]} { + msg-result "FuseFS support disabled due to -static" + } elseif {[cc-check-function-in-lib fuse_mount fuse]} { + define-append EXTRA_CFLAGS -DFOSSIL_HAVE_FUSEFS + define FOSSIL_HAVE_FUSEFS 1 + msg-result "FuseFS support enabled" + } +} + +######################################################################## +# Checks the compiler for compile_commands.json support. +# +# Returns 1 if supported, else 0. Defines MAKE_COMPILATION_DB to "yes" +# if supported, "no" if not. +proc check-compile-commands {} { + msg-checking "compile_commands.json support... " + if {[cctest -lang c -cflags {/dev/null -MJ} -source {}]} { + # This test reportedly incorrectly succeeds on one of + # Martin G.'s older systems. + msg-result "compiler supports compile_commands.json" + define MAKE_COMPILATION_DB yes + return 1 + } else { + msg-result "compiler does not support compile_commands.json" + define MAKE_COMPILATION_DB no + return 0 + } +} + +define MAKE_COMPILATION_DB no +if {!$outOfTreeBuild} { + if {[opt-bool compile-commands]} { + check-compile-commands + } else { + puts "Use --compile-commands to enable check for compile-commands-capable compiler." + } +} else { + puts "Disabling compile_commands.json check for out-of-tree build." + # This is an attempt to resolve the problem reported at + # https://fossil-scm.org/forum/forumpost/d19061d09a8179d0 +} + +# Add -fsanitize compile and link options late: we don't want the C +# checks above to run with those sanitizers enabled. It can not only +# be pointless, it can actually break correct tests. +set fsan [opt-val with-sanitizer] +if {[string length $fsan]} { + define-append EXTRA_CFLAGS -fsanitize=$fsan + define-append EXTRA_LDFLAGS -fsanitize=$fsan + if {[string first "undefined" $fsan] != -1} { + # We need to link with libubsan if we're compiling under + # GCC with -fsanitize=undefined. + cc-check-function-in-lib __ubsan_handle_add_overflow ubsan + } +} + +######################################################################## +# @proj-check-emsdk +# +# Emscripten is used for doing in-tree builds of web-based WASM stuff, +# as opposed to WASI-based WASM or WASM binaries we import from other +# places. This is only set up for Unix-style OSes and is untested +# anywhere but Linux. Requires that the --with-emsdk flag be +# registered with autosetup. +# +# It looks for the SDK in the location specified by --with-emsdk. +# Values of "" or "auto" mean to check for the environment var EMSDK +# (which gets set by the emsdk_env.sh script from the SDK) or that +# same var passed to configure. +# +# If the given directory is found, it expects to find emsdk_env.sh in +# that directory, as well as the emcc compiler somewhere under there. +# +# If the --with-emsdk flag is explicitly provided and the SDK is not +# found then a fatal error is generated, otherwise failure to find the +# SDK is not fatal. +# +# Defines the following: +# +# - EMSDK_HOME = top dir of the emsdk or "". +# - EMSDK_ENV_SH = path to EMSDK_HOME/emsdk_env.sh or "" +# - BIN_EMCC = $EMSDK_HOME/upstream/emscripten/emcc or "" +# - HAVE_EMSDK = 0 or 1 (this function's return value) +# +# Returns 1 if EMSDK_ENV_SH is found, else 0. If EMSDK_HOME is not empty +# but BIN_EMCC is then emcc was not found in the EMSDK_HOME, in which +# case we have to rely on the fact that sourcing $EMSDK_ENV_SH from a +# shell will add emcc to the $PATH. +proc proj-check-emsdk {} { + set emsdkHome [opt-val with-emsdk] + define EMSDK_HOME "" + define EMSDK_ENV_SH "" + define BIN_EMCC "" + set hadValue [llength $emsdkHome] + msg-checking "Emscripten SDK? " + if {$emsdkHome in {"" "auto"}} { + # Check the environment. $EMSDK gets set by sourcing emsdk_env.sh. + set emsdkHome [get-env EMSDK ""] + } + set rc 0 + if {$emsdkHome ne ""} { + define EMSDK_HOME $emsdkHome + set emsdkEnv "$emsdkHome/emsdk_env.sh" + if {[file exists $emsdkEnv]} { + msg-result "$emsdkHome" + define EMSDK_ENV_SH $emsdkEnv + set rc 1 + set emcc "$emsdkHome/upstream/emscripten/emcc" + if {[file exists $emcc]} { + define BIN_EMCC $emcc + } + } else { + msg-result "emsdk_env.sh not found in $emsdkHome" + } + } else { + msg-result "not found" + } + if {$hadValue && 0 == $rc} { + # Fail if it was explicitly requested but not found + proj-fatal "Cannot find the Emscripten SDK" + } + define HAVE_EMSDK $rc + return $rc +} + +if {!$outOfTreeBuild && [proj-check-emsdk]} { + # Maintenance note: the WASM-related pieces are only for in-tree + # maintenance, not out-of-tree builds. + define EMCC_WRAPPER $::dirSrc/tools/emcc.sh + define EMCC_OPT [get-env EMCC_OPT "-Oz"]; # optional flags to pass to emcc + make-template tools/emcc.sh.in + catch {exec chmod u+x [get-define EMCC_WRAPPER]} +} else { + define EMCC_WRAPPER "" + define EMCC_OPT "" +} + +handle-with-openssl + +# Finally, append libraries that must be last. This matters more on some +# OSes than others, but is most broadly required for static linking. +if {[opt-bool static]} { + # Linux can only infer the dependency on pthread from OpenSSL when + # doing dynamic linkage. + define-append LIBS -lpthread +} + +apply {{} { + # This started out as a workaround for getting the ordering of -ldl + # correct in conjunction with openssl in some environments. Then it + # evolved into a more generic preemptive portability workaround to + # ensure that certain libraries are always appended to the global + # LIBS list if they exist on the system. Based on a /chat discussion + # on 2025-02-27 in the context of check-in [8d3b9bf4d4]. + # + # Note that [move-lib-to-end] and [lib-actually-exists] are in + # autosetup/local.tcl. + set libs [get-define LIBS] + #puts "**** 1 LIBS: $libs" + foreach ll {-ldl -lpthread -lm} { + if {![move-lib-to-end $ll $libs libs]} { + # $ll was not in the list + if {[lib-actually-exists $ll]} { + # Add it to the list "just in case." This will be a no-op on + # systems where the lib is not actually used. + lappend libs $ll + } + } + } + #puts "**** 2 LIBS: $libs" + define LIBS [join $libs " "] +}} + +# Tag container builds with a prefix of the checkin ID of the version +# of Fossil each one contains. This not only allows multiple images +# to coexist and multiple containers to be created unamgiguosly from +# them, it also changes the URL we fetch the source tarball from, so +# repeated builds of a given version generate and fetch the source +# tarball once only, keeping it in the local Docker/Podman cache. +set ci [readfile "$::dirSrc/manifest.uuid"] +define FOSSIL_CI_PFX [string range $ci 0 11] + +make-template Makefile.in +make-config-header autoconfig.h -auto {USE_* FOSSIL_*} |
