Files
2026-06-17 15:18:22 -07:00

155 lines
4.6 KiB
Makefile

# Default options
USE_BSDIFF ?= y
EXECUTABLES-y := bspatch
LIBRARIES-y := libbspatch.so
EXECUTABLES-$(USE_BSDIFF) += bsdiff
LIBRARIES-$(USE_BSDIFF) += libbsdiff.so
BINARIES := $(EXECUTABLES-y) $(LIBRARIES-y)
INSTALL = install
CPPFLAGS += -Iinclude -I..
CXXFLAGS += -std=c++14 -O3 -Wall -Werror -fPIC
# On macOS the brotli/divsufsort headers and libraries are installed under the
# Homebrew prefix, which isn't on the compiler's default search path.
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Darwin)
BREW_PREFIX ?= $(shell brew --prefix)
CPPFLAGS += -I$(BREW_PREFIX)/include
LDFLAGS += -L$(BREW_PREFIX)/lib
# macOS's linker spells the shared-library name flag differently than GNU ld.
SONAME_FLAG = -Wl,-install_name,
else
SONAME_FLAG = -Wl,-soname,
endif
# The unit tests require GoogleTest/GoogleMock. Detect whether its headers are
# available so a plain `make` works (and produces no spurious errors) without
# GoogleTest installed; `make test` then prints a hint instead of failing.
HAVE_GTEST := $(shell printf '\#include <gtest/gtest.h>\n' | $(CXX) $(CPPFLAGS) $(CXXFLAGS) -fsyntax-only -xc++ - >/dev/null 2>&1 && echo y)
DESTDIR ?=
PREFIX = /usr
BINDIR = $(PREFIX)/bin
DATADIR = $(PREFIX)/share
MANDIR = $(DATADIR)/man
MAN1DIR = $(MANDIR)/man1
INCLUDEDIR ?= $(PREFIX)/include
GENTOO_LIBDIR ?= lib
LIBDIR ?= $(PREFIX)/$(GENTOO_LIBDIR)
INSTALL_PROGRAM ?= $(INSTALL) -c -m 755
INSTALL_MAN ?= $(INSTALL) -c -m 444
.PHONY: all test clean install
all: $(BINARIES)
ifeq ($(HAVE_GTEST),y)
test: bsdiff_unittest
else
test:
@echo "GoogleTest not found; install it (e.g. 'brew install googletest') to build the tests." >&2; exit 1
endif
clean:
rm -f *.o $(BINARIES) bsdiff_unittest .deps
### List of source files for each project. Keep in sync with the Android.mk.
# "bsdiff" program.
bsdiff_src_files := \
brotli_compressor.cc \
bsdiff.cc \
bz2_compressor.cc \
compressor_buffer.cc \
diff_encoder.cc \
endsley_patch_writer.cc \
logging.cc \
patch_writer.cc \
patch_writer_factory.cc \
split_patch_writer.cc \
suffix_array_index.cc
# "bspatch" program.
bspatch_src_files := \
brotli_decompressor.cc \
bspatch.cc \
bz2_decompressor.cc \
buffer_file.cc \
decompressor_interface.cc \
extents.cc \
extents_file.cc \
file.cc \
logging.cc \
memory_file.cc \
patch_reader.cc \
sink_file.cc \
utils.cc
# Unit test files.
bsdiff_common_unittests := \
brotli_compressor_unittest.cc \
brotli_decompressor_unittest.cc \
bsdiff_arguments.cc \
bsdiff_arguments_unittest.cc \
bsdiff_unittest.cc \
bspatch_unittest.cc \
bz2_decompressor_unittest.cc \
diff_encoder_unittest.cc \
endsley_patch_writer_unittest.cc \
extents_file_unittest.cc \
extents_unittest.cc \
patch_reader_unittest.cc \
patch_writer_unittest.cc \
split_patch_writer_unittest.cc \
suffix_array_index_unittest.cc \
test_utils.cc \
testrunner.cc
BSDIFF_LIBS := -lbz2 -lbrotlienc -ldivsufsort -ldivsufsort64
BSDIFF_OBJS := $(bsdiff_src_files:.cc=.o)
BSPATCH_LIBS := -lbz2 -lbrotlidec
BSPATCH_OBJS := $(bspatch_src_files:.cc=.o)
UNITTEST_LIBS = -lgmock -lgtest -lpthread
UNITTEST_OBJS := $(bsdiff_common_unittests:.cc=.o)
bsdiff: $(BSDIFF_OBJS) bsdiff_arguments.o bsdiff_main.o
bsdiff: LDLIBS += $(BSDIFF_LIBS)
libbsdiff.so: $(BSDIFF_OBJS)
libbsdiff.so: LDLIBS += $(BSDIFF_LIBS)
bspatch: $(BSPATCH_OBJS) bspatch_main.o
bspatch: LDLIBS += $(BSPATCH_LIBS)
libbspatch.so: $(BSPATCH_OBJS)
libbspatch.so: LDLIBS += $(BSPATCH_LIBS)
bsdiff_unittest: LDLIBS += $(BSDIFF_LIBS) $(BSPATCH_LIBS) $(UNITTEST_LIBS)
bsdiff_unittest: $(BSPATCH_OBJS) $(BSDIFF_OBJS) $(UNITTEST_OBJS)
bsdiff_unittest bsdiff bspatch:
$(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS)
libbsdiff.so libbspatch.so:
$(CXX) $(CXXFLAGS) $(LDFLAGS) $(SONAME_FLAG)$@ -shared -o $@ $^ $(LDLIBS)
# Source file dependencies. The unit-test sources are only scanned when
# GoogleTest is available, so a plain `make` doesn't error on missing headers.
deps_src_files := $(bsdiff_src_files) $(bspatch_src_files) \
bsdiff_arguments.cc bsdiff_main.cc bspatch_main.cc
ifeq ($(HAVE_GTEST),y)
deps_src_files += $(bsdiff_common_unittests)
endif
.deps: $(sort $(deps_src_files))
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -MM $^ >$@ || (rm -f $@; false)
-include .deps
install:
mkdir -p $(DESTDIR)$(BINDIR) $(DESTDIR)$(LIBDIR) $(DESTDIR)$(MAN1DIR) \
$(DESTDIR)/$(INCLUDEDIR)/bsdiff
$(INSTALL_PROGRAM) $(EXECUTABLES-y) $(DESTDIR)$(BINDIR)
$(INSTALL_PROGRAM) $(LIBRARIES-y) $(DESTDIR)$(LIBDIR)
$(INSTALL) -c -m 644 include/bsdiff/*.h $(DESTDIR)/$(INCLUDEDIR)/bsdiff
ifndef WITHOUT_MAN
$(INSTALL_MAN) $(EXECUTABLES-y:=.1) $(DESTDIR)$(MAN1DIR)
endif