From f15eba1c8f7b6d558009d86cb457f813b34a4367 Mon Sep 17 00:00:00 2001 From: Chris Cannam Date: Fri, 8 Jan 2021 15:34:16 +0000 Subject: [PATCH] Rename Makefile.osx to Makefile.macos, make it arch-neutral, add a macos-universal variant that explicitly does x86_64 + arm64 build --- .github/workflows/macos-ios.yml | 8 +- .travis.yml | 2 +- Makefile.osx => Makefile.macos | 5 +- Makefile.macos-universal | 264 ++++++++++++++++++++++++++++++++ README.md | 27 ++-- 5 files changed, 291 insertions(+), 15 deletions(-) rename Makefile.osx => Makefile.macos (98%) create mode 100644 Makefile.macos-universal diff --git a/.github/workflows/macos-ios.yml b/.github/workflows/macos-ios.yml index 0886d5e..a62baa6 100644 --- a/.github/workflows/macos-ios.yml +++ b/.github/workflows/macos-ios.yml @@ -15,8 +15,12 @@ jobs: - uses: actions/checkout@v2 - name: deps run: brew install libsndfile vamp-plugin-sdk - - name: make macos - run: make -f Makefile.osx clean library program vamp + - name: make macos universal library + run: make -f Makefile.macos-universal clean library + - name: make macos native binaries + # (these depend on things installed from Homebrew, which I think + # doesn't install universal anything, so let's just make them native) + run: make -f Makefile.macos program vamp - name: make ios run: make -f Makefile.ios clean all diff --git a/.travis.yml b/.travis.yml index 95f4e40..11e4a96 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,5 +23,5 @@ before_install: - if [[ "$TRAVIS_OS_NAME" = "osx" ]] ; then brew update ; brew install libsndfile ; fi script: - - if [[ "$TRAVIS_OS_NAME" = "osx" ]] ; then make -f Makefile.osx && make -f Makefile.ios clean && make -f Makefile.ios ; else ./configure && make ; fi + - if [[ "$TRAVIS_OS_NAME" = "osx" ]] ; then make -f Makefile.macos && make -f Makefile.ios clean && make -f Makefile.ios ; else ./configure && make ; fi diff --git a/Makefile.osx b/Makefile.macos similarity index 98% rename from Makefile.osx rename to Makefile.macos index 234a8d9..0279574 100644 --- a/Makefile.osx +++ b/Makefile.macos @@ -2,8 +2,9 @@ PREFIX := /usr/local CXX := clang++ -stdlib=libc++ CC := clang -ARCHFLAGS := -arch x86_64 -mmacosx-version-min=10.7 -OPTFLAGS := -DNDEBUG -ffast-math -mfpmath=sse -msse -msse2 -O3 -ftree-vectorize + +ARCHFLAGS := -mmacosx-version-min=10.7 +OPTFLAGS := -DNDEBUG -ffast-math -O3 -ftree-vectorize CXXFLAGS := $(ARCHFLAGS) $(OPTFLAGS) -I. -Isrc -Irubberband -I/usr/local/include -DUSE_PTHREADS -DMALLOC_IS_ALIGNED -DHAVE_VDSP -DUSE_SPEEX -DNO_THREAD_CHECKS -DNO_TIMING diff --git a/Makefile.macos-universal b/Makefile.macos-universal new file mode 100644 index 0000000..719fc02 --- /dev/null +++ b/Makefile.macos-universal @@ -0,0 +1,264 @@ + +PREFIX := /usr/local +CXX := clang++ -stdlib=libc++ +CC := clang + +ARCHFLAGS := -arch arm64 -arch x86_64 -mmacosx-version-min=10.7 +OPTFLAGS := -DNDEBUG -ffast-math -O3 + +CXXFLAGS := $(ARCHFLAGS) $(OPTFLAGS) -I. -Isrc -Irubberband -I/usr/local/include -DUSE_PTHREADS -DMALLOC_IS_ALIGNED -DHAVE_VDSP -DUSE_SPEEX -DNO_THREAD_CHECKS -DNO_TIMING + +CFLAGS := $(ARCHFLAGS) $(OPTFLAGS) +LDFLAGS := $(ARCHFLAGS) -lpthread $(LDFLAGS) + +LIBRARY_LIBS := -framework Accelerate +PROGRAM_LIBS := -L$(PREFIX)/lib -lsndfile $(LIBRARY_LIBS) +VAMP_PLUGIN_LIBS := -L$(PREFIX)/lib -lvamp-sdk $(LIBRARY_LIBS) +LADSPA_PLUGIN_LIBS := $(LIBRARY_LIBS) + +MKDIR := mkdir +AR := ar + +INSTALL_BINDIR := $(PREFIX)/bin +INSTALL_INCDIR := $(PREFIX)/include/rubberband +INSTALL_LIBDIR := $(PREFIX)/lib +INSTALL_VAMPDIR := $(PREFIX)/lib/vamp +INSTALL_LADSPADIR := $(PREFIX)/lib/ladspa +INSTALL_LRDFDIR := $(PREFIX)/share/ladspa/rdf +INSTALL_PKGDIR := $(PREFIX)/lib/pkgconfig + +LIBNAME := librubberband + +DYNAMIC_EXTENSION := .dylib +DYNAMIC_FULL_VERSION := 2.1.2 +DYNAMIC_ABI_VERSION := 2 +DYNAMIC_LDFLAGS := -dynamiclib -install_name $(INSTALL_LIBDIR)/$(LIBNAME).$(DYNAMIC_ABI_VERSION)$(DYNAMIC_EXTENSION) -current_version $(DYNAMIC_FULL_VERSION) -compatibility_version $(DYNAMIC_ABI_VERSION) +VAMP_LDFLAGS := -dynamiclib -install_name vamp-rubberband.dylib -exported_symbols_list vamp/vamp-plugin.list +LADSPA_LDFLAGS := -dynamiclib -install_name ladspa-rubberband.dylib -exported_symbols_list ladspa/ladspa-plugin.list + +PROGRAM_TARGET := bin/rubberband +STATIC_TARGET := lib/$(LIBNAME).a +DYNAMIC_TARGET := lib/$(LIBNAME)$(DYNAMIC_EXTENSION) +VAMP_TARGET := lib/vamp-rubberband$(DYNAMIC_EXTENSION) +LADSPA_TARGET := lib/ladspa-rubberband$(DYNAMIC_EXTENSION) + +default: bin lib $(STATIC_TARGET) $(DYNAMIC_TARGET) $(PROGRAM_TARGET) + +all: bin lib $(STATIC_TARGET) $(DYNAMIC_TARGET) $(PROGRAM_TARGET) $(VAMP_TARGET) $(LADSPA_TARGET) + +static: lib $(STATIC_TARGET) +dynamic: lib $(DYNAMIC_TARGET) +library: static dynamic +program: bin $(PROGRAM_TARGET) +vamp: lib $(VAMP_TARGET) +ladspa: lib $(LADSPA_TARGET) + +PUBLIC_INCLUDES := \ + rubberband/rubberband-c.h \ + rubberband/RubberBandStretcher.h + +LIBRARY_INCLUDES := \ + src/StretcherChannelData.h \ + src/float_cast/float_cast.h \ + src/StretcherImpl.h \ + src/StretchCalculator.h \ + src/base/Profiler.h \ + src/base/RingBuffer.h \ + src/base/Scavenger.h \ + src/dsp/AudioCurveCalculator.h \ + src/audiocurves/CompoundAudioCurve.h \ + src/audiocurves/ConstantAudioCurve.h \ + src/audiocurves/HighFrequencyAudioCurve.h \ + src/audiocurves/PercussiveAudioCurve.h \ + src/audiocurves/SilentAudioCurve.h \ + src/audiocurves/SpectralDifferenceAudioCurve.h \ + src/dsp/Resampler.h \ + src/dsp/FFT.h \ + src/dsp/MovingMedian.h \ + src/dsp/SincWindow.h \ + src/dsp/Window.h \ + src/system/Allocators.h \ + src/system/Thread.h \ + src/system/VectorOps.h \ + src/system/VectorOpsComplex.h \ + src/system/sysutils.h + +LIBRARY_SOURCES := \ + src/rubberband-c.cpp \ + src/RubberBandStretcher.cpp \ + src/StretcherProcess.cpp \ + src/StretchCalculator.cpp \ + src/base/Profiler.cpp \ + src/dsp/AudioCurveCalculator.cpp \ + src/audiocurves/CompoundAudioCurve.cpp \ + src/audiocurves/SpectralDifferenceAudioCurve.cpp \ + src/audiocurves/HighFrequencyAudioCurve.cpp \ + src/audiocurves/SilentAudioCurve.cpp \ + src/audiocurves/ConstantAudioCurve.cpp \ + src/audiocurves/PercussiveAudioCurve.cpp \ + src/dsp/Resampler.cpp \ + src/dsp/FFT.cpp \ + src/system/Allocators.cpp \ + src/system/sysutils.cpp \ + src/system/Thread.cpp \ + src/system/VectorOpsComplex.cpp \ + src/StretcherChannelData.cpp \ + src/StretcherImpl.cpp + +# For Speex resampler -- comment these lines out if not specifying USE_SPEEX +LIBRARY_INCLUDES := $(LIBRARY_INCLUDES) \ + src/speex/speex_resampler.h +LIBRARY_SOURCES := $(LIBRARY_SOURCES) \ + src/speex/resample.c + +PROGRAM_SOURCES := \ + main/main.cpp + +VAMP_HEADERS := \ + vamp/RubberBandVampPlugin.h + +VAMP_SOURCES := \ + vamp/RubberBandVampPlugin.cpp \ + vamp/libmain.cpp + +LADSPA_HEADERS := \ + ladspa/RubberBandPitchShifter.h + +LADSPA_SOURCES := \ + ladspa/RubberBandPitchShifter.cpp \ + ladspa/libmain.cpp + +LIBRARY_OBJECTS := $(LIBRARY_SOURCES:.cpp=.o) +LIBRARY_OBJECTS := $(LIBRARY_OBJECTS:.c=.o) + +PROGRAM_OBJECTS := $(PROGRAM_SOURCES:.cpp=.o) +VAMP_OBJECTS := $(VAMP_SOURCES:.cpp=.o) +LADSPA_OBJECTS := $(LADSPA_SOURCES:.cpp=.o) + +$(PROGRAM_TARGET): $(LIBRARY_OBJECTS) $(PROGRAM_OBJECTS) + $(CXX) -o $@ $^ $(PROGRAM_LIBS) $(LDFLAGS) + +$(STATIC_TARGET): $(LIBRARY_OBJECTS) + rm -f $@ + $(AR) rsc $@ $^ + +$(DYNAMIC_TARGET): $(LIBRARY_OBJECTS) + $(CXX) $(DYNAMIC_LDFLAGS) $^ -o $@ $(LIBRARY_LIBS) $(LDFLAGS) + +$(VAMP_TARGET): $(LIBRARY_OBJECTS) $(VAMP_OBJECTS) + $(CXX) $(VAMP_LDFLAGS) -o $@ $^ $(VAMP_PLUGIN_LIBS) $(LDFLAGS) + +$(LADSPA_TARGET): $(LIBRARY_OBJECTS) $(LADSPA_OBJECTS) + $(CXX) $(LADSPA_LDFLAGS) -o $@ $^ $(LADSPA_PLUGIN_LIBS) $(LDFLAGS) + +bin: + $(MKDIR) $@ +lib: + $(MKDIR) $@ + +install: default + $(MKDIR) -p $(DESTDIR)$(INSTALL_BINDIR) + $(MKDIR) -p $(DESTDIR)$(INSTALL_INCDIR) + $(MKDIR) -p $(DESTDIR)$(INSTALL_LIBDIR) + $(MKDIR) -p $(DESTDIR)$(INSTALL_VAMPDIR) + $(MKDIR) -p $(DESTDIR)$(INSTALL_LADSPADIR) + $(MKDIR) -p $(DESTDIR)$(INSTALL_LRDFDIR) + $(MKDIR) -p $(DESTDIR)$(INSTALL_PKGDIR) + cp $(PROGRAM_TARGET) $(DESTDIR)$(INSTALL_BINDIR) + cp $(PUBLIC_INCLUDES) $(DESTDIR)$(INSTALL_INCDIR) + cp $(STATIC_TARGET) $(DESTDIR)$(INSTALL_LIBDIR) + rm -f $(DESTDIR)$(INSTALL_LIBDIR)/$(LIBNAME).$(DYNAMIC_ABI_VERSION)$(DYNAMIC_EXTENSION) + rm -f $(DESTDIR)$(INSTALL_LIBDIR)/$(LIBNAME)$(DYNAMIC_EXTENSION) + cp $(DYNAMIC_TARGET) $(DESTDIR)$(INSTALL_LIBDIR)/$(LIBNAME).$(DYNAMIC_FULL_VERSION)$(DYNAMIC_EXTENSION) + ln -s $(LIBNAME).$(DYNAMIC_FULL_VERSION)$(DYNAMIC_EXTENSION) $(DESTDIR)$(INSTALL_LIBDIR)/$(LIBNAME).$(DYNAMIC_ABI_VERSION)$(DYNAMIC_EXTENSION) + ln -s $(LIBNAME).$(DYNAMIC_FULL_VERSION)$(DYNAMIC_EXTENSION) $(DESTDIR)$(INSTALL_LIBDIR)/$(LIBNAME)$(DYNAMIC_EXTENSION) + cp $(VAMP_TARGET) $(DESTDIR)$(INSTALL_VAMPDIR) + cp vamp/vamp-rubberband.cat $(DESTDIR)$(INSTALL_VAMPDIR) + cp $(LADSPA_TARGET) $(DESTDIR)$(INSTALL_LADSPADIR) + cp ladspa/ladspa-rubberband.cat $(DESTDIR)$(INSTALL_LADSPADIR) + cp ladspa/ladspa-rubberband.rdf $(DESTDIR)$(INSTALL_LRDFDIR) + sed "s,%PREFIX%,$(PREFIX)," rubberband.pc.in \ + > $(DESTDIR)$(INSTALL_PKGDIR)/rubberband.pc + +clean: + rm -f $(LIBRARY_OBJECTS) $(PROGRAM_OBJECTS) $(LADSPA_OBJECTS) $(VAMP_OBJECTS) + +distclean: clean + rm -f $(PROGRAM_TARGET) $(STATIC_TARGET) $(DYNAMIC_TARGET) $(VAMP_TARGET) $(LADSPA_TARGET) + +depend: + makedepend -f Makefile.osx -Y $(LIBRARY_SOURCES) $(PROGRAM_SOURCES) + + +# DO NOT DELETE + +src/rubberband-c.o: rubberband/rubberband-c.h +src/rubberband-c.o: rubberband/RubberBandStretcher.h +src/RubberBandStretcher.o: src/StretcherImpl.h +src/RubberBandStretcher.o: rubberband/RubberBandStretcher.h src/dsp/Window.h +src/RubberBandStretcher.o: src/dsp/FFT.h src/base/RingBuffer.h +src/RubberBandStretcher.o: src/base/Scavenger.h src/system/Thread.h +src/RubberBandStretcher.o: src/system/Thread.h src/system/sysutils.h +src/StretcherProcess.o: src/StretcherImpl.h rubberband/RubberBandStretcher.h +src/StretcherProcess.o: src/dsp/Window.h src/dsp/FFT.h src/base/RingBuffer.h +src/StretcherProcess.o: src/base/Scavenger.h src/system/Thread.h +src/StretcherProcess.o: src/system/Thread.h src/system/sysutils.h +src/StretcherProcess.o: src/audiocurves/PercussiveAudioCurve.h +src/StretcherProcess.o: src/dsp/AudioCurveCalculator.h +src/StretcherProcess.o: src/audiocurves/HighFrequencyAudioCurve.h +src/StretcherProcess.o: src/audiocurves/ConstantAudioCurve.h src/StretchCalculator.h +src/StretcherProcess.o: src/StretcherChannelData.h src/dsp/Resampler.h +src/StretcherProcess.o: src/base/Profiler.h src/system/VectorOps.h +src/StretcherProcess.o: src/system/sysutils.h +src/StretchCalculator.o: src/StretchCalculator.h src/system/sysutils.h +src/system/Thread.o: src/system/Thread.h +src/base/Profiler.o: src/base/Profiler.h src/system/sysutils.h +src/dsp/AudioCurveCalculator.o: src/dsp/AudioCurveCalculator.h +src/dsp/AudioCurveCalculator.o: src/system/sysutils.h +src/audiocurves/SpectralDifferenceAudioCurve.o: src/audiocurves/SpectralDifferenceAudioCurve.h +src/audiocurves/SpectralDifferenceAudioCurve.o: src/dsp/AudioCurveCalculator.h +src/audiocurves/SpectralDifferenceAudioCurve.o: src/system/sysutils.h +src/audiocurves/SpectralDifferenceAudioCurve.o: src/dsp/Window.h +src/audiocurves/SpectralDifferenceAudioCurve.o: src/system/VectorOps.h +src/audiocurves/SpectralDifferenceAudioCurve.o: src/system/sysutils.h +src/audiocurves/HighFrequencyAudioCurve.o: src/audiocurves/HighFrequencyAudioCurve.h +src/audiocurves/HighFrequencyAudioCurve.o: src/dsp/AudioCurveCalculator.h +src/audiocurves/HighFrequencyAudioCurve.o: src/system/sysutils.h +src/audiocurves/SilentAudioCurve.o: src/audiocurves/SilentAudioCurve.h +src/audiocurves/SilentAudioCurve.o: src/dsp/AudioCurveCalculator.h +src/audiocurves/SilentAudioCurve.o: src/system/sysutils.h +src/audiocurves/ConstantAudioCurve.o: src/audiocurves/ConstantAudioCurve.h +src/audiocurves/ConstantAudioCurve.o: src/dsp/AudioCurveCalculator.h +src/audiocurves/ConstantAudioCurve.o: src/system/sysutils.h +src/audiocurves/PercussiveAudioCurve.o: src/audiocurves/PercussiveAudioCurve.h +src/audiocurves/PercussiveAudioCurve.o: src/dsp/AudioCurveCalculator.h +src/audiocurves/PercussiveAudioCurve.o: src/system/sysutils.h src/system/VectorOps.h +src/audiocurves/PercussiveAudioCurve.o: src/system/sysutils.h +src/dsp/Resampler.o: src/dsp/Resampler.h src/system/sysutils.h +src/dsp/Resampler.o: src/base/Profiler.h +src/dsp/FFT.o: src/dsp/FFT.h src/system/sysutils.h src/system/Thread.h +src/dsp/FFT.o: src/base/Profiler.h src/system/VectorOps.h +src/dsp/FFT.o: src/system/sysutils.h +src/system/Allocators.o: src/system/Allocators.h src/system/VectorOps.h +src/system/Allocators.o: src/system/sysutils.h +src/system/sysutils.o: src/system/sysutils.h +src/StretcherChannelData.o: src/StretcherChannelData.h src/StretcherImpl.h +src/StretcherChannelData.o: rubberband/RubberBandStretcher.h src/dsp/Window.h +src/StretcherChannelData.o: src/dsp/FFT.h src/base/RingBuffer.h +src/StretcherChannelData.o: src/base/Scavenger.h src/system/Thread.h +src/StretcherChannelData.o: src/system/Thread.h src/system/sysutils.h +src/StretcherChannelData.o: src/dsp/Resampler.h src/system/Allocators.h +src/StretcherChannelData.o: src/system/VectorOps.h src/system/sysutils.h +src/StretcherImpl.o: src/StretcherImpl.h rubberband/RubberBandStretcher.h +src/StretcherImpl.o: src/dsp/Window.h src/dsp/FFT.h src/base/RingBuffer.h +src/StretcherImpl.o: src/base/Scavenger.h src/system/Thread.h src/system/Thread.h +src/StretcherImpl.o: src/system/sysutils.h src/audiocurves/PercussiveAudioCurve.h +src/StretcherImpl.o: src/dsp/AudioCurveCalculator.h +src/StretcherImpl.o: src/audiocurves/HighFrequencyAudioCurve.h +src/StretcherImpl.o: src/audiocurves/SpectralDifferenceAudioCurve.h src/dsp/Window.h +src/StretcherImpl.o: src/system/VectorOps.h src/system/sysutils.h +src/StretcherImpl.o: src/audiocurves/SilentAudioCurve.h src/audiocurves/ConstantAudioCurve.h +src/StretcherImpl.o: src/dsp/Resampler.h src/StretchCalculator.h +src/StretcherImpl.o: src/StretcherChannelData.h src/base/Profiler.h +main/main.o: rubberband/RubberBandStretcher.h src/system/sysutils.h +main/main.o: src/base/Profiler.h diff --git a/README.md b/README.md index 76d4ea2..8552a8b 100644 --- a/README.md +++ b/README.md @@ -272,16 +272,23 @@ The default target is "all". ### 4d. Building on macOS -A Makefile for macOS is provided as `Makefile.osx`. +Two Makefiles for macOS are provided, as `Makefile.macos` and +`Makefile.macos-universal`. `Makefile.macos` will build for your +native machine architecture; `Makefile.macos-universal` will build a +universal binary with both x86_64 and arm64 slices. The latter +requires macOS 11+, although the resulting binaries should work with +macOS 10.7 or newer if all the dependent libraries are also built +appropriately. You will also need the Xcode command-line tools +installed. -Adjust the Makefile according to your preference for compiler and -platform SDK, FFT and resampler implementations. The default is to -use the Accelerate framework and the Speex resampler. Then run -e.g. `make -f Makefile.osx library` in a terminal window to build. -You will need the Xcode command-line tools installed. +Adjust your selected Makefile according to your preference for +compiler and platform SDK, FFT and resampler implementations. The +default is to use the Accelerate framework and the Speex resampler. +Then run e.g. `make -f Makefile.macos library` in a terminal window to +build. (You probably don't want to use the configure script on macOS -- just -use `Makefile.osx` directly.) +use your preferred Makefile directly.) The following Makefile targets are available: @@ -311,9 +318,9 @@ commercial terms. ### 4e. Building for iOS -A Makefile for iOS is provided as `Makefile.ios`. It produces a -single static library containing both simulator and device binaries, -in both 32- and 64-bit architectures. +A Makefile for iOS (compiling on macOS) is provided as `Makefile.ios`. +It produces a single static library containing both simulator and +device binaries, in both 32- and 64-bit architectures. Run e.g. `make -f Makefile.ios` in a terminal window to build. You will need the Xcode command-line tools installed.