Files
solo-c/Makefile
T

62 lines
2.1 KiB
Makefile
Raw Normal View History

CC = gcc
CFLAGS = -Wall -Wextra -O2 -std=c99 -march=native $(shell pkg-config --cflags libcurl json-c readline)
LDLIBS = $(shell pkg-config --libs libcurl json-c readline)
# Fully static binary.
#
# The distro libcurl.a cannot be linked statically on Alpine: it pulls in
# libpsl, libbrotli, libzstd and libnghttp2, whose static archives hold LTO
# bytecode from GCC 14 that the installed GCC 15 cannot read ("bytecode
# stream ... generated with LTO version 14.0 instead of the expected 15.1"),
# so psl_*/Brotli*/ZSTD* never resolve. -fno-lto does not help; the objects
# are bytecode, not C.
#
# static-deps/libcurl.a is curl built without those four libraries, leaving
# only LTO-free static deps. Regenerate with: make static-deps
#
# c-ares is built from source by the same script, for two reasons: a minimal
# system often has no libcares.a at all (Void's c-ares-devel ships the shared
# library only), and where an archive does exist it can carry the same LTO
# bytecode as the distro libcurl.a. Building it also pins the version.
#
# Archive order matters: libcurl.a pulls in ares_* symbols, so libcares.a has to
# come after it on the link line.
CURL_STATIC ?= static-deps/libcurl.a
CARES_STATIC ?= static-deps/libcares.a
STATIC_LIBS = $(CURL_STATIC) $(CARES_STATIC) -lssl -lcrypto -lz -lidn2 -lunistring \
-lreadline -lncursesw -ljson-c -lm -ldl -pthread
solo: main.c
$(CC) $(CFLAGS) -o solo main.c $(LDLIBS)
strip solo
static: main.c
@for f in $(CURL_STATIC) $(CARES_STATIC); do \
test -f $$f || { echo "missing $$f - run: make static-deps"; exit 1; }; \
done
$(CC) $(CFLAGS) -fno-lto -static -o solo-static main.c $(STATIC_LIBS)
strip solo-static
static-deps:
sh ./mkstaticdeps.sh
# Rebuild both archives from scratch, ignoring what is already there.
static-deps-force:
FORCE=1 sh ./mkstaticdeps.sh
PREFIX ?= /usr/local
BINDIR = $(PREFIX)/bin
INSTALL ?= install
install: solo
$(INSTALL) -d $(DESTDIR)$(BINDIR)
$(INSTALL) -m 755 solo $(DESTDIR)$(BINDIR)/solo
uninstall:
rm -f $(DESTDIR)$(BINDIR)/solo $(DESTDIR)$(BINDIR)/solo-static
clean:
rm -f solo solo-static
.PHONY: clean static static-deps static-deps-force install uninstall