| @@ -145,154 +145,162 @@ valgrind: $(STANDALONE_TARGET) | |||
| clean: | |||
| rm -rfv build dist $(TARGET) $(STANDALONE_TARGET) *.a | |||
| # For Windows resources | |||
| # Windows resources | |||
| build/%.res: %.rc | |||
| ifdef ARCH_WIN | |||
| windres $^ -O coff -o $@ | |||
| endif | |||
| DIST_RES := res cacert.pem Core.json template.vcv LICENSE-GPLv3.txt | |||
| # Plugin helper | |||
| plugins: | |||
| ifdef CMD | |||
| for f in plugins/*; do (cd "$$f" && $(CMD)); done | |||
| else | |||
| for f in plugins/*; do $(MAKE) -C "$$f"; done | |||
| endif | |||
| # The following targets are not supported for public use | |||
| DIST_NAME := RackFree-$(VERSION)-$(ARCH_NAME) | |||
| DIST_SDK_DIR := Rack-SDK | |||
| DIST_SDK := Rack-SDK-$(VERSION)-$(ARCH_NAME).zip | |||
| ifdef ARCH_MAC | |||
| DIST_BUNDLE := VCV Rack $(VERSION_MAJOR) Free.app | |||
| DIST_BUNDLE := VCV\ Rack\ $(VERSION_MAJOR)\ Free.app | |||
| DIST_DIR := dist/$(DIST_BUNDLE) | |||
| else | |||
| DIST_DIR := Rack$(VERSION_MAJOR)Free | |||
| DIST_DIR := dist/Rack$(VERSION_MAJOR)Free | |||
| endif | |||
| DIST_MD := $(wildcard *.md) | |||
| DIST_HTML := $(patsubst %.md, build/%.html, $(DIST_MD)) | |||
| DIST_RES := res cacert.pem Core.json template.vcv LICENSE-GPLv3.txt $(DIST_HTML) | |||
| DIST_SDK_DIR := dist/Rack-SDK | |||
| DIST_SDK := dist/Rack-SDK-$(VERSION)-$(ARCH_NAME).zip | |||
| # Target not supported for public use | |||
| dist: $(TARGET) $(STANDALONE_TARGET) $(DIST_HTML) | cleandist | |||
| dist: $(DIST_DIR) | |||
| $(DIST_DIR): $(TARGET) $(STANDALONE_TARGET) $(DIST_HTML) | |||
| mkdir -p dist | |||
| # Copy Rack to dist | |||
| ifdef ARCH_LIN | |||
| mkdir -p dist/"$(DIST_DIR)" | |||
| cp $(TARGET) dist/"$(DIST_DIR)"/ | |||
| cp $(STANDALONE_TARGET) dist/"$(DIST_DIR)"/ | |||
| $(STRIP) -s dist/"$(DIST_DIR)"/$(TARGET) | |||
| $(STRIP) -s dist/"$(DIST_DIR)"/$(STANDALONE_TARGET) | |||
| mkdir -p $(DIST_DIR) | |||
| cp $(TARGET) $(DIST_DIR)/ | |||
| cp $(STANDALONE_TARGET) $(DIST_DIR)/ | |||
| $(STRIP) -s $(DIST_DIR)/$(TARGET) | |||
| $(STRIP) -s $(DIST_DIR)/$(STANDALONE_TARGET) | |||
| # Manually check that no nonstandard shared libraries are linked | |||
| ldd dist/"$(DIST_DIR)"/$(TARGET) | |||
| ldd dist/"$(DIST_DIR)"/$(STANDALONE_TARGET) | |||
| ldd $(DIST_DIR)/$(TARGET) | |||
| ldd $(DIST_DIR)/$(STANDALONE_TARGET) | |||
| # Copy resources | |||
| cp -R $(DIST_RES) dist/"$(DIST_DIR)"/ | |||
| cp $(DIST_HTML) dist/"$(DIST_DIR)"/ | |||
| cp plugins/Fundamental/dist/Fundamental-*.vcvplugin dist/"$(DIST_DIR)"/ | |||
| # Make ZIP | |||
| cd dist && zip -q -9 -r "$(DIST_NAME)".zip "$(DIST_DIR)" | |||
| cp -R $(DIST_RES) $(DIST_DIR)/ | |||
| cp plugins/Fundamental/dist/Fundamental-*.vcvplugin $(DIST_DIR)/ | |||
| endif | |||
| ifdef ARCH_MAC | |||
| mkdir -p dist/"$(DIST_BUNDLE)" | |||
| mkdir -p dist/"$(DIST_BUNDLE)"/Contents | |||
| mkdir -p dist/"$(DIST_BUNDLE)"/Contents/Resources | |||
| mkdir -p dist/"$(DIST_BUNDLE)"/Contents/MacOS | |||
| cp $(TARGET) dist/"$(DIST_BUNDLE)"/Contents/Resources/ | |||
| cp $(STANDALONE_TARGET) dist/"$(DIST_BUNDLE)"/Contents/MacOS/ | |||
| $(STRIP) -S dist/"$(DIST_BUNDLE)"/Contents/Resources/$(TARGET) | |||
| $(STRIP) -S dist/"$(DIST_BUNDLE)"/Contents/MacOS/$(STANDALONE_TARGET) | |||
| install_name_tool -change $(TARGET) @executable_path/../Resources/$(TARGET) dist/"$(DIST_BUNDLE)"/Contents/MacOS/$(STANDALONE_TARGET) | |||
| mkdir -p $(DIST_DIR) | |||
| mkdir -p $(DIST_DIR)/Contents | |||
| mkdir -p $(DIST_DIR)/Contents/Resources | |||
| mkdir -p $(DIST_DIR)/Contents/MacOS | |||
| cp $(TARGET) $(DIST_DIR)/Contents/Resources/ | |||
| cp $(STANDALONE_TARGET) $(DIST_DIR)/Contents/MacOS/ | |||
| $(STRIP) -S $(DIST_DIR)/Contents/Resources/$(TARGET) | |||
| $(STRIP) -S $(DIST_DIR)/Contents/MacOS/$(STANDALONE_TARGET) | |||
| install_name_tool -change $(TARGET) @executable_path/../Resources/$(TARGET) $(DIST_DIR)/Contents/MacOS/$(STANDALONE_TARGET) | |||
| # Manually check that no nonstandard shared libraries are linked | |||
| otool -L dist/"$(DIST_BUNDLE)"/Contents/Resources/$(TARGET) | |||
| otool -L dist/"$(DIST_BUNDLE)"/Contents/MacOS/$(STANDALONE_TARGET) | |||
| otool -L $(DIST_DIR)/Contents/Resources/$(TARGET) | |||
| otool -L $(DIST_DIR)/Contents/MacOS/$(STANDALONE_TARGET) | |||
| # Copy resources | |||
| cp Info.plist dist/"$(DIST_BUNDLE)"/Contents/ | |||
| $(SED) 's/{VERSION}/$(VERSION)/g' dist/"$(DIST_BUNDLE)"/Contents/Info.plist | |||
| cp -R $(DIST_RES) dist/"$(DIST_BUNDLE)"/Contents/Resources/ | |||
| cp $(DIST_HTML) dist/"$(DIST_BUNDLE)"/Contents/Resources/ | |||
| cp -R icon.icns dist/"$(DIST_BUNDLE)"/Contents/Resources/ | |||
| cp plugins/Fundamental/dist/Fundamental-*.vcvplugin dist/"$(DIST_BUNDLE)"/Contents/Resources/ | |||
| # Clean up and sign bundle | |||
| xattr -cr dist/"$(DIST_BUNDLE)" | |||
| codesign --verbose --sign "Developer ID Application: Andrew Belt (V8SW9J626X)" --options runtime --entitlements Entitlements.plist --timestamp --deep dist/"$(DIST_BUNDLE)"/Contents/Resources/$(TARGET) dist/"$(DIST_BUNDLE)" | |||
| codesign --verify --deep --strict --verbose=2 dist/"$(DIST_BUNDLE)" | |||
| # Make standalone PKG | |||
| mkdir -p dist/Component | |||
| cp -R dist/"$(DIST_BUNDLE)" dist/Component/ | |||
| pkgbuild --identifier com.vcvrack.rack --component-plist Component.plist --root dist/Component --install-location /Applications dist/Component.pkg | |||
| # Make PKG | |||
| productbuild --distribution Distribution.xml --package-path dist dist/"$(DIST_NAME)".pkg | |||
| productsign --sign "Developer ID Installer: Andrew Belt (V8SW9J626X)" dist/"$(DIST_NAME)".pkg dist/"$(DIST_NAME)"-signed.pkg | |||
| mv dist/"$(DIST_NAME)"-signed.pkg dist/"$(DIST_NAME)".pkg | |||
| cp Info.plist $(DIST_DIR)/Contents/ | |||
| $(SED) 's/{VERSION}/$(VERSION)/g' $(DIST_DIR)/Contents/Info.plist | |||
| cp -R icon.icns $(DIST_DIR)/Contents/Resources/ | |||
| cp -R $(DIST_RES) $(DIST_DIR)/Contents/Resources/ | |||
| cp plugins/Fundamental/dist/Fundamental-*.vcvplugin $(DIST_DIR)/Contents/Resources/ | |||
| endif | |||
| ifdef ARCH_WIN | |||
| mkdir -p dist/"$(DIST_DIR)" | |||
| cp $(TARGET) dist/"$(DIST_DIR)"/ | |||
| cp $(STANDALONE_TARGET) dist/"$(DIST_DIR)"/ | |||
| $(STRIP) -s dist/"$(DIST_DIR)"/$(TARGET) | |||
| $(STRIP) -s dist/"$(DIST_DIR)"/$(STANDALONE_TARGET) | |||
| mkdir -p $(DIST_DIR) | |||
| cp $(TARGET) $(DIST_DIR)/ | |||
| cp $(STANDALONE_TARGET) $(DIST_DIR)/ | |||
| $(STRIP) -s $(DIST_DIR)/$(TARGET) | |||
| $(STRIP) -s $(DIST_DIR)/$(STANDALONE_TARGET) | |||
| # Copy resources | |||
| cp -R $(DIST_RES) dist/"$(DIST_DIR)"/ | |||
| cp $(DIST_HTML) dist/"$(DIST_DIR)"/ | |||
| cp /mingw64/bin/libwinpthread-1.dll dist/"$(DIST_DIR)"/ | |||
| cp /mingw64/bin/libstdc++-6.dll dist/"$(DIST_DIR)"/ | |||
| cp /mingw64/bin/libgcc_s_seh-1.dll dist/"$(DIST_DIR)"/ | |||
| cp plugins/Fundamental/dist/Fundamental-*.vcvplugin dist/"$(DIST_DIR)"/ | |||
| # Make NSIS installer | |||
| # pacman -S mingw-w64-x86_64-nsis | |||
| makensis -DVERSION_MAJOR="$(VERSION_MAJOR)" -DVERSION="$(VERSION)" "-XOutFile dist/$(DIST_NAME).exe" installer.nsi | |||
| cp -R $(DIST_RES) $(DIST_DIR)/ | |||
| cp /mingw64/bin/libwinpthread-1.dll $(DIST_DIR)/ | |||
| cp /mingw64/bin/libstdc++-6.dll $(DIST_DIR)/ | |||
| cp /mingw64/bin/libgcc_s_seh-1.dll $(DIST_DIR)/ | |||
| cp plugins/Fundamental/dist/Fundamental-*.vcvplugin $(DIST_DIR)/ | |||
| endif | |||
| # Build Rack SDK | |||
| mkdir -p dist/"$(DIST_SDK_DIR)" | |||
| cp -R LICENSE* *.mk include helper.py dist/"$(DIST_SDK_DIR)"/ | |||
| mkdir -p dist/"$(DIST_SDK_DIR)"/dep/ | |||
| cp -R dep/include dist/"$(DIST_SDK_DIR)"/dep/ | |||
| sdk: $(DIST_SDK_DIR) | |||
| $(DIST_SDK_DIR): $(DIST_HTML) | |||
| mkdir -p $(DIST_SDK_DIR) | |||
| cp -R include *.mk helper.py $(DIST_HTML) $(DIST_SDK_DIR)/ | |||
| mkdir -p $(DIST_SDK_DIR)/dep | |||
| cp -R dep/include $(DIST_SDK_DIR)/dep/ | |||
| ifdef ARCH_LIN | |||
| cp $(TARGET) dist/"$(DIST_SDK_DIR)"/ | |||
| $(STRIP) -s dist/"$(DIST_SDK_DIR)"/$(TARGET) | |||
| cp $(TARGET) $(DIST_SDK_DIR)/ | |||
| $(STRIP) -s $(DIST_SDK_DIR)/$(TARGET) | |||
| endif | |||
| ifdef ARCH_MAC | |||
| cp $(TARGET) dist/"$(DIST_SDK_DIR)"/ | |||
| $(STRIP) -S dist/"$(DIST_SDK_DIR)"/$(TARGET) | |||
| cp $(TARGET) $(DIST_SDK_DIR)/ | |||
| $(STRIP) -S $(DIST_SDK_DIR)/$(TARGET) | |||
| endif | |||
| ifdef ARCH_WIN | |||
| cp libRack.dll.a dist/"$(DIST_SDK_DIR)"/ | |||
| cp $(TARGET).a $(DIST_SDK_DIR)/ | |||
| endif | |||
| cd dist && zip -q -9 -r "$(DIST_SDK)" "$(DIST_SDK_DIR)" | |||
| install: dist | |||
| ifdef ARCH_MAC | |||
| sudo installer -pkg dist/"$(DIST_NAME)".pkg -target / | |||
| package: $(DIST_DIR) $(DIST_SDK_DIR) | |||
| ifdef ARCH_LIN | |||
| # Make ZIP | |||
| cd dist && zip -q -9 -r ../$(DIST_NAME).zip $(notdir $(DIST_DIR)) | |||
| endif | |||
| uninstall: | |||
| ifdef ARCH_MAC | |||
| sudo rm -rf /Applications/"$(DIST_BUNDLE)" | |||
| # Clean up and sign bundle | |||
| xattr -cr $(DIST_DIR) | |||
| codesign --verbose --sign "Developer ID Application: Andrew Belt (V8SW9J626X)" --options runtime --entitlements Entitlements.plist --timestamp --deep $(DIST_DIR)/Contents/Resources/$(TARGET) $(DIST_DIR) | |||
| codesign --verify --deep --strict --verbose=2 $(DIST_DIR) | |||
| # Make standalone PKG | |||
| mkdir -p dist/Component | |||
| cp -R $(DIST_DIR) dist/Component/ | |||
| pkgbuild --identifier com.vcvrack.rack --component-plist Component.plist --root dist/Component --install-location /Applications dist/Component.pkg | |||
| # Make PKG | |||
| productbuild --distribution Distribution.xml --package-path dist dist/$(DIST_NAME).pkg | |||
| productsign --sign "Developer ID Installer: Andrew Belt (V8SW9J626X)" dist/$(DIST_NAME).pkg dist/$(DIST_NAME)-signed.pkg | |||
| mv dist/$(DIST_NAME)-signed.pkg dist/$(DIST_NAME).pkg | |||
| endif | |||
| ifdef ARCH_WIN | |||
| # Make NSIS installer | |||
| # pacman -S mingw-w64-x86_64-nsis | |||
| makensis -DVERSION_MAJOR=$(VERSION_MAJOR) -DVERSION=$(VERSION) "-XOutFile dist/$(DIST_NAME).exe" installer.nsi | |||
| endif | |||
| # SDK | |||
| cd dist && zip -q -9 -r ../$(DIST_SDK) $(notdir $(DIST_SDK_DIR)) | |||
| # Target not supported for public use | |||
| notarize: | |||
| ifdef ARCH_MAC | |||
| # Submit installer package to Apple | |||
| xcrun notarytool submit --keychain-profile "VCV" --wait dist/"$(DIST_NAME)".pkg | |||
| xcrun notarytool submit --keychain-profile "VCV" --wait dist/$(DIST_NAME).pkg | |||
| # Mark app as notarized | |||
| xcrun stapler staple dist/"$(DIST_NAME)".pkg | |||
| xcrun stapler staple dist/$(DIST_NAME).pkg | |||
| # Check notarization | |||
| stapler validate dist/"$(DIST_NAME)".pkg | |||
| stapler validate dist/$(DIST_NAME).pkg | |||
| endif | |||
| cleandist: | |||
| rm -rfv dist | |||
| install: dist | |||
| ifdef ARCH_MAC | |||
| sudo installer -pkg dist/$(DIST_NAME).pkg -target / | |||
| endif | |||
| # Plugin helpers | |||
| plugins: | |||
| ifdef CMD | |||
| for f in plugins/*; do (cd "$$f" && $(CMD)); done | |||
| else | |||
| for f in plugins/*; do $(MAKE) -C "$$f"; done | |||
| uninstall: | |||
| ifdef ARCH_MAC | |||
| sudo rm -rf /Applications/$(DIST_BUNDLE) | |||
| endif | |||
| # Includes | |||
| cleandist: | |||
| rm -rfv dist | |||
| .DEFAULT_GOAL := all | |||
| .PHONY: all dep run debug clean dist upload src plugins | |||