Assembled from klammertext-dev f344a37d772c. The commands, the library,
the Standard Klammer Set, the reflection klammerset and the Python
binding build and run natively on Windows (MSYS2 UCRT64 gcc, python.org
Python), and both test tiers pass there. doc/install/windows_source_install.md
is the fifth install guide: a source install parallel to the Linux and
macOS ones, verified by following it on a pristine Windows 11.
Behaviour on every system: paths Klammertext prints use forward slashes;
output is LF; the command line is UTF-8 on Windows; @eval :shell is a
POSIX shell command everywhere -- on Windows it runs the sh Klammertext
ships, BusyBox for Windows (win/busybox/, GPLv2, with its licence and the
source pointer). KLAMMERTEXT_FONTS and KLAMMERTEXT_KLAMMERSETS are lists in
the system's PATH convention (';' on Windows). On Linux and macOS nothing
observable changes.
133 lines
4.4 KiB
Makefile
133 lines
4.4 KiB
Makefile
# Klammertext com/ Makefile
|
|
# Improved version with automatic header dependency tracking
|
|
|
|
K := $(KLAMMERTEXT_HOME)
|
|
KS := $(K)/sks
|
|
KM := $(K)/mac
|
|
|
|
include $(K)/env/makefile.env
|
|
|
|
# Commands to build
|
|
COMMANDS := kdiag kdesc ktext
|
|
|
|
# Build output directory: commands are linked directly into ../bin, so there is
|
|
# exactly one copy of each (no redundant executables in com/) and make still
|
|
# tracks them by path for incremental builds.
|
|
BINDIR := ../bin
|
|
BINCOMMANDS := $(addprefix $(BINDIR)/,$(COMMANDS))
|
|
|
|
# System install location (out-of-tree). Override on the command line, e.g.
|
|
# make install PREFIX=/opt DESTDIR=/tmp/stage
|
|
PREFIX ?= /usr/local
|
|
DESTDIR ?=
|
|
|
|
# Shared library location
|
|
LIBDIR := ../lib
|
|
LIBRARY := $(LIBDIR)/libklammertext.so
|
|
|
|
# Linker flags for commands
|
|
COM_LDFLAGS := $(EXPORT_DYNAMIC) -Wl,-rpath,'$(ORIGIN)/../lib' -L$(LIBDIR)
|
|
|
|
# Windows: the application manifest (UTF-8 process code page) is linked into
|
|
# each command as a resource object; elsewhere there is nothing to add.
|
|
# (Only variables here: a rule before "all" would become the default goal.
|
|
# The Windows rules themselves follow the commands target below.)
|
|
ifneq (,$(filter MINGW% MSYS%,$(UNAME_S)))
|
|
MANIFEST_OBJ := manifest.o
|
|
# The DLLs beside the commands (makefile.env explains); with them, bin/ on
|
|
# PATH is all a Windows user needs besides Python.
|
|
RUNTIME_DLLS := $(addprefix $(BINDIR)/,libklammertext.so $(GCC_RUNTIME_DLLS))
|
|
else
|
|
MANIFEST_OBJ :=
|
|
RUNTIME_DLLS :=
|
|
endif
|
|
|
|
# Dependency files for command sources
|
|
DEPFILES := $(addsuffix .d,$(COMMANDS))
|
|
|
|
# Compiler flags for dependency generation ($(@F) keeps the .d files in com/,
|
|
# not in the ../bin output directory).
|
|
DEPFLAGS = -MMD -MP -MF $(@F).d
|
|
|
|
.PHONY: all clean redo clang mac sks install
|
|
|
|
# Default target: build dependencies first, then commands. The commands are
|
|
# three independent links against the finished library, so they run in
|
|
# parallel (as mac/ and the sks/ components already do) rather than one after
|
|
# another -- the serial links were about a quarter of a clean rebuild.
|
|
all : | mac sks
|
|
$(MAKE) -j commands
|
|
|
|
# Separate target to build commands (called after dependencies are ready)
|
|
.PHONY: commands
|
|
commands : $(BINCOMMANDS) $(RUNTIME_DLLS)
|
|
|
|
ifneq (,$(filter MINGW% MSYS%,$(UNAME_S)))
|
|
manifest.o : klammertext.rc klammertext.manifest
|
|
windres $< $@
|
|
$(BINDIR)/libklammertext.so : $(LIBRARY) | $(BINDIR)
|
|
cp $< $@
|
|
$(BINDIR)/%.dll : $(GCC_BIN)%.dll | $(BINDIR)
|
|
cp $< $@
|
|
endif
|
|
|
|
# Ensure the output directory exists before linking into it.
|
|
$(BINDIR) :
|
|
mkdir -p $@
|
|
|
|
# Build mac/ objects
|
|
mac :
|
|
$(MAKE) -C $(KM) -j
|
|
|
|
# Build sks/ components (depends on mac)
|
|
sks : | mac
|
|
$(MAKE) -C $(KS)/kutil -j
|
|
$(MAKE) -C $(KS)/target -j
|
|
$(MAKE) -C $(KS)/document
|
|
|
|
# Explicit rules for each command - link against shared library, output to bin/
|
|
$(BINDIR)/kdiag : kdiag.cpp $(LIBRARY) $(MANIFEST_OBJ) | $(BINDIR)
|
|
$(CXX) $(CPPFLAGS) $(CXXFLAGS) $(DEPFLAGS) $(COM_LDFLAGS) $(LDFLAGS) $< $(MANIFEST_OBJ) -o $@ $(KLAMMERTEXT_LIB) $(LDLIBS)
|
|
|
|
$(BINDIR)/kdesc : kdesc.cpp $(LIBRARY) $(MANIFEST_OBJ) | $(BINDIR)
|
|
$(CXX) $(CPPFLAGS) $(CXXFLAGS) $(DEPFLAGS) $(COM_LDFLAGS) $(LDFLAGS) $< $(MANIFEST_OBJ) -o $@ $(KLAMMERTEXT_LIB) $(LDLIBS)
|
|
|
|
$(BINDIR)/ktext : ktext.cpp $(LIBRARY) $(MANIFEST_OBJ) | $(BINDIR)
|
|
$(CXX) $(CPPFLAGS) $(CXXFLAGS) $(DEPFLAGS) $(COM_LDFLAGS) $(LDFLAGS) $< $(MANIFEST_OBJ) -o $@ $(KLAMMERTEXT_LIB) $(LDLIBS)
|
|
|
|
# Out-of-tree system install (copies; the build tree stays intact). The
|
|
# installed commands still need KLAMMERTEXT_HOME pointing at a Klammertext tree
|
|
# for sks/ and the Python modules; their rpath finds libklammertext.so in
|
|
# $(PREFIX)/lib.
|
|
install : all
|
|
install -d $(DESTDIR)$(PREFIX)/bin $(DESTDIR)$(PREFIX)/lib
|
|
install -m755 $(BINCOMMANDS) $(DESTDIR)$(PREFIX)/bin
|
|
install -m755 $(LIBRARY) $(DESTDIR)$(PREFIX)/lib
|
|
|
|
clean :
|
|
rm -f $(BINCOMMANDS) $(DEPFILES) *~
|
|
|
|
redo :
|
|
ifneq ($(filter clang,$(MAKECMDGOALS)),)
|
|
@:
|
|
else
|
|
$(MAKE) -C $(KM) clean
|
|
$(MAKE) -C $(KS)/kutil clean
|
|
$(MAKE) -C $(KS)/target clean
|
|
$(MAKE) -C $(KS)/document clean
|
|
# ref/reflect.so links against libklammertext.so and is dlopened, so
|
|
# it shares the class layouts: a stale one after a header change is
|
|
# the same memory-corruption hazard as a stale sks/document.so.
|
|
$(MAKE) -C $(K)/ref clean
|
|
$(MAKE) -C $(K)/kpy clean
|
|
$(MAKE) clean
|
|
$(MAKE) all
|
|
endif
|
|
|
|
# "make clang" = incremental build; "make clang redo" = full clean rebuild
|
|
clang :
|
|
$(MAKE) $(or $(filter-out clang,$(MAKECMDGOALS)),all) COMPILER=clang
|
|
|
|
# Include generated dependency files (if they exist)
|
|
-include $(DEPFILES)
|