|
| 1 | +# WebUI C Example |
| 2 | + |
| 3 | +# == 1. VARIABLES ============================================================= |
| 4 | + |
| 5 | +MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) |
| 6 | +PROJECT_DIR := $(dir $(MAKEFILE_PATH))/../../../ |
| 7 | +TARGET := $(firstword $(MAKECMDGOALS)) |
| 8 | +LIB_DIR := $(PROJECT_DIR)/dist |
| 9 | +ifeq ($(TARGET), debug) |
| 10 | +LIB_DIR := $(LIB_DIR)/debug |
| 11 | +endif |
| 12 | +INCLUDE_DIR := $(PROJECT_DIR)/include |
| 13 | +WEBUI_LIB_NAME = webui-2 |
| 14 | +ifeq ($(WEBUI_USE_TLS), 1) |
| 15 | +WEBUI_LIB_NAME = webui-2-secure |
| 16 | +endif |
| 17 | + |
| 18 | +# ARGS |
| 19 | +# Set a compiler when running on Linux via `make CC=gcc` / `make CC=clang` |
| 20 | +CC = gcc |
| 21 | +# Build the WebUI library if running via `make BUILD_LIB=true` |
| 22 | +BUILD_LIB ?= |
| 23 | + |
| 24 | +# BUILD FLAGS |
| 25 | +STATIC_BUILD_FLAGS = main.c -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" |
| 26 | +DYN_BUILD_FLAGS = main.c -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" |
| 27 | + |
| 28 | +# Platform conditions |
| 29 | +ifeq ($(OS),Windows_NT) |
| 30 | + # Windows |
| 31 | + PLATFORM := windows |
| 32 | + SHELL := CMD |
| 33 | + STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lws2_32 -Wall -luser32 -static |
| 34 | + COPY_LIB_CMD := @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" |
| 35 | + DYN_BUILD_FLAGS += "$(WEBUI_LIB_NAME).dll" -lws2_32 -Wall -luser32 |
| 36 | + STATIC_OUT := main.exe |
| 37 | + DYN_OUT := main-dyn.exe |
| 38 | + LWS2_OPT := -lws2_32 -lOle32 |
| 39 | + STRIP_OPT := --strip-all |
| 40 | + CONSOLE_APP := -Wl,-subsystem=console |
| 41 | + GUI_APP := -Wl,-subsystem=windows |
| 42 | +else |
| 43 | + STATIC_BUILD_FLAGS += -lpthread -lm -l$(WEBUI_LIB_NAME)-static |
| 44 | + DYN_BUILD_FLAGS += -lpthread -lm |
| 45 | + STATIC_OUT := main |
| 46 | + DYN_OUT := main-dyn |
| 47 | + ifeq ($(shell uname),Darwin) |
| 48 | + # MacOS |
| 49 | + PLATFORM := macos |
| 50 | + CC = clang |
| 51 | + COPY_LIB_CMD := @cp "$(LIB_DIR)/$(WEBUI_LIB_NAME).dylib" "$(WEBUI_LIB_NAME).dylib" |
| 52 | + DYN_BUILD_FLAGS += "./$(WEBUI_LIB_NAME).dylib" |
| 53 | + WKWEBKIT_LINK_FLAGS := -framework Cocoa -framework WebKit |
| 54 | + else |
| 55 | + # Linux |
| 56 | + PLATFORM := linux |
| 57 | + COPY_LIB_CMD := @cp "$(LIB_DIR)/$(WEBUI_LIB_NAME).so" "$(WEBUI_LIB_NAME).so" |
| 58 | + STATIC_BUILD_FLAGS += -ldl |
| 59 | + DYN_BUILD_FLAGS += -ldl "./$(WEBUI_LIB_NAME).so" |
| 60 | + STRIP_OPT := --strip-all |
| 61 | + ifeq ($(CC),clang) |
| 62 | + LLVM_OPT := llvm- |
| 63 | + endif |
| 64 | + endif |
| 65 | +endif |
| 66 | + |
| 67 | +# == 2.TARGETS ================================================================ |
| 68 | + |
| 69 | +all: release |
| 70 | + |
| 71 | +debug: --validate-args |
| 72 | +ifeq ($(BUILD_LIB),true) |
| 73 | + @cd "$(PROJECT_DIR)" && $(MAKE) debug |
| 74 | +endif |
| 75 | +# Static with Debug info |
| 76 | +ifneq ($(WEBUI_USE_TLS), 1) |
| 77 | + @echo "Build C Example ($(CC) debug static)..." |
| 78 | + @$(CC) -g $(CONSOLE_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) |
| 79 | +endif |
| 80 | +# Dynamic with Debug info |
| 81 | + @echo "Build C Example ($(CC) debug dynamic)..." |
| 82 | + $(COPY_LIB_CMD) |
| 83 | + @$(CC) -g $(CONSOLE_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) |
| 84 | +# Clean |
| 85 | +ifeq ($(PLATFORM),windows) |
| 86 | + @- del *.o >nul 2>&1 |
| 87 | +else |
| 88 | + @- rm -f *.o |
| 89 | + @- rm -rf *.dSYM # macOS |
| 90 | +endif |
| 91 | + @echo "Done." |
| 92 | + |
| 93 | +release: --validate-args |
| 94 | +ifeq ($(BUILD_LIB),true) |
| 95 | + @cd "$(PROJECT_DIR)" && $(MAKE) |
| 96 | +endif |
| 97 | +# Static Release |
| 98 | +ifneq ($(WEBUI_USE_TLS), 1) |
| 99 | + @echo "Build C Example ($(CC) release static)..." |
| 100 | + @$(CC) -Os $(GUI_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) |
| 101 | + @$(LLVM_OPT)strip $(STRIP_OPT) $(STATIC_OUT) |
| 102 | +endif |
| 103 | +# Dynamic Release |
| 104 | + @echo "Build C Example ($(CC) release dynamic)..." |
| 105 | + $(COPY_LIB_CMD) |
| 106 | + @$(CC) $(GUI_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) |
| 107 | + @$(LLVM_OPT)strip $(STRIP_OPT) $(DYN_OUT) |
| 108 | +# Clean |
| 109 | +ifeq ($(PLATFORM),windows) |
| 110 | + @- del *.o >nul 2>&1 |
| 111 | +else |
| 112 | + @- rm -f *.o |
| 113 | + @- rm -rf *.dSYM # macOS |
| 114 | +endif |
| 115 | + @echo "Done." |
| 116 | + |
| 117 | +clean: --clean-$(PLATFORM) |
| 118 | + |
| 119 | +# INTERNAL TARGETS |
| 120 | + |
| 121 | +--validate-args: |
| 122 | +ifneq ($(filter $(CC),gcc clang aarch64-linux-gnu-gcc arm-linux-gnueabihf-gcc musl-gcc),$(CC)) |
| 123 | +$(error Invalid compiler specified: `$(CC)`) |
| 124 | +endif |
| 125 | + |
| 126 | +--clean-linux: --clean-unix |
| 127 | + |
| 128 | +--clean-macos: --clean-unix |
| 129 | + |
| 130 | +--clean-unix: |
| 131 | + - rm -f *.o |
| 132 | + - rm -f *.a |
| 133 | + - rm -f *.so |
| 134 | + - rm -f *.dylib |
| 135 | + - rm -rf *.dSYM |
| 136 | + |
| 137 | +--clean-windows: |
| 138 | + - del *.o >nul 2>&1 |
| 139 | + - del *.dll >nul 2>&1 |
| 140 | + - del *.a >nul 2>&1 |
| 141 | + - del *.exe >nul 2>&1 |
0 commit comments