#!/usr/bin/make -f # Makefile for DPF # # ---------------- # # Created by falkTX # # Before including this file, a few variables can be set in order to tweak build behaviour: # DEBUG=true # Building in debug mode # Implies SKIP_STRIPPING=true as well # NOOPT=true # Do not automatically set optimization flags # SKIP_STRIPPING=true # Do not strip output binaries # NVG_DISABLE_SKIPPING_WHITESPACE=true # Tweak `nvgTextBreakLines` to allow space characters # FIXME proper details # NVG_FONT_TEXTURE_FLAGS= # WINDOWS_ICON_ID= # USE_NANOVG_FBO=false # USE_NANOVG_FREETYPE=false # USE_FILE_BROWSER=true # USE_GLES2=false # USE_GLES3=false # USE_WEB_VIEW=false # STATIC_BUILD=true # Tweak build to be able to generate fully static builds (e.g. skip use of libdl) # Experimental, use only if you know what you are doing # FORCE_NATIVE_AUDIO_FALLBACK=true # Do not use JACK for the standalone, only native audio # SKIP_NATIVE_AUDIO_FALLBACK=true # Do not use native audio for the standalone, only use JACK # --------------------------------------------------------------------------------------------------------------------- # Read target compiler from environment AR ?= ar CC ?= gcc CXX ?= g++ # --------------------------------------------------------------------------------------------------------------------- # Protect against multiple inclusion ifneq ($(DPF_MAKEFILE_BASE_INCLUDED),true) DPF_MAKEFILE_BASE_INCLUDED = true # --------------------------------------------------------------------------------------------------------------------- # Auto-detect target compiler if not defined ifneq ($(shell echo -e escaped-by-default | grep -- '-e escaped-by-default'),-e escaped-by-default) TARGET_COMPILER = $(shell echo -e '#ifdef __clang__\nclang\n#else\ngcc\n#endif' | $(CC) -E -P -x c - 2>/dev/null) else ifeq ($(shell echo '\#escaped-by-default' | grep -- '\#escaped-by-default'),\#escaped-by-default) TARGET_COMPILER = $(shell echo '\#ifdef __clang__\nclang\n\#else\ngcc\n\#endif' | $(CC) -E -P -x c - 2>/dev/null) else TARGET_COMPILER = $(shell echo '#ifdef __clang__\nclang\n#else\ngcc\n#endif' | $(CC) -E -P -x c - 2>/dev/null) endif ifneq ($(CLANG),true) ifneq ($(GCC),true) ifneq (,$(findstring clang,$(TARGET_COMPILER))) CLANG = true else GCC = true endif endif endif # --------------------------------------------------------------------------------------------------------------------- # Auto-detect target OS if not defined TARGET_MACHINE := $(shell $(CC) -dumpmachine) ifneq ($(BSD),true) ifneq ($(HAIKU),true) ifneq ($(HURD),true) ifneq ($(LINUX),true) ifneq ($(MACOS),true) ifneq ($(WASM),true) ifneq ($(WINDOWS),true) ifneq (,$(findstring bsd,$(TARGET_MACHINE))) BSD = true else ifneq (,$(findstring haiku,$(TARGET_MACHINE))) HAIKU = true else ifneq (,$(findstring linux,$(TARGET_MACHINE))) LINUX = true else ifneq (,$(findstring gnu,$(TARGET_MACHINE))) HURD = true else ifneq (,$(findstring apple,$(TARGET_MACHINE))) MACOS = true else ifneq (,$(findstring mingw,$(TARGET_MACHINE))) WINDOWS = true else ifneq (,$(findstring msys,$(TARGET_MACHINE))) WINDOWS = true else ifneq (,$(findstring wasm,$(TARGET_MACHINE))) WASM = true else ifneq (,$(findstring windows,$(TARGET_MACHINE))) WINDOWS = true endif endif # WINDOWS endif # WASM endif # MACOS endif # LINUX endif # HURD endif # HAIKU endif # BSD # --------------------------------------------------------------------------------------------------------------------- # Auto-detect target processor TARGET_PROCESSOR := $(firstword $(subst -, ,$(TARGET_MACHINE))) ifneq (,$(filter i%86,$(TARGET_PROCESSOR))) CPU_I386 = true CPU_I386_OR_X86_64 = true endif ifneq (,$(filter wasm32,$(TARGET_PROCESSOR))) CPU_I386 = true CPU_I386_OR_X86_64 = true endif ifneq (,$(filter x86_64,$(TARGET_PROCESSOR))) CPU_X86_64 = true CPU_I386_OR_X86_64 = true endif ifneq (,$(filter arm%,$(TARGET_PROCESSOR))) CPU_ARM = true CPU_ARM_OR_ARM64 = true endif ifneq (,$(filter arm64%,$(TARGET_PROCESSOR))) CPU_ARM64 = true CPU_ARM_OR_ARM64 = true endif ifneq (,$(filter aarch64%,$(TARGET_PROCESSOR))) CPU_ARM64 = true CPU_ARM_OR_ARM64 = true endif ifneq (,$(filter riscv64%,$(TARGET_PROCESSOR))) CPU_RISCV64 = true endif ifeq ($(CPU_ARM),true) ifneq ($(CPU_ARM64),true) CPU_ARM32 = true endif endif # --------------------------------------------------------------------------------------------------------------------- # Set PKG_CONFIG (can be overridden by environment variable) ifeq ($(WASM),true) # Skip on wasm by default PKG_CONFIG ?= false else ifeq ($(WINDOWS),true) # Build statically on Windows by default PKG_CONFIG ?= pkg-config --static else PKG_CONFIG ?= pkg-config endif # --------------------------------------------------------------------------------------------------------------------- # Set cross compiling flag ifeq ($(WASM),true) CROSS_COMPILING = true endif # --------------------------------------------------------------------------------------------------------------------- # Set LINUX_OR_MACOS ifeq ($(LINUX),true) LINUX_OR_MACOS = true endif ifeq ($(MACOS),true) LINUX_OR_MACOS = true endif # --------------------------------------------------------------------------------------------------------------------- # Set MACOS_OR_WINDOWS, MACOS_OR_WASM_OR_WINDOWS, HAIKU_OR_MACOS_OR_WINDOWS and HAIKU_OR_MACOS_OR_WASM_OR_WINDOWS ifeq ($(HAIKU),true) HAIKU_OR_MACOS_OR_WASM_OR_WINDOWS = true HAIKU_OR_MACOS_OR_WINDOWS = true endif ifeq ($(MACOS),true) HAIKU_OR_MACOS_OR_WASM_OR_WINDOWS = true HAIKU_OR_MACOS_OR_WINDOWS = true MACOS_OR_WASM_OR_WINDOWS = true MACOS_OR_WINDOWS = true endif ifeq ($(WASM),true) HAIKU_OR_MACOS_OR_WASM_OR_WINDOWS = true MACOS_OR_WASM_OR_WINDOWS = true endif ifeq ($(WINDOWS),true) HAIKU_OR_MACOS_OR_WASM_OR_WINDOWS = true HAIKU_OR_MACOS_OR_WINDOWS = true MACOS_OR_WASM_OR_WINDOWS = true MACOS_OR_WINDOWS = true endif # --------------------------------------------------------------------------------------------------------------------- # Set UNIX ifeq ($(BSD),true) UNIX = true endif ifeq ($(HURD),true) UNIX = true endif ifeq ($(LINUX),true) UNIX = true endif ifeq ($(MACOS),true) UNIX = true endif # --------------------------------------------------------------------------------------------------------------------- # Compatibility checks ifeq ($(FILE_BROWSER_DISABLED),true) $(error FILE_BROWSER_DISABLED has been replaced by USE_FILE_BROWSER (opt-in vs opt-out)) endif ifeq ($(USE_FILEBROWSER),true) $(error typo detected use USE_FILE_BROWSER instead of USE_FILEBROWSER) endif ifeq ($(USE_WEBVIEW),true) $(error typo detected use USE_WEB_VIEW instead of USE_WEBVIEW) endif # --------------------------------------------------------------------------------------------------------------------- # Set optional flags USE_FILE_BROWSER ?= true USE_WEB_VIEW ?= false # --------------------------------------------------------------------------------------------------------------------- # Set build and link flags BASE_FLAGS = -Wall -Wextra -pipe -MD -MP BASE_OPTS = -O3 -ffast-math -fdata-sections -ffunction-sections LINK_OPTS = -fdata-sections -ffunction-sections ifeq ($(GCC),true) BASE_FLAGS += -fno-gnu-unique endif ifeq ($(SKIP_STRIPPING),true) BASE_FLAGS += -g endif ifeq ($(STATIC_BUILD),true) BASE_FLAGS += -DSTATIC_BUILD endif ifeq ($(WINDOWS),true) # Assume we want posix BASE_FLAGS += -posix -D__STDC_FORMAT_MACROS=1 -D__USE_MINGW_ANSI_STDIO=1 # Needed for windows, see https://github.com/falkTX/Carla/issues/855 BASE_FLAGS += -mstackrealign else # Not needed for Windows BASE_FLAGS += -fPIC -DPIC endif ifeq ($(WASM),true) BASE_OPTS += -msse -msse2 -msse3 -msimd128 else ifeq ($(CPU_ARM32),true) BASE_OPTS += -mfpu=neon-vfpv4 -mfloat-abi=hard else ifeq ($(CPU_I386_OR_X86_64),true) BASE_OPTS += -mtune=generic -msse -msse2 -mfpmath=sse endif ifeq ($(MACOS),true) ifneq ($(MACOS_NO_DEAD_STRIP),true) LINK_OPTS += -Wl,-dead_strip,-dead_strip_dylibs endif else ifeq ($(WASM),true) LINK_OPTS += -O3 LINK_OPTS += -Wl,--gc-sections else LINK_OPTS += -Wl,-O1,--as-needed,--gc-sections endif ifneq ($(SKIP_STRIPPING),true) ifeq ($(MACOS),true) LINK_OPTS += -Wl,-x else ifeq ($(WASM),true) LINK_OPTS += -sAGGRESSIVE_VARIABLE_ELIMINATION=1 else LINK_OPTS += -Wl,--strip-all endif endif ifeq ($(NOOPT),true) # Non-CPU-specific optimization flags BASE_OPTS = -O2 -ffast-math -fdata-sections -ffunction-sections endif ifeq ($(DEBUG),true) BASE_FLAGS += -DDEBUG -DDPF_DEBUG -O0 -g # ifneq ($(HAIKU),true) # BASE_FLAGS += -fsanitize=address # endif LINK_OPTS = ifeq ($(WASM),true) LINK_OPTS += -sASSERTIONS=1 endif else BASE_FLAGS += -DNDEBUG $(BASE_OPTS) -fvisibility=hidden CXXFLAGS += -fvisibility-inlines-hidden endif ifeq ($(WASM),true) LINK_OPTS += -sALLOW_MEMORY_GROWTH endif ifeq ($(WITH_LTO),true) BASE_FLAGS += -fno-strict-aliasing -flto LINK_OPTS += -fno-strict-aliasing -flto -Werror=odr ifeq ($(GCC),true) LINK_OPTS += -Werror=lto-type-mismatch endif endif BUILD_C_FLAGS = $(BASE_FLAGS) -std=gnu99 $(CFLAGS) BUILD_CXX_FLAGS = $(BASE_FLAGS) -std=gnu++11 $(CXXFLAGS) LINK_FLAGS = $(LINK_OPTS) $(LDFLAGS) ifeq ($(WASM),true) # Special flag for emscripten LINK_FLAGS += -sENVIRONMENT=web -sLLD_REPORT_UNDEFINED else ifneq ($(MACOS),true) # Not available on MacOS LINK_FLAGS += -Wl,--no-undefined endif ifeq ($(MACOS_OLD),true) BUILD_CXX_FLAGS = $(BASE_FLAGS) $(CXXFLAGS) -DHAVE_CPP11_SUPPORT=0 endif ifeq ($(WASM_CLIPBOARD),true) BUILD_CXX_FLAGS += -DPUGL_WASM_ASYNC_CLIPBOARD LINK_FLAGS += -sASYNCIFY -sASYNCIFY_IMPORTS=puglGetAsyncClipboardData endif ifeq ($(WASM_EXCEPTIONS),true) BUILD_CXX_FLAGS += -fexceptions LINK_FLAGS += -fexceptions endif ifeq ($(WINDOWS),true) # Always build statically on windows LINK_FLAGS += -static -static-libgcc -static-libstdc++ endif # --------------------------------------------------------------------------------------------------------------------- # Strict test build ifeq ($(TESTBUILD),true) BASE_FLAGS += -Werror -Wcast-qual -Wconversion -Wformat -Wformat-security -Wredundant-decls -Wshadow -Wstrict-overflow -fstrict-overflow -Wundef -Wwrite-strings BASE_FLAGS += -Wpointer-arith -Wabi=98 -Winit-self -Wuninitialized -Wstrict-overflow=5 # BASE_FLAGS += -Wfloat-equal ifeq ($(CLANG),true) BASE_FLAGS += -Wdocumentation -Wdocumentation-unknown-command BASE_FLAGS += -Weverything -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-padded -Wno-exit-time-destructors -Wno-float-equal else BASE_FLAGS += -Wcast-align -Wunsafe-loop-optimizations endif ifneq ($(MACOS),true) BASE_FLAGS += -Wmissing-declarations -Wsign-conversion ifeq ($(GCC),true) BASE_FLAGS += -Wlogical-op endif endif CFLAGS += -Wold-style-definition -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes CXXFLAGS += -Weffc++ -Wnon-virtual-dtor -Woverloaded-virtual endif # --------------------------------------------------------------------------------------------------------------------- # Check for required libraries ifneq ($(HAIKU)$(WASM),true) HAVE_CAIRO = $(shell $(PKG_CONFIG) --exists cairo && echo true) endif ifeq ($(HAIKU_OR_MACOS_OR_WASM_OR_WINDOWS),true) HAVE_OPENGL = true else HAVE_OPENGL = $(shell $(PKG_CONFIG) --exists gl && echo true) HAVE_DBUS = $(shell $(PKG_CONFIG) --exists dbus-1 && echo true) HAVE_X11 = $(shell $(PKG_CONFIG) --exists x11 && echo true) HAVE_XCURSOR = $(shell $(PKG_CONFIG) --exists xcursor && echo true) HAVE_XEXT = $(shell $(PKG_CONFIG) --exists xext && echo true) HAVE_XRANDR = $(shell $(PKG_CONFIG) --exists xrandr && echo true) endif # Vulkan is not supported yet # HAVE_VULKAN = $(shell $(PKG_CONFIG) --exists vulkan && echo true) # --------------------------------------------------------------------------------------------------------------------- # Check for optional libraries HAVE_LIBLO = $(shell $(PKG_CONFIG) --exists liblo && echo true) ifneq ($(SKIP_NATIVE_AUDIO_FALLBACK),true) ifneq ($(SKIP_RTAUDIO_FALLBACK),true) ifeq ($(MACOS),true) HAVE_RTAUDIO = true else ifeq ($(WINDOWS),true) HAVE_RTAUDIO = true else HAVE_ALSA = $(shell $(PKG_CONFIG) --exists alsa && echo true) HAVE_PULSEAUDIO = $(shell $(PKG_CONFIG) --exists libpulse-simple && echo true) HAVE_SDL2 = $(shell $(PKG_CONFIG) --exists sdl2 && echo true) ifeq ($(HAVE_ALSA),true) HAVE_RTAUDIO = true else ifeq ($(HAVE_PULSEAUDIO),true) HAVE_RTAUDIO = true endif endif endif endif # backwards compat, always available/enabled ifneq ($(FORCE_NATIVE_AUDIO_FALLBACK),true) ifeq ($(STATIC_BUILD),true) HAVE_JACK = $(shell $(PKG_CONFIG) --exists jack && echo true) else HAVE_JACK = true endif endif # --------------------------------------------------------------------------------------------------------------------- # Set Generic DGL stuff ifeq ($(HAIKU),true) DGL_SYSTEM_LIBS += -lbe else ifeq ($(MACOS),true) DGL_SYSTEM_LIBS += -framework Cocoa DGL_SYSTEM_LIBS += -framework CoreVideo ifeq ($(USE_WEB_VIEW),true) DGL_SYSTEM_LIBS += -framework WebKit endif else ifeq ($(WASM),true) # wasm builds cannot work using regular desktop OpenGL ifeq (,$(findstring true,$(USE_GLES2)$(USE_GLES3))) USE_GLES2 = true endif else ifeq ($(WINDOWS),true) DGL_SYSTEM_LIBS += -lcomdlg32 DGL_SYSTEM_LIBS += -ldwmapi DGL_SYSTEM_LIBS += -lgdi32 # DGL_SYSTEM_LIBS += -lole32 ifeq ($(USE_WEB_VIEW),true) DGL_SYSTEM_LIBS += -lole32 DGL_SYSTEM_LIBS += -luuid endif else ifeq ($(USE_FILE_BROWSER)$(HAVE_DBUS),truetrue) DGL_FLAGS += $(shell $(PKG_CONFIG) --cflags dbus-1) -DHAVE_DBUS DGL_SYSTEM_LIBS += $(shell $(PKG_CONFIG) --libs dbus-1) endif ifeq ($(HAVE_X11),true) DGL_FLAGS += $(shell $(PKG_CONFIG) --cflags x11) -DHAVE_X11 DGL_SYSTEM_LIBS += $(shell $(PKG_CONFIG) --libs x11) ifeq ($(HAVE_XCURSOR),true) DGL_FLAGS += $(shell $(PKG_CONFIG) --cflags xcursor) -DHAVE_XCURSOR DGL_SYSTEM_LIBS += $(shell $(PKG_CONFIG) --libs xcursor) endif ifeq ($(HAVE_XEXT),true) DGL_FLAGS += $(shell $(PKG_CONFIG) --cflags xext) -DHAVE_XEXT -DHAVE_XSYNC DGL_SYSTEM_LIBS += $(shell $(PKG_CONFIG) --libs xext) endif ifeq ($(HAVE_XRANDR),true) DGL_FLAGS += $(shell $(PKG_CONFIG) --cflags xrandr) -DHAVE_XRANDR DGL_SYSTEM_LIBS += $(shell $(PKG_CONFIG) --libs xrandr) endif ifeq ($(USE_WEB_VIEW),true) DGL_FLAGS += -pthread DGL_SYSTEM_LIBS += -pthread -lrt endif endif # HAVE_X11 endif # --------------------------------------------------------------------------------------------------------------------- # Set Cairo specific stuff ifeq ($(HAVE_CAIRO),true) DGL_FLAGS += -DHAVE_CAIRO CAIRO_FLAGS = $(shell $(PKG_CONFIG) --cflags cairo) CAIRO_LIBS = $(shell $(PKG_CONFIG) --libs cairo) HAVE_CAIRO_OR_OPENGL = true endif # HAVE_CAIRO # --------------------------------------------------------------------------------------------------------------------- # Set OpenGL specific stuff ifeq ($(HAVE_OPENGL),true) DGL_FLAGS += -DHAVE_OPENGL ifeq ($(HAIKU),true) OPENGL_FLAGS = OPENGL_LIBS = -lGL else ifeq ($(MACOS),true) OPENGL_FLAGS = -DGL_SILENCE_DEPRECATION=1 -Wno-deprecated-declarations OPENGL_LIBS = -framework OpenGL else ifeq ($(WASM),true) OPENGL_FLAGS = ifeq ($(USE_GLES3),true) OPENGL_LIBS = -sMIN_WEBGL_VERSION=3 -sMAX_WEBGL_VERSION=3 else ifeq ($(USE_GLES2),true) OPENGL_LIBS = -sMIN_WEBGL_VERSION=2 -sMAX_WEBGL_VERSION=2 else OPENGL_LIBS = -sLEGACY_GL_EMULATION -sGL_UNSAFE_OPTS=0 endif else ifeq ($(WINDOWS),true) OPENGL_FLAGS = OPENGL_LIBS = -lopengl32 else OPENGL_FLAGS = $(shell $(PKG_CONFIG) --cflags gl x11) OPENGL_LIBS = $(shell $(PKG_CONFIG) --libs gl x11) endif HAVE_CAIRO_OR_OPENGL = true endif # HAVE_OPENGL # --------------------------------------------------------------------------------------------------------------------- # Set Stub specific stuff ifeq ($(HAIKU_OR_MACOS_OR_WASM_OR_WINDOWS),true) HAVE_STUB = true else HAVE_STUB = $(HAVE_X11) endif # --------------------------------------------------------------------------------------------------------------------- # Set Vulkan specific stuff ifeq ($(HAVE_VULKAN),true) DGL_FLAGS += -DHAVE_VULKAN VULKAN_FLAGS = $(shell $(PKG_CONFIG) --cflags vulkan) VULKAN_LIBS = $(shell $(PKG_CONFIG) --libs vulkan) ifneq ($(HAIKU_OR_MACOS_OR_WASM_OR_WINDOWS),true) VULKAN_LIBS += -ldl endif endif # --------------------------------------------------------------------------------------------------------------------- # Set optional libraries specific stuff ifeq ($(HAVE_ALSA),true) ALSA_FLAGS = $(shell $(PKG_CONFIG) --cflags alsa) ALSA_LIBS = $(shell $(PKG_CONFIG) --libs alsa) endif ifeq ($(HAVE_LIBLO),true) LIBLO_FLAGS = $(shell $(PKG_CONFIG) --cflags liblo) LIBLO_LIBS = $(shell $(PKG_CONFIG) --libs liblo) endif ifeq ($(HAVE_PULSEAUDIO),true) PULSEAUDIO_FLAGS = $(shell $(PKG_CONFIG) --cflags libpulse-simple) PULSEAUDIO_LIBS = $(shell $(PKG_CONFIG) --libs libpulse-simple) endif ifeq ($(HAVE_SDL2),true) SDL2_FLAGS = $(shell $(PKG_CONFIG) --cflags sdl2) SDL2_LIBS = $(shell $(PKG_CONFIG) --libs sdl2) endif ifeq ($(HAVE_JACK),true) ifeq ($(STATIC_BUILD),true) JACK_FLAGS = $(shell $(PKG_CONFIG) --cflags jack) JACK_LIBS = $(shell $(PKG_CONFIG) --libs jack) endif endif ifneq ($(HAIKU_OR_MACOS_OR_WASM_OR_WINDOWS),true) SHARED_MEMORY_LIBS = -lrt endif # --------------------------------------------------------------------------------------------------------------------- # Generic HAVE_DGL ifeq ($(HAIKU_OR_MACOS_OR_WASM_OR_WINDOWS),true) HAVE_DGL = true else HAVE_DGL = $(HAVE_X11) endif # --------------------------------------------------------------------------------------------------------------------- # Namespace flags ifneq ($(DISTRHO_NAMESPACE),) BUILD_CXX_FLAGS += -DDISTRHO_NAMESPACE=$(DISTRHO_NAMESPACE) endif ifneq ($(DGL_NAMESPACE),) BUILD_CXX_FLAGS += -DDGL_NAMESPACE=$(DGL_NAMESPACE) endif # --------------------------------------------------------------------------------------------------------------------- # Optional flags ifeq ($(NVG_DISABLE_SKIPPING_WHITESPACE),true) BUILD_CXX_FLAGS += -DNVG_DISABLE_SKIPPING_WHITESPACE endif ifneq ($(NVG_FONT_TEXTURE_FLAGS),) BUILD_CXX_FLAGS += -DNVG_FONT_TEXTURE_FLAGS=$(NVG_FONT_TEXTURE_FLAGS) endif ifneq ($(WINDOWS_ICON_ID),) BUILD_CXX_FLAGS += -DDGL_WINDOWS_ICON_ID=$(WINDOWS_ICON_ID) endif ifneq ($(X11_WINDOW_ICON_NAME),) BUILD_CXX_FLAGS += -DDGL_X11_WINDOW_ICON_NAME=$(X11_WINDOW_ICON_NAME) endif ifneq ($(X11_WINDOW_ICON_SIZE),) BUILD_CXX_FLAGS += -DDGL_X11_WINDOW_ICON_SIZE=$(X11_WINDOW_ICON_SIZE) endif ifeq ($(USE_GLES2),true) BUILD_CXX_FLAGS += -DDGL_USE_OPENGL3 -DDGL_USE_GLES -DDGL_USE_GLES2 else ifeq ($(USE_GLES3),true) BUILD_CXX_FLAGS += -DDGL_USE_OPENGL3 -DDGL_USE_GLES -DDGL_USE_GLES3 else ifeq ($(USE_OPENGL3),true) BUILD_CXX_FLAGS += -DDGL_USE_OPENGL3 endif ifeq ($(USE_NANOVG_FBO),true) BUILD_CXX_FLAGS += -DDGL_USE_NANOVG_FBO endif ifeq ($(USE_NANOVG_FREETYPE),true) BUILD_CXX_FLAGS += -DFONS_USE_FREETYPE $(shell $(PKG_CONFIG) --cflags freetype2) endif ifeq ($(USE_RGBA),true) BUILD_CXX_FLAGS += -DDGL_USE_RGBA endif ifeq ($(USE_FILE_BROWSER),true) BUILD_CXX_FLAGS += -DDGL_USE_FILE_BROWSER endif ifeq ($(USE_WEB_VIEW),true) BUILD_CXX_FLAGS += -DDGL_USE_WEB_VIEW endif # --------------------------------------------------------------------------------------------------------------------- # Set app extension ifeq ($(WASM),true) APP_EXT = .js else ifeq ($(WINDOWS),true) APP_EXT = .exe endif # --------------------------------------------------------------------------------------------------------------------- # Set shared lib extension ifeq ($(MACOS),true) LIB_EXT = .dylib else ifeq ($(WASM),true) LIB_EXT = .wasm else ifeq ($(WINDOWS),true) LIB_EXT = .dll else LIB_EXT = .so endif # --------------------------------------------------------------------------------------------------------------------- # Set shared library CLI arg ifeq ($(MACOS),true) SHARED = -dynamiclib else ifeq ($(WASM),true) SHARED = -sSIDE_MODULE=2 else SHARED = -shared endif # --------------------------------------------------------------------------------------------------------------------- # Set CLAP binary directory ifeq ($(MACOS),true) CLAP_BINARY_DIR = Contents/MacOS else CLAP_BINARY_DIR = endif # --------------------------------------------------------------------------------------------------------------------- # Set VST2 binary directory ifeq ($(MACOS),true) VST2_BINARY_DIR = Contents/MacOS else VST2_BINARY_DIR = endif # --------------------------------------------------------------------------------------------------------------------- # Set VST3 binary directory, see https://vst3sdk-doc.diatonic.jp/doc/vstinterfaces/vst3loc.html ifeq ($(LINUX),true) # This must match `uname -m`, which differs from `gcc -dumpmachine` on PowerPC. VST3_ARCHITECTURE := $(patsubst powerpc%,ppc%,$(TARGET_PROCESSOR)) VST3_BINARY_DIR = Contents/$(VST3_ARCHITECTURE)-linux else ifeq ($(MACOS),true) VST3_BINARY_DIR = Contents/MacOS else ifeq ($(WASM),true) VST3_BINARY_DIR = Contents/wasm else ifeq ($(WINDOWS)$(CPU_I386),truetrue) VST3_BINARY_DIR = Contents/x86-win else ifeq ($(WINDOWS)$(CPU_X86_64),truetrue) VST3_BINARY_DIR = Contents/x86_64-win else VST3_BINARY_DIR = endif # --------------------------------------------------------------------------------------------------------------------- # Handle the verbosity switch SILENT = ifeq ($(VERBOSE),1) else ifeq ($(VERBOSE),y) else ifeq ($(VERBOSE),yes) else ifeq ($(VERBOSE),true) else SILENT = @ endif # --------------------------------------------------------------------------------------------------------------------- # all needs to be first all: # --------------------------------------------------------------------------------------------------------------------- # helper to print what is available/possible to build print_available = @echo $(1): $(shell echo $($(1)) | grep -q true && echo Yes || echo No) features: @echo === Detected Compiler $(call print_available,CLANG) $(call print_available,GCC) @echo === Detected CPU $(call print_available,CPU_ARM) $(call print_available,CPU_ARM32) $(call print_available,CPU_ARM64) $(call print_available,CPU_ARM_OR_ARM64) $(call print_available,CPU_I386) $(call print_available,CPU_I386_OR_X86_64) $(call print_available,CPU_RISCV64) $(call print_available,CPU_X86_64) @echo === Detected OS $(call print_available,BSD) $(call print_available,HAIKU) $(call print_available,HURD) $(call print_available,LINUX) $(call print_available,MACOS) $(call print_available,WASM) $(call print_available,WINDOWS) $(call print_available,HAIKU_OR_MACOS_OR_WASM_OR_WINDOWS) $(call print_available,HAIKU_OR_MACOS_OR_WINDOWS) $(call print_available,LINUX_OR_MACOS) $(call print_available,MACOS_OR_WASM_OR_WINDOWS) $(call print_available,MACOS_OR_WINDOWS) $(call print_available,UNIX) @echo === Detected features $(call print_available,HAVE_ALSA) $(call print_available,HAVE_DBUS) $(call print_available,HAVE_CAIRO) $(call print_available,HAVE_DGL) $(call print_available,HAVE_JACK) $(call print_available,HAVE_LIBLO) $(call print_available,HAVE_OPENGL) $(call print_available,HAVE_PULSEAUDIO) $(call print_available,HAVE_RTAUDIO) $(call print_available,HAVE_SDL2) $(call print_available,HAVE_STUB) $(call print_available,HAVE_VULKAN) $(call print_available,HAVE_X11) $(call print_available,HAVE_XCURSOR) $(call print_available,HAVE_XEXT) $(call print_available,HAVE_XRANDR) # --------------------------------------------------------------------------------------------------------------------- # Extra rules for MOD Audio stuff # NOTE: path must be absolute WORKDIR ?= $(HOME)/mod-workdir MOD_ENVIRONMENT = \ AR=${1}/host/usr/bin/${2}-gcc-ar \ CC=${1}/host/usr/bin/${2}-gcc \ CPP=${1}/host/usr/bin/${2}-cpp \ CXX=${1}/host/usr/bin/${2}-g++ \ LD=${1}/host/usr/bin/${2}-ld \ PKG_CONFIG=${1}/host/usr/bin/pkg-config \ PKG_CONFIG_PATH="${1}/staging/usr/lib/pkgconfig" \ STRIP=${1}/host/usr/bin/${2}-strip \ CFLAGS="-I${1}/staging/usr/include $(EXTRA_MOD_FLAGS)" \ CPPFLAGS= \ CXXFLAGS="-I${1}/staging/usr/include $(EXTRA_MOD_FLAGS)" \ LDFLAGS="-L${1}/staging/usr/lib $(EXTRA_MOD_FLAGS)" \ EXE_WRAPPER="qemu-${3}-static -L ${1}/target" \ HAVE_CAIRO=false \ HAVE_OPENGL=false \ MOD_BUILD=true \ NOOPT=true darkglass-anagram: $(MAKE) $(call MOD_ENVIRONMENT,$(WORKDIR)/darkglass-anagram,aarch64-modaudio.generic-linux-gnu,aarch64) modduo: $(MAKE) $(call MOD_ENVIRONMENT,$(WORKDIR)/modduo-static,arm-mod-linux-gnueabihf.static,arm) modduo-new: $(MAKE) $(call MOD_ENVIRONMENT,$(WORKDIR)/modduo-new,arm-modaudio-linux-gnueabihf,arm) modduox: $(MAKE) $(call MOD_ENVIRONMENT,$(WORKDIR)/modduox-static,aarch64-mod-linux-gnueabi.static,aarch64) modduox-new: $(MAKE) $(call MOD_ENVIRONMENT,$(WORKDIR)/modduox-new,aarch64-modaudio-linux-gnueabi,aarch64) moddwarf: $(MAKE) $(call MOD_ENVIRONMENT,$(WORKDIR)/moddwarf,aarch64-mod-linux-gnu,aarch64) moddwarf-new: $(MAKE) $(call MOD_ENVIRONMENT,$(WORKDIR)/moddwarf-new,aarch64-modaudio-linux-gnu,aarch64) modpush: tar -C bin -chz $(subst bin/,,$(wildcard bin/*.lv2)) | base64 | curl -F 'package=@-' http://192.168.51.1/sdk/install && echo ifneq (,$(findstring darkglass-anagram-,$(MAKECMDGOALS))) $(MAKECMDGOALS): $(MAKE) $(call MOD_ENVIRONMENT,$(WORKDIR)/darkglass-anagram,aarch64-modaudio.generic-linux-gnu,aarch64) $(subst darkglass-anagram-,,$(MAKECMDGOALS)) endif ifneq (,$(findstring modduo-new-,$(MAKECMDGOALS))) $(MAKECMDGOALS): $(MAKE) $(call MOD_ENVIRONMENT,$(WORKDIR)/modduo-new,arm-modaudio-linux-gnueabihf,arm) $(subst modduo-new-,,$(MAKECMDGOALS)) else ifneq (,$(findstring modduo-,$(filter-out modduo-new,$(MAKECMDGOALS)))) $(MAKECMDGOALS): $(MAKE) $(call MOD_ENVIRONMENT,$(WORKDIR)/modduo-static,arm-mod-linux-gnueabihf.static,arm) $(subst modduo-,,$(MAKECMDGOALS)) endif ifneq (,$(findstring modduox-new-,$(MAKECMDGOALS))) $(MAKECMDGOALS): $(MAKE) $(call MOD_ENVIRONMENT,$(WORKDIR)/modduox-new,aarch64-modaudio-linux-gnueabi,aarch64) $(subst modduox-new-,,$(MAKECMDGOALS)) else ifneq (,$(findstring modduox-,$(filter-out modduox-new,$(MAKECMDGOALS)))) $(MAKECMDGOALS): $(MAKE) $(call MOD_ENVIRONMENT,$(WORKDIR)/modduox-static,aarch64-mod-linux-gnueabi.static,aarch64) $(subst modduox-,,$(MAKECMDGOALS)) endif ifneq (,$(findstring moddwarf-new-,$(MAKECMDGOALS))) $(MAKECMDGOALS): $(MAKE) $(call MOD_ENVIRONMENT,$(WORKDIR)/moddwarf-new,aarch64-modaudio-linux-gnu,aarch64) $(subst moddwarf-new-,,$(MAKECMDGOALS)) else ifneq (,$(findstring moddwarf-,$(filter-out moddwarf-new,$(MAKECMDGOALS)))) $(MAKECMDGOALS): $(MAKE) $(call MOD_ENVIRONMENT,$(WORKDIR)/moddwarf,aarch64-mod-linux-gnu,aarch64) $(subst moddwarf-,,$(MAKECMDGOALS)) endif # --------------------------------------------------------------------------------------------------------------------- # Convenience rules for common builds macos-intel-10.8: $(MAKE) \ CFLAGS="$(CFLAGS) -arch x86_64 -DMAC_OS_X_VERSION_MAX_ALLOWED=MAC_OS_X_VERSION_10_8 -DMAC_OS_X_VERSION_MIN_REQUIRED=MAC_OS_X_VERSION_10_8 -mmacosx-version-min=10.8" \ CXXFLAGS="$(CXXFLAGS) -arch x86_64 -DMAC_OS_X_VERSION_MAX_ALLOWED=MAC_OS_X_VERSION_10_8 -DMAC_OS_X_VERSION_MIN_REQUIRED=MAC_OS_X_VERSION_10_8 -mmacosx-version-min=10.8 -stdlib=libc++" \ LDFLAGS="$(LDFLAGS) -stdlib=libc++" \ PKG_CONFIG=/usr/bin/false \ PKG_CONFIG_PATH=/NOT macos-universal-10.8: $(MAKE) \ CFLAGS="$(CFLAGS) -arch x86_64 -arch arm64 -DMAC_OS_X_VERSION_MAX_ALLOWED=MAC_OS_X_VERSION_10_8 -DMAC_OS_X_VERSION_MIN_REQUIRED=MAC_OS_X_VERSION_10_8 -mmacosx-version-min=10.15" \ CXXFLAGS="$(CXXFLAGS) -arch x86_64 -arch arm64 -DMAC_OS_X_VERSION_MAX_ALLOWED=MAC_OS_X_VERSION_10_8 -DMAC_OS_X_VERSION_MIN_REQUIRED=MAC_OS_X_VERSION_10_8 -mmacosx-version-min=10.15 -stdlib=libc++" \ LDFLAGS="$(LDFLAGS) -stdlib=libc++" \ PKG_CONFIG=/usr/bin/false \ PKG_CONFIG_PATH=/NOT macos-intel-10.15: $(MAKE) \ CFLAGS="$(CFLAGS) -arch x86_64 -DMAC_OS_X_VERSION_MAX_ALLOWED=MAC_OS_X_VERSION_10_15 -DMAC_OS_X_VERSION_MIN_REQUIRED=MAC_OS_X_VERSION_10_15 -mmacosx-version-min=10.15" \ CXXFLAGS="$(CXXFLAGS) -arch x86_64 -DMAC_OS_X_VERSION_MAX_ALLOWED=MAC_OS_X_VERSION_10_15 -DMAC_OS_X_VERSION_MIN_REQUIRED=MAC_OS_X_VERSION_10_15 -mmacosx-version-min=10.15" \ PKG_CONFIG=/usr/bin/false \ PKG_CONFIG_PATH=/NOT macos-universal-10.15: $(MAKE) \ CFLAGS="$(CFLAGS) -arch x86_64 -arch arm64 -DMAC_OS_X_VERSION_MAX_ALLOWED=MAC_OS_X_VERSION_10_15 -DMAC_OS_X_VERSION_MIN_REQUIRED=MAC_OS_X_VERSION_10_15 -mmacosx-version-min=10.15" \ CXXFLAGS="$(CXXFLAGS) -arch x86_64 -arch arm64 -DMAC_OS_X_VERSION_MAX_ALLOWED=MAC_OS_X_VERSION_10_15 -DMAC_OS_X_VERSION_MIN_REQUIRED=MAC_OS_X_VERSION_10_15 -mmacosx-version-min=10.15" \ PKG_CONFIG=/usr/bin/false \ PKG_CONFIG_PATH=/NOT mingw32: $(MAKE) \ AR=i686-w64-mingw32-ar \ CC=i686-w64-mingw32-gcc \ CXX=i686-w64-mingw32-g++ \ EXE_WRAPPER=wine \ PKG_CONFIG=/usr/bin/false \ PKG_CONFIG_PATH=/NOT mingw64: $(MAKE) \ AR=x86_64-w64-mingw32-ar \ CC=x86_64-w64-mingw32-gcc \ CXX=x86_64-w64-mingw32-g++ \ EXE_WRAPPER=wine \ PKG_CONFIG=/usr/bin/false \ PKG_CONFIG_PATH=/NOT # --------------------------------------------------------------------------------------------------------------------- # Protect against multiple inclusion endif # DPF_MAKEFILE_BASE_INCLUDED # ---------------------------------------------------------------------------------------------------------------------