62 lines
2.1 KiB
Makefile
62 lines
2.1 KiB
Makefile
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
|