Skip to content

Instantly share code, notes, and snippets.

@hmelder
Last active July 20, 2023 23:29
Show Gist options
  • Save hmelder/2bcd76ee40524fc4ba1bb8b527e0b04c to your computer and use it in GitHub Desktop.
Save hmelder/2bcd76ee40524fc4ba1bb8b527e0b04c to your computer and use it in GitHub Desktop.
Building an infer release on alpine linux

Requirements

  • Alpine Virtual Machine or similar
  • Time

Install Development Dependencies:

apk add alpine-sdk bash patchelf autoconf automake make pkgconf git openjdk17

Installing opam and OCaml

bash -c "sh <(curl -fsSL https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh)"
opam init --reinit --bare --disable-sandboxing --yes --auto-setup

Patch Infer

There are a few commands in the build scripts that use GNU extensions not available with busybox.

  1. "maketemp" only accepts .XXXXXX suffix, but Makescript uses XXXX
  2. "install" command does not have -C option. Use -c instead.

I have included hacky patch that worked for building the java release, but does not have other backends patched. The Makefiles are autogenerated so this patch is more of a guidance. A proper PR to make the build system work for non-GNU userlands would be better.

cd /infer && ./build-infer.sh java

Generate a release

make install-with-libs \
    BUILD_MODE=opt \
    PATCHELF=patchelf \
    DESTDIR="/infer-release" \
    libdir_relative_to_bindir="../lib"

Profit!

FROM alpine:latest
RUN apk add --no-cache bash tar openjdk17-jdk openjdk17-jre-headless
WORKDIR /
# Copy tarball to Docker image
COPY infer-release.tar.gz /
# Unpack the tarball
RUN tar -xf infer-release.tar.gz -C /opt && rm infer-release.tar.gz
# Set PATH variable to include infer binaries
ENV PATH="/opt/infer-release/usr/local/bin:${PATH}"
# Command to execute
CMD ["bash"]
diff --git a/Makefile b/Makefile
index c10262cca2..278a4c4e12 100644
--- a/Makefile
+++ b/Makefile
@@ -767,10 +767,10 @@ endif
test -d '$(DESTDIR)$(libdir)/infer/infer/bin/' || \
$(MKDIR_P) '$(DESTDIR)$(libdir)/infer/infer/bin/'
# copy files
- $(INSTALL_DATA) -C 'infer/lib/models.sql' \
+ $(INSTALL_DATA) -c 'infer/lib/models.sql' \
'$(DESTDIR)$(libdir)/infer/infer/lib/models.sql'
ifeq ($(BUILD_HACK_ANALYZERS),yes)
- $(INSTALL_DATA) -C 'infer/lib/hack/models.sil' \
+ $(INSTALL_DATA) -c 'infer/lib/hack/models.sil' \
'$(DESTDIR)$(libdir)/infer/infer/lib/hack/models.sil'
endif
ifeq ($(BUILD_C_ANALYZERS),yes)
@@ -790,36 +790,36 @@ ifeq ($(BUILD_C_ANALYZERS),yes)
[ $(cc) -ef '$(INFER_BIN)' ] && \
$(REMOVE) '$(notdir $(cc))' && \
$(LN_S) ../../bin/infer '$(notdir $(cc))';))
- $(INSTALL_DATA) -C 'infer/etc/clang_ast.dict' \
+ $(INSTALL_DATA) -c 'infer/etc/clang_ast.dict' \
'$(DESTDIR)$(libdir)/infer/infer/etc/clang_ast.dict'
endif
ifeq ($(BUILD_JAVA_ANALYZERS),yes)
- $(INSTALL_DATA) -C 'infer/annotations/annotations.jar' \
+ $(INSTALL_DATA) -c 'infer/annotations/annotations.jar' \
'$(DESTDIR)$(libdir)/infer/infer/annotations/annotations.jar'
find infer/lib/java/*.jar -print0 | xargs -0 -I \{\} \
- $(INSTALL_DATA) -C \{\} '$(DESTDIR)$(libdir)'/infer/\{\}
- $(INSTALL_PROGRAM) -C '$(LIB_DIR)'/wrappers/javac \
+ $(INSTALL_DATA) -c \{\} '$(DESTDIR)$(libdir)'/infer/\{\}
+ $(INSTALL_PROGRAM) -c '$(LIB_DIR)'/wrappers/javac \
'$(DESTDIR)$(libdir)'/infer/infer/lib/wrappers/
endif
find infer/config/ -type d -print0 | xargs -0 -I \{\} \
$(MKDIR_P) '$(DESTDIR)$(libdir)'/infer/\{\}
find infer/config/ -type f -print0 | xargs -0 -I \{\} \
- $(INSTALL_DATA) -C \{\} '$(DESTDIR)$(libdir)'/infer/\{\}
+ $(INSTALL_DATA) -c \{\} '$(DESTDIR)$(libdir)'/infer/\{\}
ifeq ($(BUILD_ERLANG_ANALYZERS),yes)
- $(INSTALL_PROGRAM) -C '$(LIB_DIR)'/erlang/erlang.sh \
+ $(INSTALL_PROGRAM) -c '$(LIB_DIR)'/erlang/erlang.sh \
'$(DESTDIR)$(libdir)'/infer/infer/lib/erlang/
- $(INSTALL_PROGRAM) -C '$(LIB_DIR)'/erlang/erlang.escript \
+ $(INSTALL_PROGRAM) -c '$(LIB_DIR)'/erlang/erlang.escript \
'$(DESTDIR)$(libdir)'/infer/infer/lib/erlang/
- $(INSTALL_PROGRAM) -C '$(LIB_DIR)'/erlang/extract.escript \
+ $(INSTALL_PROGRAM) -c '$(LIB_DIR)'/erlang/extract.escript \
'$(DESTDIR)$(libdir)'/infer/infer/lib/erlang/
- $(INSTALL_DATA) -C '$(LIB_DIR)'/erlang/infer_parse_transform/rebar.config \
+ $(INSTALL_DATA) -c '$(LIB_DIR)'/erlang/infer_parse_transform/rebar.config \
'$(DESTDIR)$(libdir)'/infer/infer/lib/erlang/infer_parse_transform/
- $(INSTALL_DATA) -C '$(LIB_DIR)'/erlang/infer_parse_transform/src/infer_parse_transform.app.src \
+ $(INSTALL_DATA) -c '$(LIB_DIR)'/erlang/infer_parse_transform/src/infer_parse_transform.app.src \
'$(DESTDIR)$(libdir)'/infer/infer/lib/erlang/infer_parse_transform/src/
- $(INSTALL_DATA) -C '$(LIB_DIR)'/erlang/infer_parse_transform/src/infer_parse_transform.erl \
+ $(INSTALL_DATA) -c '$(LIB_DIR)'/erlang/infer_parse_transform/src/infer_parse_transform.erl \
'$(DESTDIR)$(libdir)'/infer/infer/lib/erlang/infer_parse_transform/src/
endif
- $(INSTALL_PROGRAM) -C '$(INFER_BIN)' '$(DESTDIR)$(libdir)'/infer/infer/bin/
+ $(INSTALL_PROGRAM) -c '$(INFER_BIN)' '$(DESTDIR)$(libdir)'/infer/infer/bin/
(cd '$(DESTDIR)$(bindir)/' && \
$(REMOVE) infer && \
$(LN_S) '$(libdir_relative_to_bindir)'/infer/infer/bin/infer infer)
@@ -832,7 +832,7 @@ endif
$(REMOVE) "$$alias" && \
$(LN_S) infer "$$alias"); done
$(foreach man,$(INFER_GROFF_MANUALS_GZIPPED), \
- $(INSTALL_DATA) -C $(man) '$(DESTDIR)$(mandir)/man1/$(notdir $(man))';)
+ $(INSTALL_DATA) -c $(man) '$(DESTDIR)$(mandir)/man1/$(notdir $(man))';)
# install dynamic libraries
# use this if you want to distribute infer binaries
@@ -852,7 +852,7 @@ else # PLATFORM_ENV
for lib in $$($(LDD) $(INFER_BIN) \
| cut -d ' ' -f 3 \
| grep -e 'lib\(gmp\|mpfr\|sqlite\)'); do \
- $(INSTALL_PROGRAM) -C "$$lib" '$(DESTDIR)$(libdir)'/infer/infer/libso/; \
+ $(INSTALL_PROGRAM) -c "$$lib" '$(DESTDIR)$(libdir)'/infer/infer/libso/; \
done
# update rpath of executables
for sofile in '$(DESTDIR)$(libdir)'/infer/infer/libso/*.so*; do \
@@ -873,7 +873,7 @@ ifneq ($(INSTALL_NAME_TOOL),no)
for lib in $$($(OTOOL) -L $(INFER_BIN) \
| cut -d ' ' -f 1 | tr -d '\t' \
| grep -e 'lib\(gmp\|mpfr\|sqlite\)'); do \
- $(INSTALL_PROGRAM) -C "$$lib" '$(DESTDIR)$(libdir)'/infer/infer/libso/; \
+ $(INSTALL_PROGRAM) -c "$$lib" '$(DESTDIR)$(libdir)'/infer/infer/libso/; \
done
set -x; \
for sofile in '$(DESTDIR)$(libdir)'/infer/infer/libso/*.dylib; do \
diff --git a/infer/models/Makefile b/infer/models/Makefile
index 9281de3863..cae9ce0a50 100644
--- a/infer/models/Makefile
+++ b/infer/models/Makefile
@@ -57,7 +57,7 @@ ifeq ($(BUILD_JAVA_ANALYZERS),yes)
$(INFER_BIN) --continue capture $(INFER_OPTIONS) -- $(JAVAC) $(JAVAC_OPTIONS))
cd $(JAVA_MODELS_OUT); jar cf ../../$(MODELS_JAR) *
# install the models.jar file too
- $(INSTALL_DATA) -C $(MODELS_JAR) $(JAVA_MODELS_JAR)
+ $(INSTALL_DATA) -c $(MODELS_JAR) $(JAVA_MODELS_JAR)
$(QUIET)touch $(JAVA_MODELS_JAR)
endif
diff --git a/infer/src/Makefile b/infer/src/Makefile
index 7fb5f4b21e..5f8d324c0f 100644
--- a/infer/src/Makefile
+++ b/infer/src/Makefile
@@ -139,12 +139,12 @@ checkCopyright: $(CHECKCOPYRIGHT_BIN)
.PHONY: infer
infer: $(INFER_BIN).exe
- $(INSTALL_PROGRAM) -C $(INFER_BIN).exe $(INFER_BIN)
+ $(INSTALL_PROGRAM) -c $(INFER_BIN).exe $(INFER_BIN)
$(MAKE) $(INFER_BIN_ALIASES)
.PHONY: byte
byte: $(INFER_BIN).bc.exe
- $(INSTALL_PROGRAM) -C $(INFER_BIN).bc.exe $(INFER_BIN)
+ $(INSTALL_PROGRAM) -c $(INFER_BIN).bc.exe $(INFER_BIN)
$(MAKE) $(INFER_BIN_ALIASES)
INFER_BIN_ALIASES = $(foreach alias,$(INFER_COMMANDS),$(BIN_DIR)/$(alias))
@@ -213,7 +213,7 @@ $(CLANG_BINIOU_DICT): $(CLANG_ATDGEN_STUB_ATD)
> $@
$(GENERATED_FROM_AUTOCONF): $(MAKEFILE_LIST)
- TMPFILE=$$(mktemp $@.tmp.XXXX); \
+ TMPFILE=$$(mktemp $@.tmp.XXXXXX); \
INFER_GIT_COMMIT=$$(git --work-tree=$(ROOT_DIR) --git-dir=$(ROOT_DIR)/.git rev-parse --short HEAD || printf "unknown"); \
INFER_GIT_BRANCH=$$(git --work-tree=$(ROOT_DIR) --git-dir=$(ROOT_DIR)/.git rev-parse --abbrev-ref HEAD || printf "unknown"); \
sed \
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment