You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

plugin.mk 2.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. ifndef RACK_DIR
  2. $(error RACK_DIR is not defined)
  3. endif
  4. SLUG := $(shell jq -r .slug plugin.json)
  5. VERSION := $(shell jq -r .version plugin.json)
  6. ifndef SLUG
  7. $(error SLUG could not be found in manifest)
  8. endif
  9. ifndef VERSION
  10. $(error VERSION could not be found in manifest)
  11. endif
  12. DISTRIBUTABLES += plugin.json
  13. FLAGS += -fPIC
  14. FLAGS += -I$(RACK_DIR)/include -I$(RACK_DIR)/dep/include
  15. LDFLAGS += -shared
  16. # Plugins must link to libRack because when Rack is used as a plugin of another application, its symbols are not available to subsequently loaded shared libraries.
  17. LDFLAGS += -L$(RACK_DIR) -lRack
  18. include $(RACK_DIR)/arch.mk
  19. ifdef ARCH_LIN
  20. TARGET := plugin.so
  21. # This prevents static variables in the DSO (dynamic shared object) from being preserved after dlclose().
  22. # I don't really understand the side effects (see GCC manual), but so far tests are positive.
  23. FLAGS += -fno-gnu-unique
  24. LDFLAGS += -Wl,-rpath=.
  25. # Since the plugin's compiler could be a different version than Rack's compiler, link libstdc++ and libgcc statically to avoid ABI issues.
  26. LDFLAGS += -static-libstdc++ -static-libgcc
  27. RACK_USER_DIR ?= $(HOME)/.Rack2
  28. endif
  29. ifdef ARCH_MAC
  30. TARGET := plugin.dylib
  31. LDFLAGS += -undefined dynamic_lookup
  32. RACK_USER_DIR ?= $(HOME)/Documents/Rack2
  33. endif
  34. ifdef ARCH_WIN
  35. TARGET := plugin.dll
  36. LDFLAGS += -static-libstdc++
  37. RACK_USER_DIR ?= $(USERPROFILE)/Documents/Rack2
  38. endif
  39. DEP_FLAGS += -fPIC
  40. include $(RACK_DIR)/dep.mk
  41. all: $(TARGET)
  42. include $(RACK_DIR)/compile.mk
  43. clean:
  44. rm -rfv build $(TARGET) dist
  45. ZSTD_COMPRESSION_LEVEL ?= 19
  46. dist: all
  47. rm -rf dist
  48. mkdir -p dist/$(SLUG)
  49. @# Strip and copy plugin binary
  50. cp $(TARGET) dist/$(SLUG)/
  51. ifdef ARCH_MAC
  52. $(STRIP) -S dist/$(SLUG)/$(TARGET)
  53. $(INSTALL_NAME_TOOL) -change libRack.dylib /tmp/Rack2/libRack.dylib dist/$(SLUG)/$(TARGET)
  54. $(OTOOL) -L dist/$(SLUG)/$(TARGET)
  55. endif
  56. ifdef ARCH_LIN
  57. $(STRIP) -s dist/$(SLUG)/$(TARGET)
  58. # TODO Change libRack.so path to /tmp/Rack2/libRack.dylib
  59. endif
  60. ifdef ARCH_WIN
  61. $(STRIP) -s dist/$(SLUG)/$(TARGET)
  62. endif
  63. @# Copy distributables
  64. ifdef ARCH_MAC
  65. rsync -rR $(DISTRIBUTABLES) dist/$(SLUG)/
  66. else
  67. cp -r --parents $(DISTRIBUTABLES) dist/$(SLUG)/
  68. endif
  69. @# Create ZIP package
  70. cd dist && tar -c $(SLUG) | zstd -$(ZSTD_COMPRESSION_LEVEL) -o "$(SLUG)"-"$(VERSION)"-$(ARCH_OS_NAME).vcvplugin
  71. install: dist
  72. mkdir -p "$(RACK_USER_DIR)"/plugins/
  73. cp dist/*.vcvplugin "$(RACK_USER_DIR)"/plugins/
  74. .PHONY: clean dist
  75. .DEFAULT_GOAL := all