Skip to content

Commit

Permalink
build: ship universal binaries for macOS
Browse files Browse the repository at this point in the history
This mostly reverts commit 737afb3.
We have to build in an OOT directory to make it work. This also
requires to bump minimum SDK to 11.1 (for ARM64 mostly but it also fix
an issue with strtonum() which is detected as available but really is
since 11.0 only).

This does not currently work as the host has to be ARM64 (to be able
to run both binaries). Otherwise, we would have to cross-compile. See
actions/runner-images#2187 for availability.
  • Loading branch information
vincentbernat committed Aug 17, 2022
1 parent 870702b commit 518eb92
Show file tree
Hide file tree
Showing 6 changed files with 99 additions and 30 deletions.
6 changes: 3 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,13 @@ jobs:
CC: ${{ matrix.compiler }}
- name: Generate release body
if: matrix.release
run: ./tests/ci/release.sh > release.md
run: cd build && ../tests/ci/release.sh > ../release.md
- name: Upload release tarball
uses: actions/upload-artifact@v2
if: matrix.release
with:
name: tarball
path: lldpd-*.tar.gz
path: build/lldpd-*.tar.gz
if-no-files-found: error
- name: Upload release summary
uses: actions/upload-artifact@v2
Expand Down Expand Up @@ -97,7 +97,7 @@ jobs:
if: matrix.release
with:
name: package
path: lldpd-*.pkg
path: build/lldpd-*.pkg
if-no-files-found: error

build-bsd:
Expand Down
4 changes: 4 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
lldpd (1.0.16)
* Changes
+ Ship universal binaries for MacOS (x86_64 and arm64)

lldpd (1.0.15)
* Changes
+ Add configure command to override system capabilities. Contributed by
Expand Down
29 changes: 10 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,38 +92,29 @@ simpler alternatives:
# Or, for the latest version:
brew install https://raw.github.com/lldpd/lldpd/master/osx/lldpd.rb

2. Build an macOS installer package which should work on the same
version of macOS:

2. Build an OS X installer package which should work on the same
version of OS X (it is important to use a separate build
directory):

mkdir build && cd build
../configure --prefix=/usr/local --localstatedir=/var --sysconfdir=/private/etc --with-embedded-libevent \
--without-snmp
make -C osx pkg

If you want to compile for an older version of macOS, you need
to find the right SDK and issues commands like those:

SDK=/Developer/SDKs/MacOSX10.6.sdk
mkdir build && cd build
../configure --prefix=/usr/local --localstatedir=/var --sysconfdir=/private/etc --with-embedded-libevent \
--without-snmp \
CFLAGS="-mmacosx-version-min=10.6 -isysroot $SDK" \
LDFLAGS="-mmacosx-version-min=10.6 -isysroot $SDK"
make -C osx pkg

With recent SDK, you don't need to specify an alternate SDK. They
are organized in a way that should enable compatibility with older
versions of OSX:
commands like those:

mkdir build && cd build
../configure --prefix=/usr/local --localstatedir=/var --sysconfdir=/private/etc --with-embedded-libevent \
--without-snmp \
CFLAGS="-mmacosx-version-min=10.9" \
LDFLAGS="-mmacosx-version-min=10.9"
CFLAGS="-mmacosx-version-min=11.1" \
LDFLAGS="-mmacosx-version-min=11.1"
make -C osx pkg

You can check with `otool -l` that you got what you expected in
term of supported versions.
term of supported versions. If you are running on ARM64, you can
configure a binary supporting both architectures by adding
`ARCHS="arm64 x86_64"` to the arguments of the `make` command.

If you don't follow the above procedures, you will have to create the
user/group `_lldpd`. Have a look at how this is done in
Expand Down
19 changes: 16 additions & 3 deletions osx/Makefile.am
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
EXTRA_DIST = resources
EXTRA_DIST = resources lipo
EXTRA_DIST += distribution.xml.in im.bernat.lldpd.plist.in scripts/postinstall.in scripts/preinstall.in
TEMPLATES = distribution.xml im.bernat.lldpd.plist scripts/postinstall scripts/preinstall

Expand All @@ -14,6 +14,7 @@ requirements:
PKG_NAME=@PACKAGE@-@VERSION@.pkg
PKG_TITLE=@PACKAGE@ @VERSION@
PKG_DIR=@PACKAGE@-@VERSION@
ARCHS=@host_cpu@

# Main target is `pkg`
pkg: requirements ../$(PKG_NAME)
Expand Down Expand Up @@ -42,8 +43,20 @@ pkg.1/$(PKG_NAME): $(PKG_DIR) scripts/postinstall scripts/preinstall
$@

$(PKG_DIR): stamp-$(PKG_DIR)
stamp-$(PKG_DIR): im.bernat.lldpd.plist
$(MAKE) -C .. install DESTDIR=$(abs_builddir)/$(PKG_DIR)
stamp-$(PKG_DIR): $(ARCHS:%=%/$(PKG_DIR))
$(srcdir)/lipo $(PKG_DIR) $^
touch $@

pkg_curarch = $(@:stamp-%=%)
$(ARCHS:%=%/$(PKG_DIR)): %/$(PKG_DIR): stamp-%
$(ARCHS:%=stamp-%): stamp-%: im.bernat.lldpd.plist
[ -d $(pkg_curarch) ] || mkdir -p $(pkg_curarch)
(cd $(pkg_curarch) && \
$(abs_top_srcdir)/configure @CONFIGURE_ARGS@ \
CC="@CC@ -arch $(pkg_curarch)" \
CPP="@CPP@")
(cd $(pkg_curarch) && \
$(MAKE) install DESTDIR=$(abs_builddir)/$(pkg_curarch)/$(PKG_DIR))
touch $@

# Install launchd plist
Expand Down
60 changes: 60 additions & 0 deletions osx/lipo
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
#!/usr/bin/env python3

"""Apply lipo recursively to trees.
"""

import sys
import os
import shutil
import subprocess

# Parse arguments
import argparse

parser = argparse.ArgumentParser(
description=sys.modules[__name__].__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter,
)
parser.add_argument("output", help="Output tree")
parser.add_argument("input", help="Input trees", nargs="+")
options = parser.parse_args()
output = options.output
inputs = options.input


def ismacho(path):
"""Check if a file is Mach-O"""
fnull = open(os.devnull, "w")
try:
subprocess.check_call(["lipo", "-info", path], stdout=fnull, stderr=fnull)
except subprocess.CalledProcessError:
return False
return True


# Copy
for root, dirs, files in os.walk(inputs[0]):
# Create root directory in output
oroot = root[len(inputs[0]) :].lstrip("/")
oroot = os.path.join(output, oroot)
if not os.path.isdir(oroot):
os.makedirs(oroot)
shutil.copystat(root, oroot)

# Copy files
for f in files:
of = os.path.join(oroot, f)
f = os.path.join(root, f)
if os.path.islink(f):
# Symlink
linkto = os.readlink(f)
os.symlink(linkto, of)
elif ismacho(f):
sff = [os.path.join(r, f[len(inputs[0]) :].lstrip("/")) for r in inputs]
args = ["lipo", "-create", "-output", of]
args.extend(sff)
subprocess.check_call(args)
else:
# Regular file, just copy from the first input directory
shutil.copyfile(f, of)
shutil.copystat(f, of)
11 changes: 6 additions & 5 deletions tests/ci/run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ case "$(uname -s)" in
MAKE_ARGS="-Werror"
;;
Darwin)
LLDPD_CONFIG_ARGS="$LLDPD_CONFIG_ARGS CFLAGS=-mmacosx-version-min=10.9"
LLDPD_CONFIG_ARGS="$LLDPD_CONFIG_ARGS LDFLAGS=-mmacosx-version-min=10.9"
LLDPD_CONFIG_ARGS="$LLDPD_CONFIG_ARGS CFLAGS=-mmacosx-version-min=11.1"
LLDPD_CONFIG_ARGS="$LLDPD_CONFIG_ARGS LDFLAGS=-mmacosx-version-min=11.1"
MAKE_ARGS=""
;;
OpenBSD)
Expand All @@ -23,7 +23,8 @@ case "$(uname -s)" in
esac

./autogen.sh
./configure $LLDPD_CONFIG_ARGS || {
mkdir build && cd build
../configure $LLDPD_CONFIG_ARGS || {
cat config.log
exit 1
}
Expand All @@ -40,12 +41,12 @@ fi
case "$(uname -s)" in
Darwin)
# Create a package
make -C osx pkg
make -C osx pkg ARCHS="x86_64 arm64"
otool -l osx/lldpd*/usr/local/sbin/lldpd
;;
Linux)
# Integration tests
cd tests/integration
cd ../tests/integration
sudo $(which python3) -m pytest -n 5 -vv --boxed || \
sudo $(which python3) -m pytest -vvv --last-failed --maxfail=5
;;
Expand Down

0 comments on commit 518eb92

Please sign in to comment.