diff options
| author | cashmere <cashmere@autistici.org> | 2026-09-04 09:05:24 +0200 |
|---|---|---|
| committer | cashmere <cashmere@autistici.org> | 2026-09-04 09:05:24 +0200 |
| commit | 4f49b16079b27d7ce633619e4cddfdf2bffbc952 (patch) | |
| tree | c296c1e7f3c3e2f6859c6d3a1b1b208779b89679 /tools/makemake.tcl | |
| download | relic-master.tar.gz | |
Diffstat (limited to 'tools/makemake.tcl')
| -rwxr-xr-x | tools/makemake.tcl | 2159 |
1 files changed, 2159 insertions, 0 deletions
diff --git a/tools/makemake.tcl b/tools/makemake.tcl new file mode 100755 index 0000000..d6f75af --- /dev/null +++ b/tools/makemake.tcl @@ -0,0 +1,2159 @@ +#!/usr/bin/tclsh +# +# ### Run this Tcl script EVERY time you modify it in any way! ### +# ### It must be run from the directory it lives in so that ### +# ### directories resolve properly! ### +# +# This Tcl script generates make files for various platforms. The makefiles +# then need to be committed. +# +# If you modify this file then: +# +# 1. cd tools; tclsh makemake.tcl +# +# 2. if errors are reported, fix them and go to step 1 +# +# 3. if "fossil diff" reports changes in any of the generated +# files, commit the changed files to the repo +# +# Files generated include: +# +# src/main.mk # makefile for all unix systems +# win/Makefile.mingw # makefile for mingw on windows +# win/Makefile.* # makefiles for other windows compilers +# +# Add new source files by listing the files (without their .c suffix) +# in the "src" variable. Add new resource files to the "extra_files" +# variable. There are other variables that you can alter, down to +# the "STOP HERE" comment. The stuff below "STOP HERE" should rarely need +# to change. After modification, go to step 1 above. +# +# Delete unused source files in the "src" variable, then go to step 1 above. +# +############################################################################# + +# $srcDir is used to set the target source dir in several places. Not +# all code-generation bits use $srcDir and instead hard-code, so +# replacing it only here (should it ever changes) is not sufficient. +# +set srcDir ../src +# Directory $srcDirExt houses single-file source code solutions which +# are imported directly into the fossil source tree. +set srcDirExt ../extsrc + +# Basenames of all source files that get preprocessed using +# "translate" and "makeheaders". To add new C-language source files to the +# project, simply add the basename to this list and rerun this script. +# +# Set the separate extra_files variable further down for how to add non-C +# files, such as string and BLOB resources. +# + +set src { + add + ajax + alerts + allrepo + attach + backlink + backoffice + bag + bisect + blob + branch + browse + builtin + bundle + cache + capabilities + captcha + cgi + chat + checkin + checkout + clearsign + clone + color + comformat + configure + content + cookies + db + delta + deltacmd + deltafunc + descendants + diff + diffcmd + dispatch + doc + encode + etag + event + extcgi + export + file + fileedit + finfo + foci + forum + fshell + fusefs + fuzz + glob + graph + gzip + hname + hook + http + http_socket + http_transport + import + info + interwiki + json + json_artifact + json_branch + json_config + json_diff + json_dir + json_finfo + json_login + json_query + json_report + json_status + json_tag + json_timeline + json_user + json_wiki + leaf + loadctrl + login + lookslike + main + manifest + markdown + markdown_html + match + md5 + merge + merge3 + moderate + name + org + patch + path + piechart + pikchrshow + pivot + popen + pqueue + printf + publish + purge + rebuild + regexp + repolist + report + robot + rss + schema + search + security_audit + setup + setupuser + sha1 + sha1hard + sha3 + shun + sitemap + skins + smtp + sqlcmd + stash + stat + statrep + style + sync + tag + tar + terminal + th_main + timeline + tkt + tktsetup + undo + unicode + unversioned + update + url + user + utf8 + util + verify + vfile + wiki + wikiformat + winfile + winhttp + xfer + xfersetup + xsystem + zip + http_ssl +} + +# Source files which live under $srcDirExt, but only those for which +# we need to run makeheaders. External sources which have their own +# header files must not be in this list. +set src_ext { + pikchr +} + +# Additional resource files that get built into the executable. +# These paths are all resolved from the src/ directory, so must +# be relative to that. +set extra_files { + diff.tcl + merge.tcl + markdown.md + wiki.wiki + *.js + default.css + style.*.css + ../skins/*/*.txt + sounds/*.wav + alerts/*.wav + ../extsrc/pikchr.wasm + ../extsrc/pikchr*.js +} + +# Options used to compile the included SQLite library. +# +set SQLITE_OPTIONS { + -DNDEBUG=1 + -DSQLITE_DQS=0 + -DSQLITE_THREADSAFE=0 + -DSQLITE_DEFAULT_MEMSTATUS=0 + -DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1 + -DSQLITE_LIKE_DOESNT_MATCH_BLOBS + -DSQLITE_OMIT_DECLTYPE + -DSQLITE_OMIT_DEPRECATED + -DSQLITE_OMIT_PROGRESS_CALLBACK + -DSQLITE_OMIT_SHARED_CACHE + -DSQLITE_OMIT_LOAD_EXTENSION + -DSQLITE_MAX_EXPR_DEPTH=0 + -DSQLITE_ENABLE_LOCKING_STYLE=0 + -DSQLITE_DEFAULT_FILE_FORMAT=4 + -DSQLITE_ENABLE_DBSTAT_VTAB + -DSQLITE_ENABLE_EXPLAIN_COMMENTS + -DSQLITE_ENABLE_FTS4 + -DSQLITE_ENABLE_FTS5 + -DSQLITE_ENABLE_MATH_FUNCTIONS + -DSQLITE_ENABLE_PERCENTILE + -DSQLITE_ENABLE_SETLK_TIMEOUT + -DSQLITE_ENABLE_STMTVTAB + -DSQLITE_HAVE_ZLIB + -DSQLITE_ENABLE_DBPAGE_VTAB + -DSQLITE_TRUSTED_SCHEMA=0 + -DHAVE_USLEEP +} +#lappend SQLITE_OPTIONS -DSQLITE_ENABLE_FTS3=1 +#lappend SQLITE_OPTIONS -DSQLITE_ENABLE_STAT4 +#lappend SQLITE_OPTIONS -DSQLITE_WIN32_NO_ANSI +#lappend SQLITE_OPTIONS -DSQLITE_WINNT_MAX_PATH_CHARS=4096 + +# Options used to compile the Pikchr library. +# +set PIKCHR_OPTIONS { + -DPIKCHR_TOKEN_LIMIT=10000 +} + +# Options used to compile the included SQLite shell. +# +set SHELL_OPTIONS [concat $SQLITE_OPTIONS { + -Dmain=sqlite3_shell + -DSQLITE_SHELL_IS_UTF8=1 + -DSQLITE_OMIT_LOAD_EXTENSION=1 + -DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) + -DSQLITE_SHELL_DBNAME_PROC=sqlcmd_get_dbname + -DSQLITE_SHELL_INIT_PROC=sqlcmd_init_proc + -DSQLITE_PS_APPDEF=sqlcmd_ps_appdef +}] + +# Options used to compile the included SQLite shell on Windows. +# +set SHELL_WIN32_OPTIONS $SHELL_OPTIONS +lappend SHELL_WIN32_OPTIONS -Daccess=file_access +lappend SHELL_WIN32_OPTIONS -Dsystem=fossil_system +lappend SHELL_WIN32_OPTIONS -Dgetenv=fossil_getenv +lappend SHELL_WIN32_OPTIONS -Dfopen=fossil_fopen + +# STOP HERE. +# Unless the build procedures changes, you should not have to edit anything +# below this line. +############################################################################# + +# Name of the final application +# +set name fossil + +# The "writeln" command sends output to the target makefile. +# +proc writeln {args} { + global output_file + if {[lindex $args 0]=="-nonewline"} { + puts -nonewline $output_file [lindex $args 1] + } else { + puts $output_file [lindex $args 0] + } +} + +# Expand any wildcards in "extra_files" +set new_extra_files {} +foreach file $extra_files { + # we need $file to resolve from $srcDir, but simply prepending + # $srcDir to each name breaks how the names are stringified and + # looked up from C. + set cwd [pwd] + cd $srcDir + foreach x [glob $file] { # -nocomplain flag? + lappend new_extra_files $x + } + cd $cwd +} +set extra_files $new_extra_files + +############################################################################## +############################################################################## +############################################################################## +# Start by generating the "main.mk" makefile used for all unix systems. +# +set mainMk $srcDir/main.mk +puts "building $mainMk" +set output_file [open $mainMk w] +fconfigure $output_file -translation binary + +writeln {# +############################################################################## +# WARNING: DO NOT EDIT, AUTOMATICALLY GENERATED FILE (SEE "tools/makemake.tcl") +############################################################################## +# +# This file is automatically generated. Instead of editing this +# file, edit "makemake.tcl" then run "tclsh makemake.tcl" +# to regenerate this file. +# +# This file is included by primary Makefile. +# + +XBCC = $(BCC) $(BCCFLAGS) +XTCC = $(TCC) $(CFLAGS_INCLUDE) -I$(OBJDIR) $(TCCFLAGS) + +TESTFLAGS = -quiet +} +writeln -nonewline "SRC =" +foreach s [lsort $src] { + writeln -nonewline " \\\n \$(SRCDIR)/$s.c" +} +writeln "\n" +writeln -nonewline "EXTRA_FILES =" +foreach s [lsort $extra_files] { + writeln -nonewline " \\\n \$(SRCDIR)/$s" +} +writeln "\n" +writeln -nonewline "TRANS_SRC =" +foreach s [lsort $src] { + writeln -nonewline " \\\n \$(OBJDIR)/${s}_.c" +} +writeln "\n" +writeln -nonewline "OBJ =" +foreach s [lsort $src] { + writeln -nonewline " \\\n \$(OBJDIR)/$s.o" +} + +writeln [string map [list \ + <<<SQLITE_OPTIONS>>> [join $SQLITE_OPTIONS " \\\n "] \ + <<<SHELL_OPTIONS>>> [join $SHELL_OPTIONS " \\\n "] \ + <<<PIKCHR_OPTIONS>>> [join $PIKCHR_OPTIONS " \\\n "] \ + <<<NEXT_LINE>>> \\] { +all: $(APPNAME) + +install: all + mkdir -p $(INSTALLDIR) + cp $(APPNAME) $(INSTALLDIR) + +codecheck: $(TRANS_SRC) $(OBJDIR)/codecheck1 + $(OBJDIR)/codecheck1 $(TRANS_SRC) + +$(OBJDIR)/translate: $(SRCDIR_tools)/translate.c + -mkdir -p $(OBJDIR) + $(XBCC) -o $(OBJDIR)/translate $(SRCDIR_tools)/translate.c + +$(OBJDIR)/makeheaders: $(SRCDIR_tools)/makeheaders.c + -mkdir -p $(OBJDIR) + $(XBCC) -o $(OBJDIR)/makeheaders $(SRCDIR_tools)/makeheaders.c + +$(OBJDIR)/mkindex: $(SRCDIR_tools)/mkindex.c + -mkdir -p $(OBJDIR) + $(XBCC) -o $(OBJDIR)/mkindex $(SRCDIR_tools)/mkindex.c + +$(OBJDIR)/mkbuiltin: $(SRCDIR_tools)/mkbuiltin.c + -mkdir -p $(OBJDIR) + $(XBCC) -o $(OBJDIR)/mkbuiltin $(SRCDIR_tools)/mkbuiltin.c + +$(OBJDIR)/mkversion: $(SRCDIR_tools)/mkversion.c + -mkdir -p $(OBJDIR) + $(XBCC) -o $(OBJDIR)/mkversion $(SRCDIR_tools)/mkversion.c + +$(OBJDIR)/codecheck1: $(SRCDIR_tools)/codecheck1.c + -mkdir -p $(OBJDIR) + $(XBCC) -o $(OBJDIR)/codecheck1 $(SRCDIR_tools)/codecheck1.c + +# Run the test suite. +# Other flags that can be included in TESTFLAGS are: +# +# -halt Stop testing after the first failed test +# -keep Keep the temporary workspace for debugging +# -prot Write a detailed log of the tests to the file ./prot +# -verbose Include even more details in the output +# -quiet Hide most output from the terminal +# -strict Treat known bugs as failures +# +# TESTFLAGS can also include names of specific test files to limit +# the run to just those test cases. +# +test: $(APPNAME) + $(TCLSH) $(SRCDIR)/../test/tester.tcl $(APPNAME) $(TESTFLAGS) + +$(OBJDIR)/VERSION.h: $(SRCDIR)/../manifest.uuid $(SRCDIR)/../manifest $(SRCDIR)/../VERSION $(OBJDIR)/mkversion $(OBJDIR)/phony.h + $(OBJDIR)/mkversion $(SRCDIR)/../manifest.uuid <<<NEXT_LINE>>> + $(SRCDIR)/../manifest <<<NEXT_LINE>>> + $(SRCDIR)/../VERSION >$(OBJDIR)/VERSION.h + +$(OBJDIR)/phony.h: + # Force rebuild of VERSION.h every time we run "make" + +# Setup the options used to compile the included SQLite library. +SQLITE_OPTIONS = <<<SQLITE_OPTIONS>>> + +# Setup the options used to compile the included SQLite shell. +SHELL_OPTIONS = <<<SHELL_OPTIONS>>> + +# Setup the options used to compile the included Pikchr formatter. +PIKCHR_OPTIONS = <<<PIKCHR_OPTIONS>>> + +# The USE_SYSTEM_SQLITE variable may be undefined, set to 0 or 1. +# If it is set to 1, then there is no need to build or link +# the sqlite3.o object. Instead, the system SQLite will be linked +# using -lsqlite3. +# +# Closely related is SQLITE3_ORIGIN, with the same numeric mapping plus +# a value of 2 means that we are building a client-provided sqlite3.c. +SQLITE3_OBJ.0 = $(OBJDIR)/sqlite3.o +SQLITE3_OBJ.1 = $(OBJDIR)/sqlite3-see.o +# SQLITE3_OBJ.2 is set by the configure process +SQLITE3_OBJ. = $(SQLITE3_OBJ.0) +SQLITE3_OBJ = $(SQLITE3_OBJ.$(SQLITE3_ORIGIN)) + +# The USE_LINENOISE variable may be undefined, set to 0, or set +# to 1. If it is set to 0, then there is no need to build or link +# the linenoise.o object. +LINENOISE_DEF.0 = +LINENOISE_DEF.1 = -DHAVE_LINENOISE=2 +LINENOISE_DEF. = $(LINENOISE_DEF.0) +LINENOISE_OBJ.0 = +LINENOISE_OBJ.1 = $(OBJDIR)/linenoise.o +LINENOISE_OBJ. = $(LINENOISE_OBJ.0) + +# The USE_SEE variable may be undefined, 0 or 1. If undefined or 0, +# in-tree SQLite is used. If 1, then sqlite3-see.c (not part of the +# source tree) is used and extra flags are provided to enable the +# SQLite Encryption Extension. +SQLITE3_SRC.0 = $(SRCDIR_extsrc)/sqlite3.c +SQLITE3_SRC.1 = $(SRCDIR_extsrc)/sqlite3-see.c +# SQLITE3_SRC.2 is set by top-level configure/makefile process. +SQLITE3_SRC. = $(SRCDIR_extsrc)/sqlite3.c +SQLITE3_SRC = $(SQLITE3_SRC.$(SQLITE3_ORIGIN)) +SQLITE3_SHELL_SRC.0 = $(SRCDIR_extsrc)/shell.c +SQLITE3_SHELL_SRC.1 = $(SRCDIR_extsrc)/shell-see.c +# SQLITE3_SHELL_SRC.2 comes from the configure process +SQLITE3_SHELL_SRC. = $(SRCDIR_extsrc)/shell.c +SQLITE3_SHELL_SRC = $(SQLITE3_SHELL_SRC.$(SQLITE3_ORIGIN)) +SEE_FLAGS.0 = +SEE_FLAGS.1 = -DSQLITE_HAS_CODEC -DSQLITE_SHELL_DBKEY_PROC=fossil_key +SEE_FLAGS. = +SEE_FLAGS = $(SEE_FLAGS.$(USE_SEE)) +}] + +writeln [string map [list <<<NEXT_LINE>>> \\] { +EXTRAOBJ = <<<NEXT_LINE>>> + $(SQLITE3_OBJ.$(SQLITE3_ORIGIN)) <<<NEXT_LINE>>> + $(LINENOISE_OBJ.$(USE_LINENOISE)) <<<NEXT_LINE>>> + $(OBJDIR)/pikchr.o <<<NEXT_LINE>>> + $(OBJDIR)/shell.o <<<NEXT_LINE>>> + $(OBJDIR)/th.o <<<NEXT_LINE>>> + $(OBJDIR)/th_lang.o <<<NEXT_LINE>>> + $(OBJDIR)/th_tcl.o <<<NEXT_LINE>>> + $(OBJDIR)/cson_amalgamation.o +}] + +writeln { +$(APPNAME): $(OBJDIR)/headers $(OBJDIR)/codecheck1 $(EXTRAOBJ) $(OBJ) + $(OBJDIR)/codecheck1 $(TRANS_SRC) + $(TCC) $(TCCFLAGS) -o $(APPNAME) $(EXTRAOBJ) $(OBJ) $(LIB) + +# This rule prevents make from using its default rules to try build +# an executable named "manifest" out of the file named "manifest.c" +# +$(SRCDIR)/../manifest: + # noop + +clean: + -rm -rf $(OBJDIR)/* $(APPNAME) + +} + +set mhargs {} +foreach s [lsort $src] { + append mhargs "\$(OBJDIR)/${s}_.c:\$(OBJDIR)/$s.h <<<NEXT_LINE>>>" + set extra_h($s) { } +} +foreach s [lsort $src_ext] { + append mhargs "\$(SRCDIR_extsrc)/${s}.c:\$(OBJDIR)/$s.h <<<NEXT_LINE>>>" + set extra_h($s) { } +} +append mhargs "\$(SRCDIR_extsrc)/sqlite3.h <<<NEXT_LINE>>>" +append mhargs "\$(SRCDIR)/th.h <<<NEXT_LINE>>>" +#append mhargs "\$(SRCDIR_extsrc)/cson_amalgamation.h <<<NEXT_LINE>>>" +append mhargs "\$(OBJDIR)/VERSION.h " +set mhargs [string map [list <<<NEXT_LINE>>> \\\n\t] $mhargs] +writeln "\$(OBJDIR)/page_index.h: \$(TRANS_SRC) \$(OBJDIR)/mkindex" +writeln "\t\$(OBJDIR)/mkindex \$(TRANS_SRC) >\$@\n" + +writeln "\$(OBJDIR)/builtin_data.h: \$(OBJDIR)/mkbuiltin \$(EXTRA_FILES)" +writeln "\t\$(OBJDIR)/mkbuiltin --prefix \$(SRCDIR)/ \$(EXTRA_FILES) >\$@\n" + +writeln "\$(OBJDIR)/headers:\t\$(OBJDIR)/page_index.h \$(OBJDIR)/builtin_data.h \$(OBJDIR)/makeheaders \$(OBJDIR)/VERSION.h" +writeln "\t\$(OBJDIR)/makeheaders $mhargs" +writeln "\ttouch \$(OBJDIR)/headers" +writeln "\$(OBJDIR)/headers: Makefile" +writeln "\$(OBJDIR)/json.o \$(OBJDIR)/json_artifact.o \$(OBJDIR)/json_branch.o \$(OBJDIR)/json_config.o \$(OBJDIR)/json_diff.o \$(OBJDIR)/json_dir.o \$(OBJDIR)/json_finfo.o \$(OBJDIR)/json_login.o \$(OBJDIR)/json_query.o \$(OBJDIR)/json_report.o \$(OBJDIR)/json_status.o \$(OBJDIR)/json_tag.o \$(OBJDIR)/json_timeline.o \$(OBJDIR)/json_user.o \$(OBJDIR)/json_wiki.o : \$(SRCDIR)/json_detail.h" + +writeln "Makefile:" +set extra_h(dispatch) " \$(OBJDIR)/page_index.h " +set extra_h(builtin) " \$(OBJDIR)/builtin_data.h " + +foreach s [lsort $src] { + writeln "\$(OBJDIR)/${s}_.c:\t\$(SRCDIR)/$s.c \$(OBJDIR)/translate" + writeln "\t\$(OBJDIR)/translate \$(SRCDIR)/$s.c >\$@\n" + writeln "\$(OBJDIR)/$s.o:\t\$(OBJDIR)/${s}_.c \$(OBJDIR)/$s.h$extra_h($s)\$(SRCDIR)/config.h" + writeln "\t\$(XTCC) -o \$(OBJDIR)/$s.o -c \$(OBJDIR)/${s}_.c\n" + writeln "\$(OBJDIR)/$s.h:\t\$(OBJDIR)/headers\n" +} + +writeln "\$(SQLITE3_OBJ):\t\$(SQLITE3_SRC)" +writeln "\t-mkdir -p \$(OBJDIR)" +writeln "\t\$(XTCC) \$(SQLITE_OPTIONS) \$(SQLITE_CFLAGS) \$(SEE_FLAGS) \\" +writeln "\t\t-c \$(SQLITE3_SRC) -o \$@" + +writeln "\$(OBJDIR)/shell.o:\t\$(SQLITE3_SHELL_SRC) \$(SRCDIR_extsrc)/sqlite3.h" +writeln "\t-mkdir -p \$(OBJDIR)" +writeln "\t\$(XTCC) \$(SHELL_OPTIONS) \$(SHELL_CFLAGS) \$(SEE_FLAGS) \$(LINENOISE_DEF.\$(USE_LINENOISE)) -c \$(SQLITE3_SHELL_SRC) -o \$@\n" + +writeln "\$(OBJDIR)/linenoise.o:\t\$(SRCDIR_extsrc)/linenoise.c \$(SRCDIR_extsrc)/linenoise.h" +writeln "\t-mkdir -p \$(OBJDIR)" +writeln "\t\$(XTCC) -c \$(SRCDIR_extsrc)/linenoise.c -o \$@\n" + +writeln "\$(OBJDIR)/th.o:\t\$(SRCDIR)/th.c" +writeln "\t-mkdir -p \$(OBJDIR)\n" +writeln "\t\$(XTCC) -c \$(SRCDIR)/th.c -o \$@\n" + +writeln "\$(OBJDIR)/th_lang.o:\t\$(SRCDIR)/th_lang.c" +writeln "\t-mkdir -p \$(OBJDIR)\n" +writeln "\t\$(XTCC) -c \$(SRCDIR)/th_lang.c -o \$@\n" + +writeln "\$(OBJDIR)/th_tcl.o:\t\$(SRCDIR)/th_tcl.c" +writeln "\t-mkdir -p \$(OBJDIR)\n" +writeln "\t\$(XTCC) -c \$(SRCDIR)/th_tcl.c -o \$@\n" + +writeln [string map [list <<<NEXT_LINE>>> \\] { +$(OBJDIR)/pikchr.o: $(SRCDIR_extsrc)/pikchr.c $(OBJDIR)/mkversion + $(XTCC) $(PIKCHR_OPTIONS) -c $(SRCDIR_extsrc)/pikchr.c -o $@ + +$(OBJDIR)/cson_amalgamation.o: $(SRCDIR_extsrc)/cson_amalgamation.c $(OBJDIR)/mkversion + $(XTCC) -c $(SRCDIR_extsrc)/cson_amalgamation.c -o $@ + +$(SRCDIR_extsrc)/pikchr.js: $(SRCDIR_extsrc)/pikchr.c $(MAKEFILE_LIST) + $(EMCC_WRAPPER) -o $@ $(EMCC_OPT) --no-entry <<<NEXT_LINE>>> + -sEXPORTED_RUNTIME_METHODS=cwrap,ccall,setValue,getValue,stackSave,stackAlloc,stackRestore <<<NEXT_LINE>>> + -sEXPORTED_FUNCTIONS=_pikchr,_pikchr_version $(SRCDIR_extsrc)/pikchr.c <<<NEXT_LINE>>> + -sENVIRONMENT=web <<<NEXT_LINE>>> + -sMODULARIZE <<<NEXT_LINE>>> + -sEXPORT_NAME=initPikchrModule <<<NEXT_LINE>>> + --minify 0 + $(TCLSH) $(TOPDIR)/tools/randomize-js-names.tcl $(SRCDIR_extsrc) + @chmod -x $(SRCDIR_extsrc)/pikchr.wasm +wasm: $(SRCDIR_extsrc)/pikchr.js + +# +# compile_commands.json support... +# +# We have to avoid applying compile_commands support to the in-tree +# tools, as those compile with BCC, which may differ from TCC. +# e.g. BCC might be gcc (which does not support -MJ ...) while TCC is +# clang (which does). +# +# What follows is more verbose than strictly necessary because we're +# limited to POSIX make syntax. +all: +compile-commands-dir.yes = $(OBJDIR) +compile-commands-dir.no = +compile-commands-dir = $(compile-commands-dir.$(MAKE_COMPILATION_DB)) +compile-command-args.yes = -MJ $(TOPDIR)/$(compile-commands-dir)/$(@F:.o=.o.json) +compile-command-args.no = +TCCFLAGS += $(compile-command-args.$(MAKE_COMPILATION_DB)) +compile_commands.json = $(TOPDIR)/compile_commands.json +# compile_commands.json is a concatenation of the .o.json files +# generated by the compilation process via TCCFLAGS. We have a +# potential race condition in parallel builds, where a .o.json file is +# not yet written to completion before compile_commands.json is +# processed. How to resolve that in a way compatible with POSIX make +# is unclear. +# +# This obscure sed bit ensures that the resulting JSON array does not +# have a trailing comma. +$(compile_commands.json): $(OBJ) + @-rm -f $@ + @{ echo '['; cat $(compile-commands-dir)/*.o.json | tr '\n' ' ' | sed -e 's/, $$//'; echo ']'; } > $@ + @echo "Generated $@" +compile-commands.no: +compile-commands.yes: $(compile_commands.json) +all: compile-commands.$(MAKE_COMPILATION_DB) +clean: compile-commands-clean +compile-commands-clean: + rm -fr $(compile_commands.json) + +# +# End compile_commands.json support +# + +# +# The list of all the targets that do not correspond to real files. This stops +# 'make' from getting confused when someone makes an error in a rule. +# + +.PHONY: all install test clean +.PHONY: compile-commands-clean compile-commands-dir +}] + +close $output_file +# +# End of the main.mk output +############################################################################## +############################################################################## +############################################################################## +# Begin win/Makefile.mingw output +# +puts "building ../win/Makefile.mingw" +set output_file [open ../win/Makefile.mingw w] +fconfigure $output_file -translation binary + +writeln {#!/usr/bin/make +# +############################################################################## +# WARNING: DO NOT EDIT, AUTOMATICALLY GENERATED FILE (SEE "tools/makemake.tcl") +############################################################################## +# +# This file is automatically generated. Instead of editing this +# file, edit "makemake.tcl" then run "tclsh makemake.tcl" +# to regenerate this file. +# +# This is a makefile for use on Cygwin/Darwin/FreeBSD/Linux/Windows using +# MinGW or MinGW-w64. +# +# Some of the special options which can be passed to make +# USE_WINDOWS=1 if building under a windows command prompt +# X64=1 if using an unprefixed 64-bit mingw compiler +# + +#### Select one of MinGW, MinGW-w64 (32-bit) or MinGW-w64 (64-bit) compilers. +# By default, this is an empty string (i.e. use the native compiler). +# +PREFIX = +# PREFIX = mingw32- +# PREFIX = i686-pc-mingw32- +# PREFIX = i686-w64-mingw32- +# PREFIX = x86_64-w64-mingw32- + +#### The toplevel directory of the source tree. Fossil can be built +# in a directory that is separate from the source tree. Just change +# the following to point from the build directory to the src/ folder. +# +SRCDIR = src +SRCDIR_extsrc = extsrc +SRCDIR_tools = tools + +#### The directory into which object code files should be written. +# +OBJDIR = wbld + +#### C compiler for use in building executables that will run on +# the platform that is doing the build. This is used to compile +# code-generator programs as part of the build process. See TCC +# and TCCEXE below for the C compiler for building the finished +# binary. +# +BCCEXE = gcc + +#### C Compiler and options for use in building executables that +# will run on the platform that is doing the build. This is used +# to compile code-generator programs as part of the build process. +# See TCC below for the C compiler for building the finished binary. +# +BCC = $(BCCEXE) + +#### Enable compiling with debug symbols (much larger binary) +# +# FOSSIL_ENABLE_SYMBOLS = 1 + +#### Enable JSON (https://www.json.org) support using "cson" +# +# FOSSIL_ENABLE_JSON = 1 + +#### Enable HTTPS support via OpenSSL (links to libssl and libcrypto) +# +# FOSSIL_ENABLE_SSL = 1 + +#### Automatically build OpenSSL when building Fossil (causes rebuild +# issues when building incrementally). +# +# FOSSIL_BUILD_SSL = 1 + +#### Enable relative paths in external diff/gdiff +# +# FOSSIL_ENABLE_EXEC_REL_PATHS = 1 + +#### Enable TH1 scripts in embedded documentation files +# +# FOSSIL_ENABLE_TH1_DOCS = 1 + +#### Enable hooks for commands and web pages via TH1 +# +# FOSSIL_ENABLE_TH1_HOOKS = 1 + +#### Enable scripting support via Tcl/Tk +# +# FOSSIL_ENABLE_TCL = 1 + +#### Load Tcl using the stubs library mechanism +# +# FOSSIL_ENABLE_TCL_STUBS = 1 + +#### Load Tcl using the private stubs mechanism +# +# FOSSIL_ENABLE_TCL_PRIVATE_STUBS = 1 + +#### Use 'system' SQLite +# +# USE_SYSTEM_SQLITE = 1 + +#### Use POSIX memory APIs from "sys/mman.h" +# +# USE_MMAN_H = 1 + +#### Use the SQLite Encryption Extension +# +# USE_SEE = 1 + +#### Use the Tcl source directory instead of the install directory? +# This is useful when Tcl has been compiled statically with MinGW. +# +FOSSIL_TCL_SOURCE = 1 + +#### Check if the workaround for the MinGW command line handling needs to +# be enabled by default. This check may be somewhat fragile due to the +# use of "findstring". +# +ifndef MINGW_IS_32BIT_ONLY +ifeq (,$(findstring w64-mingw32,$(PREFIX))) +MINGW_IS_32BIT_ONLY = 1 +endif +endif + +#### The directories where the zlib include and library files are located. +# +ZINCDIR = $(SRCDIR)/../compat/zlib +ZLIBDIR = $(SRCDIR)/../compat/zlib + +#### Make an attempt to detect if Fossil is being built for the x64 processor +# architecture. This check may be somewhat fragile due to "findstring". +# +ifndef X64 +ifneq (,$(findstring x86_64-w64-mingw32,$(PREFIX))) +X64 = 1 +endif +endif + +#### Determine if the optimized assembly routines provided with zlib should be +# used, taking into account whether zlib is actually enabled and the target +# processor architecture. +# +ifndef X64 +SSLCONFIG = mingw +ZLIBCONFIG = +ZLIBTARGETS = +else +SSLCONFIG = mingw64 +ZLIBCONFIG = +ZLIBTARGETS = +endif + +#### Disable creation of the OpenSSL shared libraries. Also, disable support +# for SSLv3 (i.e. thereby forcing the use of TLS). +# +SSLCONFIG += no-ssl3 no-weak-ssl-ciphers no-shared + +#### When using zlib, make sure that OpenSSL is configured to use the zlib +# that Fossil knows about (i.e. the one within the source tree). +# +SSLCONFIG += --with-zlib-lib=$(PWD)/$(ZLIBDIR) --with-zlib-include=$(PWD)/$(ZLIBDIR) zlib + +#### The directories where the OpenSSL include and library files are located. +# +OPENSSLDIR = $(SRCDIR)/../compat/openssl +OPENSSLINCDIR = $(OPENSSLDIR)/include +OPENSSLLIBDIR = $(OPENSSLDIR) + +#### Either the directory where the Tcl library is installed or the Tcl +# source code directory resides (depending on the value of the macro +# FOSSIL_TCL_SOURCE). If this points to the Tcl install directory, +# this directory must have "include" and "lib" sub-directories. If +# this points to the Tcl source code directory, this directory must +# have "generic" and "win" sub-directories. The recommended usage +# here is to use the Sysinternals junction tool to create a hard +# link between a "tcl-8.x" sub-directory of the Fossil source code +# directory and the target Tcl directory. This removes the need to +# hard-code the necessary paths in this Makefile. +# +TCLDIR = $(SRCDIR)/../compat/tcl-8.6 + +#### The Tcl source code directory. This defaults to the same value as +# TCLDIR macro (above), which may not be correct. This value will +# only be used if the FOSSIL_TCL_SOURCE macro is defined. +# +TCLSRCDIR = $(TCLDIR) + +#### The Tcl include and library directories. These values will only be +# used if the FOSSIL_TCL_SOURCE macro is not defined. +# +TCLINCDIR = $(TCLDIR)/include +TCLLIBDIR = $(TCLDIR)/lib + +#### Tcl: Which Tcl library do we want to use (8.4, 8.5, 8.6, etc)? +# +ifdef FOSSIL_ENABLE_TCL_STUBS +ifndef FOSSIL_ENABLE_TCL_PRIVATE_STUBS +LIBTCL = -ltclstub86 +endif +TCLTARGET = libtclstub86.a +else +LIBTCL = -ltcl86 +TCLTARGET = binaries +endif + +#### C compiler for use in building executables that will run on the +# target platform. This is usually the same as BCCEXE, unless you +# are cross-compiling. This C compiler builds the finished binary +# for fossil. See BCC and BCCEXE above for the C compiler for +# building intermediate code-generator tools. +# +TCCEXE = gcc + +#### C compiler and options for use in building executables that will +# run on the target platform. This is usually the almost the same +# as BCC, unless you are cross-compiling. This C compiler builds +# the finished binary for fossil. The BCC compiler above is used +# for building intermediate code-generator tools. +# +TCC = $(PREFIX)$(TCCEXE) -Wall -Wdeclaration-after-statement +TCC += -I$(SRCDIR_extsrc) + +#### Add the necessary command line options to build with debugging +# symbols, if enabled. +# +ifdef FOSSIL_ENABLE_SYMBOLS +TCC += -g +else +TCC += -Os +endif + +TCC += -L$(ZLIBDIR) -I$(ZINCDIR) + +#### Compile resources for use in building executables that will run +# on the target platform. +# +RCC = $(PREFIX)windres -I$(SRCDIR) -I$(ZINCDIR) +RCC += -I$(SRCDIR_extsrc) + +# With HTTPS support +ifdef FOSSIL_ENABLE_SSL +TCC += -L$(OPENSSLLIBDIR) -I$(OPENSSLINCDIR) +RCC += -I$(OPENSSLINCDIR) +endif + +# With Tcl support +ifdef FOSSIL_ENABLE_TCL +ifdef FOSSIL_TCL_SOURCE +TCC += -L$(TCLSRCDIR)/win -I$(TCLSRCDIR)/generic -I$(TCLSRCDIR)/win +RCC += -I$(TCLSRCDIR)/generic -I$(TCLSRCDIR)/win +else +TCC += -L$(TCLLIBDIR) -I$(TCLINCDIR) +RCC += -I$(TCLINCDIR) +endif +endif + +# With MinGW command line handling workaround +ifdef MINGW_IS_32BIT_ONLY +TCC += -DBROKEN_MINGW_CMDLINE=1 +RCC += -DBROKEN_MINGW_CMDLINE=1 +endif + +# With HTTPS support +ifdef FOSSIL_ENABLE_SSL +TCC += -DFOSSIL_ENABLE_SSL=1 +RCC += -DFOSSIL_ENABLE_SSL=1 +endif + +# With relative paths in external diff/gdiff +ifdef FOSSIL_ENABLE_EXEC_REL_PATHS +TCC += -DFOSSIL_ENABLE_EXEC_REL_PATHS=1 +RCC += -DFOSSIL_ENABLE_EXEC_REL_PATHS=1 +endif + +# With TH1 embedded docs support +ifdef FOSSIL_ENABLE_TH1_DOCS +TCC += -DFOSSIL_ENABLE_TH1_DOCS=1 +RCC += -DFOSSIL_ENABLE_TH1_DOCS=1 +endif + +# With TH1 hook support +ifdef FOSSIL_ENABLE_TH1_HOOKS +TCC += -DFOSSIL_ENABLE_TH1_HOOKS=1 +RCC += -DFOSSIL_ENABLE_TH1_HOOKS=1 +endif + +# With Tcl support +ifdef FOSSIL_ENABLE_TCL +TCC += -DFOSSIL_ENABLE_TCL=1 +RCC += -DFOSSIL_ENABLE_TCL=1 +# Either statically linked or via stubs +ifdef FOSSIL_ENABLE_TCL_STUBS +TCC += -DFOSSIL_ENABLE_TCL_STUBS=1 -DUSE_TCL_STUBS +RCC += -DFOSSIL_ENABLE_TCL_STUBS=1 -DUSE_TCL_STUBS +ifdef FOSSIL_ENABLE_TCL_PRIVATE_STUBS +TCC += -DFOSSIL_ENABLE_TCL_PRIVATE_STUBS=1 +RCC += -DFOSSIL_ENABLE_TCL_PRIVATE_STUBS=1 +endif +else +TCC += -DSTATIC_BUILD +RCC += -DSTATIC_BUILD +endif +endif + +# With JSON support +ifdef FOSSIL_ENABLE_JSON +TCC += -DFOSSIL_ENABLE_JSON=1 +RCC += -DFOSSIL_ENABLE_JSON=1 +endif + +# With "sys/mman.h" support +ifdef USE_MMAN_H +TCC += -DUSE_MMAN_H=1 +RCC += -DUSE_MMAN_H=1 +endif + +# With SQLite Encryption Extension support +ifdef USE_SEE +TCC += -DUSE_SEE=1 +RCC += -DUSE_SEE=1 +endif + +#### The option -static has no effect on MinGW(-w64), only dynamic +# executables can be built when linking with MSVCRT. OpenSSL +# (optional) and zlib (required) however are always linked in +# statically. Therefore, the FOSSIL_DYNAMIC_BUILD option does +# not really apply to MinGW (i.e. since ALL external libraries +# are NOT linked dynamically). +# +# LIB = -static + +#### MinGW: If available, use the Unicode capable runtime startup code. +# +ifndef MINGW_IS_32BIT_ONLY +LIB += -municode +endif + +#### SQLite: If enabled, use the system SQLite library. +# +ifdef USE_SYSTEM_SQLITE +LIB += -lsqlite3 +endif + +#### OpenSSL: Add the necessary libraries required, if enabled. +# +ifdef FOSSIL_ENABLE_SSL +LIB += -lssl -lcrypto -lgdi32 -lcrypt32 +endif + +#### Tcl: Add the necessary libraries required, if enabled. +# +ifdef FOSSIL_ENABLE_TCL +LIB += $(LIBTCL) +endif + +#### Extra arguments for linking the finished binary. Fossil needs +# to link against the Z-Lib compression library. There are no +# other mandatory dependencies. +# +LIB += -lmingwex + +#### zlib is required. +# +LIB += -lz + +#### These libraries MUST appear in the same order as they do for Tcl +# or linking with it will not work (exact reason unknown). +# +ifdef FOSSIL_ENABLE_TCL +ifdef FOSSIL_ENABLE_TCL_STUBS +LIB += -lkernel32 -lws2_32 +else +LIB += -lnetapi32 -lkernel32 -luser32 -ladvapi32 -lws2_32 +endif +else +LIB += -lkernel32 -lws2_32 +endif + +#### Library required for DNS lookups. +# +LIB += -ldnsapi + +#### Tcl shell for use in running the fossil test suite. This is only +# used for testing. +# +TCLSH = tclsh + +#### Nullsoft installer MakeNSIS location +# +MAKENSIS = "$(PROGRAMFILES)\NSIS\MakeNSIS.exe" + +#### Inno Setup executable location +# +INNOSETUP = "$(PROGRAMFILES)\Inno Setup 5\ISCC.exe" + +#### Include a configuration file that can override any one of these settings. +# +-include config.w32 + +# STOP HERE +# You should not need to change anything below this line +#-------------------------------------------------------- +XBCC = $(BCC) $(CFLAGS) +XTCC = $(TCC) $(CFLAGS) -I. -I$(SRCDIR) +} +writeln -nonewline "SRC =" +foreach s [lsort $src] { + writeln -nonewline " \\\n \$(SRCDIR)/$s.c" +} +writeln "\n" +writeln -nonewline "EXTRA_FILES =" +foreach s [lsort $extra_files] { + writeln -nonewline " \\\n \$(SRCDIR)/$s" +} +writeln "\n" +writeln -nonewline "TRANS_SRC =" +foreach s [lsort $src] { + writeln -nonewline " \\\n \$(OBJDIR)/${s}_.c" +} +writeln "\n" +writeln -nonewline "OBJ =" +foreach s [lsort $src] { + writeln -nonewline " \\\n \$(OBJDIR)/$s.o" +} +writeln "\n" +writeln "APPNAME = ${name}.exe" +writeln "APPTARGETS =" +writeln { +#### If the USE_WINDOWS variable exists, it is assumed that we are building +# inside of a Windows-style shell; otherwise, it is assumed that we are +# building inside of a Unix-style shell. Note that the "move" command is +# broken when attempting to use it from the Windows shell via MinGW make +# because the SHELL variable is only used for certain commands that are +# recognized internally by make. +# +ifdef USE_WINDOWS +TRANSLATE = $(subst /,\,$(OBJDIR)/translate.exe) +MAKEHEADERS = $(subst /,\,$(OBJDIR)/makeheaders.exe) +MKINDEX = $(subst /,\,$(OBJDIR)/mkindex.exe) +MKBUILTIN = $(subst /,\,$(OBJDIR)/mkbuiltin.exe) +MKVERSION = $(subst /,\,$(OBJDIR)/mkversion.exe) +CODECHECK1 = $(subst /,\,$(OBJDIR)/codecheck1.exe) +CAT = type +CP = copy +GREP = find +MV = copy +RM = del /Q +MKDIR = -mkdir +RMDIR = rmdir /S /Q +else +TRANSLATE = $(OBJDIR)/translate.exe +MAKEHEADERS = $(OBJDIR)/makeheaders.exe +MKINDEX = $(OBJDIR)/mkindex.exe +MKBUILTIN = $(OBJDIR)/mkbuiltin.exe +MKVERSION = $(OBJDIR)/mkversion.exe +CODECHECK1 = $(OBJDIR)/codecheck1.exe +CAT = cat +CP = cp +GREP = grep +MV = mv +RM = rm -f +MKDIR = -mkdir -p +RMDIR = rm -rf +endif} + +writeln { +all: $(OBJDIR) $(APPNAME) + +$(OBJDIR)/fossil.o: $(SRCDIR)/../win/fossil.rc $(OBJDIR)/VERSION.h +ifdef USE_WINDOWS + $(CP) $(subst /,\,$(SRCDIR)\..\win\fossil.rc) $(subst /,\,$(OBJDIR)) + $(CP) $(subst /,\,$(SRCDIR)\..\win\fossil.ico) $(subst /,\,$(OBJDIR)) + $(CP) $(subst /,\,$(SRCDIR)\..\win\fossil.exe.manifest) $(subst /,\,$(OBJDIR)) +else + $(CP) $(SRCDIR)/../win/fossil.rc $(OBJDIR) + $(CP) $(SRCDIR)/../win/fossil.ico $(OBJDIR) + $(CP) $(SRCDIR)/../win/fossil.exe.manifest $(OBJDIR) +endif + $(RCC) $(OBJDIR)/fossil.rc -o $(OBJDIR)/fossil.o + +install: $(OBJDIR) $(APPNAME) +ifdef USE_WINDOWS + $(MKDIR) $(subst /,\,$(INSTALLDIR)) + $(CP) $(subst /,\,$(APPNAME)) $(subst /,\,$(INSTALLDIR)) +else + $(MKDIR) $(INSTALLDIR) + $(CP) $(APPNAME) $(INSTALLDIR) +endif + +$(OBJDIR): +ifdef USE_WINDOWS + $(MKDIR) $(subst /,\,$(OBJDIR)) +else + $(MKDIR) $(OBJDIR) +endif + +$(TRANSLATE): $(SRCDIR_tools)/translate.c + $(XBCC) -o $@ $(SRCDIR_tools)/translate.c + +$(MAKEHEADERS): $(SRCDIR_tools)/makeheaders.c + $(XBCC) -o $@ $(SRCDIR_tools)/makeheaders.c + +$(MKINDEX): $(SRCDIR_tools)/mkindex.c + $(XBCC) -o $@ $(SRCDIR_tools)/mkindex.c + +$(MKBUILTIN): $(SRCDIR_tools)/mkbuiltin.c + $(XBCC) -o $@ $(SRCDIR_tools)/mkbuiltin.c + +$(MKVERSION): $(SRCDIR_tools)/mkversion.c + $(XBCC) -o $@ $(SRCDIR_tools)/mkversion.c + +$(CODECHECK1): $(SRCDIR_tools)/codecheck1.c + $(XBCC) -o $@ $(SRCDIR_tools)/codecheck1.c + +# WARNING. DANGER. Running the test suite modifies the repository the +# build is done from, i.e. the checkout belongs to. Do not sync/push +# the repository after running the tests. +test: $(OBJDIR) $(APPNAME) + $(TCLSH) $(SRCDIR)/../test/tester.tcl $(APPNAME) + +$(OBJDIR)/VERSION.h: $(SRCDIR)/../manifest.uuid $(SRCDIR)/../manifest $(MKVERSION) $(OBJDIR)/phony.h + $(MKVERSION) $(SRCDIR)/../manifest.uuid $(SRCDIR)/../manifest $(SRCDIR)/../VERSION >$@ + +$(OBJDIR)/phony.h: + # Force rebuild of VERSION.h every time "make" is run + +# The USE_SYSTEM_SQLITE variable may be undefined, set to 0 or 1. +# If it is set to 1, then there is no need to build or link +# the sqlite3.o object. Instead, the system SQLite will be linked +# using -lsqlite3. +# +# Closely related is SQLITE3_ORIGIN, with the same 0/1 mapping, +# plus a value of 2 means that we are building a client-provided +# sqlite3.c. +SQLITE3_OBJ.0 = $(OBJDIR)/sqlite3.o +SQLITE3_OBJ.1 = $(OBJDIR)/sqlite3-see.o +# SQLITE3_OBJ.2 is set by the configure process +SQLITE3_OBJ. = $(SQLITE3_OBJ.0) +SQLITE3_OBJ = $(SQLITE3_OBJ.$(SQLITE3_ORIGIN)) + +# The USE_SEE variable may be undefined, 0 or 1. If undefined or 0, +# in-tree SQLite is used. If 1, then sqlite3-see.c (not part of the +# source tree) is used and extra flags are provided to enable the +# SQLite Encryption Extension. +SQLITE3_SRC.0 = $(SRCDIR_extsrc)/sqlite3.c +SQLITE3_SRC.1 = $(SRCDIR_extsrc)/sqlite3-see.c +# SQLITE3_SRC.2 is set by top-level configure/makefile process. +SQLITE3_SRC. = $(SRCDIR_extsrc)/sqlite3.c +SQLITE3_SRC = $(SQLITE3_SRC.$(SQLITE3_ORIGIN)) +SQLITE3_SHELL_SRC.0 = $(SRCDIR_extsrc)/shell.c +SQLITE3_SHELL_SRC.1 = $(SRCDIR_extsrc)/shell-see.c +# SQLITE3_SHELL_SRC.2 comes from the configure process +SQLITE3_SHELL_SRC. = $(SRCDIR_extsrc)/shell.c +SQLITE3_SHELL_SRC = $(SQLITE3_SHELL_SRC.$(SQLITE3_ORIGIN)) +SEE_FLAGS.0 = +SEE_FLAGS.1 = -DSQLITE_HAS_CODEC -DSQLITE_SHELL_DBKEY_PROC=fossil_key +SEE_FLAGS. = +SEE_FLAGS = $(SEE_FLAGS.$(USE_SEE)) +} + +writeln [string map [list <<<NEXT_LINE>>> \\] { +EXTRAOBJ = <<<NEXT_LINE>>> + $(SQLITE3_OBJ.$(SQLITE3_ORIGIN)) <<<NEXT_LINE>>> + $(OBJDIR)/pikchr.o <<<NEXT_LINE>>> + $(OBJDIR)/shell.o <<<NEXT_LINE>>> + $(OBJDIR)/th.o <<<NEXT_LINE>>> + $(OBJDIR)/th_lang.o <<<NEXT_LINE>>> + $(OBJDIR)/th_tcl.o <<<NEXT_LINE>>> + $(OBJDIR)/cson_amalgamation.o +}] + +writeln { +zlib: $(ZLIBTARGETS) + $(MAKE) -C $(ZLIBDIR) PREFIX=$(PREFIX) CC=$(PREFIX)$(TCCEXE) $(ZLIBCONFIG) -f win32/Makefile.gcc libz.a + +clean-zlib: + $(MAKE) -C $(ZLIBDIR) PREFIX=$(PREFIX) CC=$(PREFIX)$(TCCEXE) -f win32/Makefile.gcc clean + +BLDTARGETS = zlib + +openssl: $(BLDTARGETS) + cd $(OPENSSLLIBDIR);./Configure --cross-compile-prefix=$(PREFIX) $(SSLCONFIG) + sed -i -e 's/^PERL=C:\\.*$$/PERL=perl.exe/i' $(OPENSSLLIBDIR)/Makefile + $(MAKE) -C $(OPENSSLLIBDIR) PREFIX=$(PREFIX) CC=$(PREFIX)$(TCCEXE) build_libs + +clean-openssl: + $(MAKE) -C $(OPENSSLLIBDIR) PREFIX=$(PREFIX) CC=$(PREFIX)$(TCCEXE) clean + +tcl: + cd $(TCLSRCDIR)/win;./configure + $(MAKE) -C $(TCLSRCDIR)/win PREFIX=$(PREFIX) CC=$(PREFIX)$(TCCEXE) $(TCLTARGET) + +clean-tcl: + $(MAKE) -C $(TCLSRCDIR)/win PREFIX=$(PREFIX) CC=$(PREFIX)$(TCCEXE) distclean + +APPTARGETS += $(BLDTARGETS) + +ifdef FOSSIL_BUILD_SSL +APPTARGETS += openssl +endif + +$(APPNAME): $(APPTARGETS) $(OBJDIR)/headers $(CODECHECK1) $(EXTRAOBJ) $(OBJ) $(OBJDIR)/fossil.o + $(CODECHECK1) $(TRANS_SRC) + $(TCC) -o $@ $(EXTRAOBJ) $(OBJ) $(OBJDIR)/fossil.o $(LIB) + +# This rule prevents make from using its default rules to try build +# an executable named "manifest" out of the file named "manifest.c" +# +$(SRCDIR)/../manifest: + # noop + +clean: +ifdef USE_WINDOWS + $(RM) $(subst /,\,$(APPNAME)) + $(RMDIR) $(subst /,\,$(OBJDIR)) +else + $(RM) $(APPNAME) + $(RMDIR) $(OBJDIR) +endif + +setup: $(OBJDIR) $(APPNAME) + $(MAKENSIS) ./setup/fossil.nsi + +innosetup: $(OBJDIR) $(APPNAME) + $(INNOSETUP) ./setup/fossil.iss -DAppVersion=$(shell $(CAT) ./VERSION) +} + +set mhargs {} +foreach s [lsort $src] { + if {[string length $mhargs] > 0} {append mhargs " <<<NEXT_LINE>>>"} + append mhargs "\$(OBJDIR)/${s}_.c:\$(OBJDIR)/$s.h" + set extra_h($s) { } +} +foreach s [lsort $src_ext] { + if {[string length $mhargs] > 0} {append mhargs " <<<NEXT_LINE>>>"} + append mhargs "\$(SRCDIR_extsrc)/${s}.c:\$(OBJDIR)/$s.h" + set extra_h($s) { } +} +append mhargs " <<<NEXT_LINE>>>\$(SRCDIR_extsrc)/sqlite3.h" +append mhargs " <<<NEXT_LINE>>>\$(SRCDIR)/th.h" +append mhargs " <<<NEXT_LINE>>>\$(OBJDIR)/VERSION.h" +set mhargs [string map [list <<<NEXT_LINE>>> \\\n\t] $mhargs] +writeln "\$(OBJDIR)/page_index.h: \$(TRANS_SRC) \$(MKINDEX)" +writeln "\t\$(MKINDEX) \$(TRANS_SRC) >\$@\n" + +writeln "\$(OBJDIR)/builtin_data.h:\t\$(MKBUILTIN) \$(EXTRA_FILES)" +writeln "\t\$(MKBUILTIN) --prefix \$(SRCDIR)/ \$(EXTRA_FILES) >\$@\n" + +writeln "\$(OBJDIR)/headers:\t\$(OBJDIR)/page_index.h \$(OBJDIR)/builtin_data.h \$(MAKEHEADERS) \$(OBJDIR)/VERSION.h" +writeln "\t\$(MAKEHEADERS) $mhargs" +writeln "\techo Done >\$(OBJDIR)/headers\n" +writeln "\$(OBJDIR)/headers: Makefile\n" +writeln "Makefile:\n" +set extra_h(main) " \$(OBJDIR)/page_index.h " +set extra_h(builtin) " \$(OBJDIR)/builtin_data.h " + +foreach s [lsort $src] { + writeln "\$(OBJDIR)/${s}_.c:\t\$(SRCDIR)/$s.c \$(TRANSLATE)" + writeln "\t\$(TRANSLATE) \$(SRCDIR)/$s.c >\$@\n" + writeln "\$(OBJDIR)/$s.o:\t\$(OBJDIR)/${s}_.c \$(OBJDIR)/$s.h$extra_h($s)\$(SRCDIR)/config.h" + writeln "\t\$(XTCC) -o \$(OBJDIR)/$s.o -c \$(OBJDIR)/${s}_.c\n" + writeln "\$(OBJDIR)/${s}.h:\t\$(OBJDIR)/headers\n" +} + +writeln {MINGW_OPTIONS = -D_HAVE__MINGW_H +} + +set SQLITE_WIN32_OPTIONS $SQLITE_OPTIONS +lappend SQLITE_WIN32_OPTIONS -DSQLITE_WIN32_NO_ANSI + +set MINGW_SQLITE_OPTIONS $SQLITE_WIN32_OPTIONS +lappend MINGW_SQLITE_OPTIONS {$(MINGW_OPTIONS)} +lappend MINGW_SQLITE_OPTIONS -DSQLITE_USE_MALLOC_H +lappend MINGW_SQLITE_OPTIONS -DSQLITE_USE_MSIZE + +set MINGW_PIKCHR_OPTIONS $PIKCHR_OPTIONS + +set j " \\\n " +writeln "SQLITE_OPTIONS = [join $MINGW_SQLITE_OPTIONS $j]\n" +writeln "SHELL_OPTIONS = [join $SHELL_WIN32_OPTIONS $j]\n" +writeln "PIKCHR_OPTIONS = [join $MINGW_PIKCHR_OPTIONS $j]\n" + +writeln "\$(SQLITE3_OBJ):\t\$(SQLITE3_SRC) \$(SRCDIR)/../win/Makefile.mingw" +writeln "\t\$(XTCC) \$(SQLITE_OPTIONS) \$(SQLITE_CFLAGS) \$(SEE_FLAGS) \\" +writeln "\t\t-c \$(SQLITE3_SRC) -o \$@\n" + +writeln "\$(OBJDIR)/cson_amalgamation.o:\t\$(SRCDIR_extsrc)/cson_amalgamation.c" +writeln "\t\$(XTCC) -c \$(SRCDIR_extsrc)/cson_amalgamation.c -o \$@\n" +writeln "\$(OBJDIR)/json.o \$(OBJDIR)/json_artifact.o \$(OBJDIR)/json_branch.o \$(OBJDIR)/json_config.o \$(OBJDIR)/json_diff.o \$(OBJDIR)/json_dir.o \$(OBJDIR)/jsos_finfo.o \$(OBJDIR)/json_login.o \$(OBJDIR)/json_query.o \$(OBJDIR)/json_report.o \$(OBJDIR)/json_status.o \$(OBJDIR)/json_tag.o \$(OBJDIR)/json_timeline.o \$(OBJDIR)/json_user.o \$(OBJDIR)/json_wiki.o : \$(SRCDIR)/json_detail.h\n" + +writeln "\$(OBJDIR)/shell.o:\t\$(SQLITE3_SHELL_SRC) \$(SRCDIR_extsrc)/sqlite3.h \$(SRCDIR)/../win/Makefile.mingw" +writeln "\t\$(XTCC) \$(SHELL_OPTIONS) \$(SHELL_CFLAGS) \$(SEE_FLAGS) -c \$(SQLITE3_SHELL_SRC) -o \$@\n" + +writeln "\$(OBJDIR)/th.o:\t\$(SRCDIR)/th.c" +writeln "\t\$(XTCC) -c \$(SRCDIR)/th.c -o \$@\n" + +writeln "\$(OBJDIR)/th_lang.o:\t\$(SRCDIR)/th_lang.c" +writeln "\t\$(XTCC) -c \$(SRCDIR)/th_lang.c -o \$@\n" + +writeln "\$(OBJDIR)/th_tcl.o:\t\$(SRCDIR)/th_tcl.c" +writeln "\t\$(XTCC) -c \$(SRCDIR)/th_tcl.c -o \$@\n" + +writeln "\$(OBJDIR)/pikchr.o:\t\$(SRCDIR_extsrc)/pikchr.c" +writeln "\t\$(XTCC) \$(PIKCHR_OPTIONS) -c \$(SRCDIR_extsrc)/pikchr.c -o \$@\n" + +close $output_file +# +# End of the win/Makefile.mingw output +############################################################################## +############################################################################## +############################################################################## +# Begin win/Makefile.dmc output +# +puts "building ../win/Makefile.dmc" +set output_file [open ../win/Makefile.dmc w] +fconfigure $output_file -translation binary + +writeln {# +############################################################################## +# WARNING: DO NOT EDIT, AUTOMATICALLY GENERATED FILE (SEE "tools/makemake.tcl") +############################################################################## +# +# This file is automatically generated. Instead of editing this +# file, edit "makemake.tcl" then run "tclsh makemake.tcl" +# to regenerate this file. +# +B = .. +SRCDIR = $B\src +SRCDIR_extsrc = $B\extsrc +SRCDIR_tools = $B\tools +OBJDIR = . +O = .obj +E = .exe + + +# Maybe DMDIR, SSL or INCL needs adjustment +DMDIR = c:\DM +INCL = -I. -I$(SRCDIR) -I$(SRCDIR_extsrc) -I$B\win\include -I$(DMDIR)\extra\include + +#SSL = -DFOSSIL_ENABLE_SSL=1 +SSL = + +CFLAGS = -o +BCC = $(DMDIR)\bin\dmc $(CFLAGS) +TCC = $(DMDIR)\bin\dmc $(CFLAGS) $(DMCDEF) $(SSL) $(INCL) +LIBS = $(DMDIR)\extra\lib\ zlib wsock32 advapi32 dnsapi +} +writeln "SQLITE_OPTIONS = [join $SQLITE_OPTIONS { }]\n" +writeln "SHELL_OPTIONS = [join $SHELL_WIN32_OPTIONS { }]\n" +writeln "PIKCHR_OPTIONS = [join $PIKCHR_OPTIONS { }]\n" +writeln -nonewline "SRC =" +foreach s [lsort $src] { + writeln -nonewline " ${s}_.c" +} +writeln "\n" +writeln -nonewline "OBJ = " +foreach s [lsort $src] { + writeln -nonewline "\$(OBJDIR)\\$s\$O " +} +writeln "\$(OBJDIR)\\shell\$O \$(OBJDIR)\\sqlite3\$O \$(OBJDIR)\\th\$O \$(OBJDIR)\\th_lang\$O" +writeln { + +RC=$(DMDIR)\bin\rcc +RCFLAGS=-32 -w1 -I$(SRCDIR) /D__DMC__ + +APPNAME = $(OBJDIR)\fossil$(E) + +all: $(APPNAME) + +$(APPNAME) : translate$E mkindex$E codecheck1$E headers $(OBJ) $(OBJDIR)\link + cd $(OBJDIR) + codecheck1$E $(SRC) + $(DMDIR)\bin\link @link + +$(OBJDIR)\fossil.res: $B\win\fossil.rc + $(RC) $(RCFLAGS) -o$@ $** + +$(OBJDIR)\link: $B\win\Makefile.dmc $(OBJDIR)\fossil.res} +writeln -nonewline "\t+echo " +foreach s [lsort $src] { + writeln -nonewline "$s " +} +writeln "shell sqlite3 th th_lang > \$@" +writeln "\t+echo fossil >> \$@" +writeln "\t+echo fossil >> \$@" +writeln "\t+echo \$(LIBS) >> \$@" +writeln "\t+echo. >> \$@" +writeln "\t+echo fossil >> \$@" + +writeln { +translate$E: $(SRCDIR_tools)\translate.c + $(BCC) -o$@ $** + +makeheaders$E: $(SRCDIR_tools)\makeheaders.c + $(BCC) -o$@ $** + +mkindex$E: $(SRCDIR_tools)\mkindex.c + $(BCC) -o$@ $** + +mkbuiltin$E: $(SRCDIR_tools)\mkbuiltin.c + $(BCC) -o$@ $** + +mkversion$E: $(SRCDIR_tools)\mkversion.c + $(BCC) -o$@ $** + +codecheck1$E: $(SRCDIR_tools)\codecheck1.c + $(BCC) -o$@ $** + +$(OBJDIR)\shell$O : $(SRCDIR_extsrc)\shell.c + $(TCC) -o$@ -c $(SHELL_OPTIONS) $(SQLITE_OPTIONS) $(SHELL_CFLAGS) $** + +$(OBJDIR)\sqlite3$O : $(SRCDIR_extsrc)\sqlite3.c + $(TCC) -o$@ -c $(SQLITE_OPTIONS) $(SQLITE_CFLAGS) $** + +$(OBJDIR)\th$O : $(SRCDIR)\th.c + $(TCC) -o$@ -c $** + +$(OBJDIR)\th_lang$O : $(SRCDIR)\th_lang.c + $(TCC) -o$@ -c $** + +$(OBJDIR)\cson_amalgamation.h : $(SRCDIR_extsrc)\cson_amalgamation.h + cp $@ $@ + +VERSION.h : mkversion$E $B\manifest.uuid $B\manifest $B\VERSION + +$** > $@ + +page_index.h: mkindex$E $(SRC) + +$** > $@ + +builtin_data.h: mkbuiltin$E $(EXTRA_FILES) + mkbuiltin$E --prefix $(SRCDIR)/ $(EXTRA_FILES) > $@ + +clean: + -del $(OBJDIR)\*.obj + -del *.obj *_.c *.h *.map + +realclean: + -del $(APPNAME) translate$E mkindex$E makeheaders$E mkversion$E codecheck1$E mkbuiltin$E + +$(OBJDIR)\json$O : $(SRCDIR)\json_detail.h +$(OBJDIR)\json_artifact$O : $(SRCDIR)\json_detail.h +$(OBJDIR)\json_branch$O : $(SRCDIR)\json_detail.h +$(OBJDIR)\json_config$O : $(SRCDIR)\json_detail.h +$(OBJDIR)\json_diff$O : $(SRCDIR)\json_detail.h +$(OBJDIR)\json_dir$O : $(SRCDIR)\json_detail.h +$(OBJDIR)\json_finfo$O : $(SRCDIR)\json_detail.h +$(OBJDIR)\json_login$O : $(SRCDIR)\json_detail.h +$(OBJDIR)\json_query$O : $(SRCDIR)\json_detail.h +$(OBJDIR)\json_report$O : $(SRCDIR)\json_detail.h +$(OBJDIR)\json_status$O : $(SRCDIR)\json_detail.h +$(OBJDIR)\json_tag$O : $(SRCDIR)\json_detail.h +$(OBJDIR)\json_timeline$O : $(SRCDIR)\json_detail.h +$(OBJDIR)\json_user$O : $(SRCDIR)\json_detail.h +$(OBJDIR)\json_wiki$O : $(SRCDIR)\json_detail.h + +} +foreach s [lsort $src] { + writeln "\$(OBJDIR)\\$s\$O : ${s}_.c ${s}.h" + writeln "\t\$(TCC) -o\$@ -c ${s}_.c\n" + writeln "${s}_.c : \$(SRCDIR)\\$s.c" + writeln "\t+translate\$E \$** > \$@\n" +} + +writeln -nonewline "headers: makeheaders\$E page_index.h builtin_data.h VERSION.h\n\t +makeheaders\$E " +foreach s [lsort $src] { + writeln -nonewline "${s}_.c:$s.h " +} +foreach s [lsort $src_ext] { + writeln -nonewline "\$(SRCDIR_extsrc)\\${s}.c:$s.h " +} +writeln "\$(SRCDIR_extsrc)\\sqlite3.h \$(SRCDIR)\\th.h VERSION.h \$(SRCDIR_extsrc)\\cson_amalgamation.h" +writeln "\t@copy /Y nul: headers" + +close $output_file +# +# End of the win/Makefile.dmc output +############################################################################## +############################################################################## +############################################################################## +# Begin win/Makefile.msc output +# +puts "building ../win/Makefile.msc" +set output_file [open ../win/Makefile.msc w] +fconfigure $output_file -translation binary + +writeln {# +############################################################################## +# WARNING: DO NOT EDIT, AUTOMATICALLY GENERATED FILE (SEE "tools/makemake.tcl") +############################################################################## +# +# +# This file is automatically generated. Instead of editing this +# file, edit "makemake.tcl" then run "tclsh makemake.tcl" +# to regenerate this file. +# +B = .. +SRCDIR = $(B)\src +SRCDIR_extsrc = $(B)\extsrc +SRCDIR_tools = $(B)\tools +T = . +OBJDIR = $(T) +OX = $(OBJDIR) +O = .obj +E = .exe +P = .pdb +DBGOPTS = /Od + +INSTALLDIR = . +!ifdef DESTDIR +INSTALLDIR = $(DESTDIR)\$(INSTALLDIR) +!endif + +# When building out of source, this Makefile needs to know the path to the base +# top-level directory for this project. Pass it on NMAKE command line via make +# variable B: +# NMAKE /f "path\to\this\Makefile" B="path/to/fossil/root" +# +# NOTE: Make sure B path has no trailing backslash, UNIX-style path is OK too. +# +!if !exist("$(B)\.fossil-settings") +!error Please specify path to project base directory: B="path/to/fossil" +!endif + +# Perl is only necessary if OpenSSL support is enabled and it is built from +# source code. The PERLDIR environment variable, if it exists, should point +# to the directory containing the main Perl executable specified here (i.e. +# "perl.exe"). +PERL = perl.exe + +# Enable use of available compiler optimizations? +!ifndef OPTIMIZATIONS +OPTIMIZATIONS = 2 +!endif + +# Enable debugging symbols? +!ifndef DEBUG +DEBUG = 0 +!endif +!ifdef FOSSIL_DEBUG +DEBUG = 1 +!endif + +# Build the OpenSSL libraries? +!ifndef FOSSIL_BUILD_SSL +FOSSIL_BUILD_SSL = 0 +!endif + +# Build the included zlib library? +!ifndef FOSSIL_BUILD_ZLIB +FOSSIL_BUILD_ZLIB = 1 +!endif + +# Link everything except SQLite dynamically? +!ifndef FOSSIL_DYNAMIC_BUILD +FOSSIL_DYNAMIC_BUILD = 0 +!endif + +# Enable relative paths in external diff/gdiff? +!ifndef FOSSIL_ENABLE_EXEC_REL_PATHS +FOSSIL_ENABLE_EXEC_REL_PATHS = 0 +!endif + +# Enable the JSON API? +!ifndef FOSSIL_ENABLE_JSON +FOSSIL_ENABLE_JSON = 0 +!endif + +# Enable OpenSSL support? +!ifndef FOSSIL_ENABLE_SSL +FOSSIL_ENABLE_SSL = 0 +!endif + +# Enable the Tcl integration subsystem? +!ifndef FOSSIL_ENABLE_TCL +FOSSIL_ENABLE_TCL = 0 +!endif + +# Enable TH1 scripts in embedded documentation files? +!ifndef FOSSIL_ENABLE_TH1_DOCS +FOSSIL_ENABLE_TH1_DOCS = 0 +!endif + +# Enable TH1 hooks for commands and web pages? +!ifndef FOSSIL_ENABLE_TH1_HOOKS +FOSSIL_ENABLE_TH1_HOOKS = 0 +!endif + +# Enable support for Windows XP with Visual Studio 201x? +!ifndef FOSSIL_ENABLE_WINXP +FOSSIL_ENABLE_WINXP = 0 +!endif + +# Enable support for the SQLite Encryption Extension? +!ifndef USE_SEE +USE_SEE = 0 +!endif + +!if $(FOSSIL_ENABLE_SSL)!=0 +SSLDIR = $(B)\compat\openssl +SSLINCDIR = $(SSLDIR)\include +!if $(FOSSIL_DYNAMIC_BUILD)!=0 +SSLLIBDIR = $(SSLDIR) +!else +SSLLIBDIR = $(SSLDIR) +!endif +SSLLIB = libssl.lib libcrypto.lib user32.lib gdi32.lib crypt32.lib +!if "$(PLATFORM)"=="amd64" || "$(PLATFORM)"=="x64" +!message Using 'x64' platform for OpenSSL... +SSLCONFIG = VC-WIN64A no-asm no-ssl3 no-weak-ssl-ciphers +!if $(FOSSIL_DYNAMIC_BUILD)!=0 +SSLCONFIG = $(SSLCONFIG) shared +!else +SSLCONFIG = $(SSLCONFIG) no-shared +!endif +!elseif "$(PLATFORM)"=="ia64" +!message Using 'ia64' platform for OpenSSL... +SSLCONFIG = VC-WIN64I no-asm no-ssl3 no-weak-ssl-ciphers +!if $(FOSSIL_DYNAMIC_BUILD)!=0 +SSLCONFIG = $(SSLCONFIG) shared +!else +SSLCONFIG = $(SSLCONFIG) no-shared +!endif +!else +!message Assuming 'x86' platform for OpenSSL... +SSLCONFIG = VC-WIN32 no-asm no-ssl3 no-weak-ssl-ciphers +!if $(FOSSIL_DYNAMIC_BUILD)!=0 +SSLCONFIG = $(SSLCONFIG) shared +!else +SSLCONFIG = $(SSLCONFIG) no-shared +!endif +!endif +!endif + +!if $(FOSSIL_ENABLE_TCL)!=0 +TCLDIR = $(B)\compat\tcl-8.6 +TCLSRCDIR = $(TCLDIR) +TCLINCDIR = $(TCLSRCDIR)\generic +!endif + +# zlib options +ZINCDIR = $(B)\compat\zlib +ZLIBDIR = $(B)\compat\zlib + +!if $(FOSSIL_DYNAMIC_BUILD)!=0 +ZLIB = zdll.lib +!else +ZLIB = zlib.lib +!endif + +INCL = /I. /I"$(OX)" /I"$(SRCDIR)" /I"$(SRCDIR_extsrc)" /I"$(B)\win\include" + +INCL = $(INCL) /I"$(ZINCDIR)" + +!if $(FOSSIL_ENABLE_SSL)!=0 +INCL = $(INCL) /I"$(SSLINCDIR)" +!endif + +!if $(FOSSIL_ENABLE_TCL)!=0 +INCL = $(INCL) /I"$(TCLINCDIR)" +!endif + +CFLAGS = /nologo /W2 /WX /utf-8 +LDFLAGS = + +CFLAGS = $(CFLAGS) /D_CRT_SECURE_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS +CFLAGS = $(CFLAGS) /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_NONSTDC_NO_WARNINGS + +!if $(FOSSIL_DYNAMIC_BUILD)!=0 +LDFLAGS = $(LDFLAGS) /MANIFEST +!else +LDFLAGS = $(LDFLAGS) /NODEFAULTLIB:msvcrt /MANIFEST:NO +!endif + +!if $(FOSSIL_ENABLE_WINXP)!=0 +XPCFLAGS = $(XPCFLAGS) /D_WIN32_WINNT=0x0501 /D_USING_V110_SDK71_=1 +CFLAGS = $(CFLAGS) $(XPCFLAGS) +# +# NOTE: For regular builds, /OSVERSION defaults to the /SUBSYSTEM version and +# explicit initialization is redundant, but is required for post-built edits. +# +!if "$(PLATFORM)"=="amd64" || "$(PLATFORM)"=="x64" +XPLDFLAGS = $(XPLDFLAGS) /OSVERSION:5.02 /SUBSYSTEM:CONSOLE,5.02 +!else +XPLDFLAGS = $(XPLDFLAGS) /OSVERSION:5.01 /SUBSYSTEM:CONSOLE,5.01 +!endif +LDFLAGS = $(LDFLAGS) $(XPLDFLAGS) +# +# NOTE: Only XPCFLAGS is forwarded to the OpenSSL configuration, and XPLDFLAGS +# is applied in a separate post-build step, see below for more information. +# +!if $(FOSSIL_ENABLE_SSL)!=0 +SSLCONFIG = $(SSLCONFIG) $(XPCFLAGS) +!endif +!endif + +!if $(FOSSIL_DYNAMIC_BUILD)!=0 +!if $(DEBUG)!=0 +CRTFLAGS = /MDd +!else +CRTFLAGS = /MD +!endif +!else +!if $(DEBUG)!=0 +CRTFLAGS = /MTd +!else +CRTFLAGS = /MT +!endif +!endif + +!if $(OPTIMIZATIONS)>3 +RELOPTS = /Os +!elseif $(OPTIMIZATIONS)>2 +RELOPTS = /Ox +!elseif $(OPTIMIZATIONS)>1 +RELOPTS = /O2 +!elseif $(OPTIMIZATIONS)>0 +RELOPTS = /O1 +!else +RELOPTS = +!endif + +!if $(DEBUG)!=0 +CFLAGS = $(CFLAGS) /Zi $(CRTFLAGS) $(DBGOPTS) /DFOSSIL_DEBUG /DTH_MEMDEBUG +LDFLAGS = $(LDFLAGS) /DEBUG +!else +CFLAGS = $(CFLAGS) $(CRTFLAGS) $(RELOPTS) +!endif + +BCC = $(CC) $(CFLAGS) +TCC = $(CC) /c $(CFLAGS) $(MSCDEF) $(INCL) +RCC = $(RC) /D_WIN32 /D_MSC_VER $(MSCDEF) $(INCL) +MTC = mt +LIBS = ws2_32.lib advapi32.lib dnsapi.lib +LIBDIR = + +!if $(FOSSIL_DYNAMIC_BUILD)!=0 +TCC = $(TCC) /DFOSSIL_DYNAMIC_BUILD=1 +RCC = $(RCC) /DFOSSIL_DYNAMIC_BUILD=1 +!endif + +LIBS = $(LIBS) $(ZLIB) +LIBDIR = $(LIBDIR) /LIBPATH:"$(ZLIBDIR)" + +!if $(FOSSIL_ENABLE_JSON)!=0 +TCC = $(TCC) /DFOSSIL_ENABLE_JSON=1 +RCC = $(RCC) /DFOSSIL_ENABLE_JSON=1 +!endif + +!if $(FOSSIL_ENABLE_SSL)!=0 +TCC = $(TCC) /DFOSSIL_ENABLE_SSL=1 +RCC = $(RCC) /DFOSSIL_ENABLE_SSL=1 +LIBS = $(LIBS) $(SSLLIB) +LIBDIR = $(LIBDIR) /LIBPATH:"$(SSLLIBDIR)" +!endif + +!if $(FOSSIL_ENABLE_EXEC_REL_PATHS)!=0 +TCC = $(TCC) /DFOSSIL_ENABLE_EXEC_REL_PATHS=1 +RCC = $(RCC) /DFOSSIL_ENABLE_EXEC_REL_PATHS=1 +!endif + +!if $(FOSSIL_ENABLE_TH1_DOCS)!=0 +TCC = $(TCC) /DFOSSIL_ENABLE_TH1_DOCS=1 +RCC = $(RCC) /DFOSSIL_ENABLE_TH1_DOCS=1 +!endif + +!if $(FOSSIL_ENABLE_TH1_HOOKS)!=0 +TCC = $(TCC) /DFOSSIL_ENABLE_TH1_HOOKS=1 +RCC = $(RCC) /DFOSSIL_ENABLE_TH1_HOOKS=1 +!endif + +!if $(FOSSIL_ENABLE_TCL)!=0 +TCC = $(TCC) /DFOSSIL_ENABLE_TCL=1 +RCC = $(RCC) /DFOSSIL_ENABLE_TCL=1 +TCC = $(TCC) /DFOSSIL_ENABLE_TCL_STUBS=1 +RCC = $(RCC) /DFOSSIL_ENABLE_TCL_STUBS=1 +TCC = $(TCC) /DFOSSIL_ENABLE_TCL_PRIVATE_STUBS=1 +RCC = $(RCC) /DFOSSIL_ENABLE_TCL_PRIVATE_STUBS=1 +TCC = $(TCC) /DUSE_TCL_STUBS=1 +RCC = $(RCC) /DUSE_TCL_STUBS=1 +!endif + +!if $(USE_SEE)!=0 +TCC = $(TCC) /DUSE_SEE=1 +RCC = $(RCC) /DUSE_SEE=1 +!endif +} +regsub -all {[-]D} [join $SQLITE_WIN32_OPTIONS { }] {/D} MSC_SQLITE_OPTIONS +set j " \\\n " +writeln "SQLITE_OPTIONS = [join $MSC_SQLITE_OPTIONS $j]\n" + +set j " \\\n " +writeln [string map {-D /D} \ + "SHELL_OPTIONS = [join $SHELL_WIN32_OPTIONS $j]"]\n + +regsub -all {[-]D} [join $PIKCHR_OPTIONS { }] {/D} MSC_PIKCHR_OPTIONS +set j " \\\n " +writeln "PIKCHR_OPTIONS = [join $MSC_PIKCHR_OPTIONS $j]\n" + +writeln -nonewline "SRC = " +set i 0 +foreach s [lsort $src] { + if {$i > 0} { + writeln " \\" + writeln -nonewline " " + } + writeln -nonewline "\"\$(OX)\\${s}_.c\""; incr i +} +foreach s [lsort $src_ext] { + writeln " \\" + writeln -nonewline " " + writeln -nonewline "\"\$(SRCDIR_extsrc)\\${s}.c\""; incr i +} +writeln "\n" +writeln -nonewline "EXTRA_FILES = " +set i 0 +foreach s [lsort $extra_files] { + if {$i > 0} { + writeln " \\" + writeln -nonewline " " + } + set s [regsub -all / $s \\] + writeln -nonewline "\"\$(SRCDIR)\\${s}\""; incr i +} +writeln "\n" +set AdditionalObj [list shell sqlite3 th th_lang th_tcl cson_amalgamation pikchr] +writeln -nonewline "OBJ = " +set i 0 +foreach s [lsort [concat $src $AdditionalObj]] { + if {$i > 0} { + writeln " \\" + writeln -nonewline " " + } + writeln -nonewline "\"\$(OX)\\$s\$O\""; incr i +} +if {$i > 0} { + writeln " \\" +} +writeln -nonewline " \"\$(OX)\\fossil.res\"\n\n" +writeln [string map [list <<<NEXT_LINE>>> \\] { +!ifndef BASEAPPNAME +BASEAPPNAME = fossil +!endif + +APPNAME = $(OX)\$(BASEAPPNAME)$(E) +PDBNAME = $(OX)\$(BASEAPPNAME)$(P) +APPTARGETS = + +all: "$(OX)" "$(APPNAME)" + +$(BASEAPPNAME): "$(APPNAME)" + +$(BASEAPPNAME)$(E): "$(APPNAME)" + +install: "$(APPNAME)" + echo F | xcopy /Y "$(APPNAME)" "$(INSTALLDIR)"\* +!if $(DEBUG)!=0 + echo F | xcopy /Y "$(PDBNAME)" "$(INSTALLDIR)"\* +!endif + +$(OX): + @-mkdir $@ + +zlib: + @echo Building zlib from "$(ZLIBDIR)"... +!if $(FOSSIL_ENABLE_WINXP)!=0 + @pushd "$(ZLIBDIR)" && $(MAKE) /f win32\Makefile.msc $(ZLIB) "CC=cl $(XPCFLAGS)" "LD=link $(XPLDFLAGS)" && popd +!else + @pushd "$(ZLIBDIR)" && $(MAKE) /f win32\Makefile.msc $(ZLIB) && popd +!endif + +clean-zlib: + @pushd "$(ZLIBDIR)" && $(MAKE) /f win32\Makefile.msc clean && popd + +!if $(FOSSIL_ENABLE_SSL)!=0 +openssl: + @echo Building OpenSSL from "$(SSLDIR)"... +!if $(FOSSIL_ENABLE_WINXP)!=0 + @echo Passing XPCFLAGS = [ $(XPCFLAGS) ] to the OpenSSL configuration... +!endif +!ifdef PERLDIR + @pushd "$(SSLDIR)" && "$(PERLDIR)\$(PERL)" Configure $(SSLCONFIG) && popd +!else + @pushd "$(SSLDIR)" && "$(PERL)" Configure $(SSLCONFIG) && popd +!endif + @pushd "$(SSLDIR)" && $(MAKE) && popd +!if $(FOSSIL_ENABLE_WINXP)!=0 && $(FOSSIL_DYNAMIC_BUILD)!=0 +# +# NOTE: Appending custom linker flags to the OpenSSL default linker flags is +# somewhat difficult, as summarized in this Fossil Forum post: +# +# https://fossil-scm.org/forum/forumpost/a9a2d6af28b +# +# Therefore the custom linker flags required for Windows XP dynamic builds are +# applied in a separate post-build step. +# +# If the build stops here, or if the custom linker flags are outside the scope +# of `editbin` or `link /EDIT` (i.e. additional libraries), consider tweaking +# the OpenSSL makefile by hand. +# +# Also note that this step changes the subsystem for the OpenSSL DLLs from +# WINDOWS to CONSOLE, but which has no effect on DLLs. +# + @echo Applying XPLDFLAGS = [ $(XPLDFLAGS) ] to the OpenSSL DLLs... + @for /F "usebackq delims=" %F in (`dir /A:-D/B "$(SSLDIR)\*.dll" 2^>nul`) <<<NEXT_LINE>>> + do @( <<<NEXT_LINE>>> + echo %F & <<<NEXT_LINE>>> + link /EDIT /NOLOGO $(XPLDFLAGS) "$(SSLDIR)\%F" || exit 1 <<<NEXT_LINE>>> + ) +!endif + +clean-openssl: + @pushd "$(SSLDIR)" && $(MAKE) clean && popd +!endif + +!if $(FOSSIL_BUILD_ZLIB)!=0 +APPTARGETS = $(APPTARGETS) zlib +!endif + +!if $(FOSSIL_ENABLE_SSL)!=0 +!if $(FOSSIL_BUILD_SSL)!=0 +APPTARGETS = $(APPTARGETS) openssl +!endif +!endif + +"$(APPNAME)" : $(APPTARGETS) "$(OBJDIR)\translate$E" "$(OBJDIR)\mkindex$E" "$(OBJDIR)\codecheck1$E" "$(OX)\headers" $(OBJ) "$(OX)\linkopts" + "$(OBJDIR)\codecheck1$E" $(SRC) + link $(LDFLAGS) /OUT:$@ /PDB:$(@D)\ $(LIBDIR) Wsetargv.obj "$(OX)\fossil.res" @"$(OX)\linkopts" + if exist "$(B)\win\fossil.exe.manifest" <<<NEXT_LINE>>> + $(MTC) -nologo -manifest "$(B)\win\fossil.exe.manifest" -outputresource:$@;1 + +"$(OX)\linkopts": "$(B)\win\Makefile.msc"}] +set redir {>} +foreach s [lsort [concat $src $AdditionalObj]] { + writeln "\techo \"\$(OX)\\$s.obj\" $redir \$@" + set redir {>>} +} +set redir {>>} +writeln "\techo \$(LIBS) $redir \$@" +writeln { +"$(OBJDIR)\translate$E": "$(SRCDIR_tools)\translate.c" + $(BCC) /Fe$@ /Fo$(@D)\ /Fd$(@D)\ $** + +"$(OBJDIR)\makeheaders$E": "$(SRCDIR_tools)\makeheaders.c" + $(BCC) /Fe$@ /Fo$(@D)\ /Fd$(@D)\ $** + +"$(OBJDIR)\mkindex$E": "$(SRCDIR_tools)\mkindex.c" + $(BCC) /Fe$@ /Fo$(@D)\ /Fd$(@D)\ $** + +"$(OBJDIR)\mkbuiltin$E": "$(SRCDIR_tools)\mkbuiltin.c" + $(BCC) /Fe$@ /Fo$(@D)\ /Fd$(@D)\ $** + +"$(OBJDIR)\mkversion$E": "$(SRCDIR_tools)\mkversion.c" + $(BCC) /Fe$@ /Fo$(@D)\ /Fd$(@D)\ $** + +"$(OBJDIR)\codecheck1$E": "$(SRCDIR_tools)\codecheck1.c" + $(BCC) /Fe$@ /Fo$(@D)\ /Fd$(@D)\ $** + +!if $(USE_SEE)!=0 +SEE_FLAGS = /DSQLITE_HAS_CODEC=1 /DSQLITE_SHELL_DBKEY_PROC=fossil_key +SQLITE3_SHELL_SRC = $(SRCDIR)\shell-see.c +SQLITE3_SRC = $(SRCDIR_extsrc)\sqlite3-see.c +!else +SEE_FLAGS = +SQLITE3_SHELL_SRC = $(SRCDIR_extsrc)\shell.c +SQLITE3_SRC = $(SRCDIR_extsrc)\sqlite3.c +!endif + +"$(OX)\shell$O" : "$(SQLITE3_SHELL_SRC)" "$(B)\win\Makefile.msc" + $(TCC) /Fo$@ /Fd$(@D)\ $(SHELL_OPTIONS) $(SQLITE_OPTIONS) $(SHELL_CFLAGS) $(SEE_FLAGS) -c "$(SQLITE3_SHELL_SRC)" + +"$(OX)\sqlite3$O" : "$(SQLITE3_SRC)" "$(B)\win\Makefile.msc" + $(TCC) /Fo$@ /Fd$(@D)\ -c $(SQLITE_OPTIONS) $(SQLITE_CFLAGS) $(SEE_FLAGS) "$(SQLITE3_SRC)" + +"$(OX)\th$O" : "$(SRCDIR)\th.c" + $(TCC) /Fo$@ /Fd$(@D)\ -c $** + +"$(OX)\th_lang$O" : "$(SRCDIR)\th_lang.c" + $(TCC) /Fo$@ /Fd$(@D)\ -c $** + +"$(OX)\th_tcl$O" : "$(SRCDIR)\th_tcl.c" + $(TCC) /Fo$@ /Fd$(@D)\ -c $** + +"$(OX)\pikchr$O" : "$(SRCDIR_extsrc)\pikchr.c" + $(TCC) $(PIKCHR_OPTIONS) /Fo$@ /Fd$(@D)\ -c $** + +"$(OX)\VERSION.h" : "$(OBJDIR)\mkversion$E" "$(B)\manifest.uuid" "$(B)\manifest" "$(B)\VERSION" "$(B)\phony.h" + "$(OBJDIR)\mkversion$E" "$(B)\manifest.uuid" "$(B)\manifest" "$(B)\VERSION" > $@ + +"$(B)\phony.h" : + rem Force rebuild of VERSION.h whenever nmake is run + +"$(OX)\cson_amalgamation$O" : "$(SRCDIR_extsrc)\cson_amalgamation.c" + $(TCC) /Fo$@ /Fd$(@D)\ -c $** + +"$(OX)\page_index.h": "$(OBJDIR)\mkindex$E" $(SRC) + $** > $@ + +"$(OX)\builtin_data.h": "$(OBJDIR)\mkbuiltin$E" "$(OX)\builtin_data.reslist" + "$(OBJDIR)\mkbuiltin$E" --prefix "$(SRCDIR)/" --reslist "$(OX)\builtin_data.reslist" > $@ + +cleanx: + -del "$(OX)\*.obj" 2>NUL + -del "$(OBJDIR)\*.obj" 2>NUL + -del "$(OX)\*_.c" 2>NUL + -del "$(OX)\*.h" 2>NUL + -del "$(OX)\*.ilk" 2>NUL + -del "$(OX)\*.map" 2>NUL + -del "$(OX)\*.res" 2>NUL + -del "$(OX)\*.reslist" 2>NUL + -del "$(OX)\headers" 2>NUL + -del "$(OX)\linkopts" 2>NUL + -del "$(OX)\vc*.pdb" 2>NUL + +clean: cleanx + -del "$(APPNAME)" 2>NUL + -del "$(PDBNAME)" 2>NUL + -del "$(OBJDIR)\translate$E" 2>NUL + -del "$(OBJDIR)\translate$P" 2>NUL + -del "$(OBJDIR)\mkindex$E" 2>NUL + -del "$(OBJDIR)\mkindex$P" 2>NUL + -del "$(OBJDIR)\makeheaders$E" 2>NUL + -del "$(OBJDIR)\makeheaders$P" 2>NUL + -del "$(OBJDIR)\mkversion$E" 2>NUL + -del "$(OBJDIR)\mkversion$P" 2>NUL + -del "$(OBJDIR)\mkcss$E" 2>NUL + -del "$(OBJDIR)\mkcss$P" 2>NUL + -del "$(OBJDIR)\codecheck1$E" 2>NUL + -del "$(OBJDIR)\codecheck1$P" 2>NUL + -del "$(OBJDIR)\mkbuiltin$E" 2>NUL + -del "$(OBJDIR)\mkbuiltin$P" 2>NUL + +realclean: clean + +"$(OBJDIR)\json$O" : "$(SRCDIR)\json_detail.h" +"$(OBJDIR)\json_artifact$O" : "$(SRCDIR)\json_detail.h" +"$(OBJDIR)\json_branch$O" : "$(SRCDIR)\json_detail.h" +"$(OBJDIR)\json_config$O" : "$(SRCDIR)\json_detail.h" +"$(OBJDIR)\json_diff$O" : "$(SRCDIR)\json_detail.h" +"$(OBJDIR)\json_dir$O" : "$(SRCDIR)\json_detail.h" +"$(OBJDIR)\json_finfo$O" : "$(SRCDIR)\json_detail.h" +"$(OBJDIR)\json_login$O" : "$(SRCDIR)\json_detail.h" +"$(OBJDIR)\json_query$O" : "$(SRCDIR)\json_detail.h" +"$(OBJDIR)\json_report$O" : "$(SRCDIR)\json_detail.h" +"$(OBJDIR)\json_status$O" : "$(SRCDIR)\json_detail.h" +"$(OBJDIR)\json_tag$O" : "$(SRCDIR)\json_detail.h" +"$(OBJDIR)\json_timeline$O" : "$(SRCDIR)\json_detail.h" +"$(OBJDIR)\json_user$O" : "$(SRCDIR)\json_detail.h" +"$(OBJDIR)\json_wiki$O" : "$(SRCDIR)\json_detail.h" +} + +writeln {"$(OX)\builtin_data.reslist": $(EXTRA_FILES) "$(B)\win\Makefile.msc"} +set redir {>} +foreach s [lsort $extra_files] { + writeln "\techo \"\$(SRCDIR)\\${s}\" $redir \$@" + set redir {>>} +} + +foreach s [lsort $src] { + set extra_h($s) {} +} +set extra_h(builtin) " \"\$(OX)\\builtin_data.h\"" +set extra_h(dispatch) " \"\$(OX)\\page_index.h\"" + +writeln "" +foreach s [lsort $src] { + writeln "\"\$(OX)\\$s\$O\" : \"\$(OX)\\${s}_.c\" \"\$(OX)\\${s}.h\"$extra_h($s)" + writeln "\t\$(TCC) /Fo\$@ /Fd\$(@D)\\ -c \"\$(OX)\\${s}_.c\"\n" + writeln "\"\$(OX)\\${s}_.c\" : \"\$(SRCDIR)\\$s.c\"" + writeln "\t\"\$(OBJDIR)\\translate\$E\" \$** > \$@\n" +} + +writeln "\"\$(OX)\\fossil.res\" : \"\$(B)\\win\\fossil.rc\"" +writeln "\t\$(RCC) /fo \$@ \$**\n" + +writeln "\"\$(OX)\\headers\": \"\$(OBJDIR)\\makeheaders\$E\" \"\$(OX)\\page_index.h\" \"\$(OX)\\builtin_data.h\" \"\$(OX)\\VERSION.h\"" +writeln -nonewline "\t\"\$(OBJDIR)\\makeheaders\$E\" " +set i 0 +foreach s [lsort $src] { + if {$i > 0} { + writeln " \\" + writeln -nonewline "\t\t\t" + } + writeln -nonewline "\"\$(OX)\\${s}_.c\":\"\$(OX)\\$s.h\""; incr i +} +foreach s [lsort $src_ext] { + writeln " \\" + writeln -nonewline "\t\t\t" + writeln -nonewline "\"\$(SRCDIR_extsrc)\\${s}.c\":\"\$(OX)\\$s.h\""; incr i +} +writeln " \\\n\t\t\t\"\$(SRCDIR_extsrc)\\sqlite3.h\" \\" +writeln "\t\t\t\"\$(SRCDIR)\\th.h\" \\" +writeln "\t\t\t\"\$(OX)\\VERSION.h\" \\" +writeln "\t\t\t\"\$(SRCDIR_extsrc)\\cson_amalgamation.h\"" +writeln "\t@copy /Y nul: $@" + + +close $output_file +# +# End of the win/Makefile.msc output +############################################################################## +############################################################################## |
