From c6d4fbc68e863b070a3f33db7c87d581569d1db5 Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Sun, 20 Sep 2020 02:20:32 +0200 Subject: Build a static binary I recently tried installing the program via Homebrew on a machine that didn't have 'libgit2' installed. The Homebrew formula installs pre-built binaries. Running the binaries gave me an error saying that the 'libgit2' dynamic library couldn't be found. Change the build configuration to build a "static" binary. It still links to system dylibs, but I've removed all links to Homebrew dylibs. These were: * libgit2 * openssl Removed the 'openssl' link by adding the 'vendored-openssl' feature to the 'git2' dependency. In order to remove the 'libgit2' link, I had to do some more finagling. Accomplished this by setting an empty `PKG_CONFIG_LIBDIR` when building. While 'git2' doesn't have a Cargo feature to disable dynamic linking, we can force static linking by preventing `pkg-config` from finding the Homebrew-installed 'libgit2'. The 'libgit2-sys' crate's build script first checks for the library using `pkg-config`, and builds it statically if it doesn't exist: https://github.com/rust-lang/git2-rs/blob/43d583fd8b50fad0cfe0bbc334059ce965b6f3fc/libgit2-sys/build.rs#L15-L17 With these changes, the above packages will now be statically linked with the program's binaries. Upgrade 'git2' to the latest version (0.13.11) since we're changing its build configuration. Before: $ otool -L target/release/git-sug* target/release/git-sugapply: /System/Library/Frameworks/Security.framework/Versions/A/Security (compatibility version 1.0.0, current version 57740.60.18) /usr/local/opt/libgit2/lib/libgit2.1.0.dylib (compatibility version 1.0.0, current version 1.0.1) /usr/local/opt/openssl@1.1/lib/libssl.1.1.dylib (compatibility version 1.1.0, current version 1.1.0) /usr/local/opt/openssl@1.1/lib/libcrypto.1.1.dylib (compatibility version 1.1.0, current version 1.1.0) /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.8) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.60.2) /usr/lib/libresolv.9.dylib (compatibility version 1.0.0, current version 1.0.0) target/release/git-sugapply.d: is not an object file target/release/git-sugdiff: /System/Library/Frameworks/Security.framework/Versions/A/Security (compatibility version 1.0.0, current version 57740.60.18) /usr/local/opt/libgit2/lib/libgit2.1.0.dylib (compatibility version 1.0.0, current version 1.0.1) /usr/local/opt/openssl@1.1/lib/libssl.1.1.dylib (compatibility version 1.1.0, current version 1.1.0) /usr/local/opt/openssl@1.1/lib/libcrypto.1.1.dylib (compatibility version 1.1.0, current version 1.1.0) /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.8) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.60.2) /usr/lib/libresolv.9.dylib (compatibility version 1.0.0, current version 1.0.0) target/release/git-sugdiff.d: is not an object file After: $ otool -L target/release/git-sug* target/release/git-sugapply: /System/Library/Frameworks/Security.framework/Versions/A/Security (compatibility version 1.0.0, current version 57740.60.18) /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0) /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1349.8.0) /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.8) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.60.2) /usr/lib/libresolv.9.dylib (compatibility version 1.0.0, current version 1.0.0) target/release/git-sugapply.d: is not an object file target/release/git-sugdiff: /System/Library/Frameworks/Security.framework/Versions/A/Security (compatibility version 1.0.0, current version 57740.60.18) /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0) /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1349.8.0) /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.8) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.60.2) /usr/lib/libresolv.9.dylib (compatibility version 1.0.0, current version 1.0.0) target/release/git-sugdiff.d: is not an object file --- github-suggestion/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'github-suggestion') diff --git a/github-suggestion/Cargo.toml b/github-suggestion/Cargo.toml index 34e197c..8962adc 100644 --- a/github-suggestion/Cargo.toml +++ b/github-suggestion/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2018" [dependencies] -git2 = "0.13.8" +git2 = { version = "0.13.11", features = ["vendored-openssl"] } github-rs = "0.7.0" regex = "1.3.9" serde = { version = "1.0.114", features = ["derive"] } -- cgit v1.2.3