|
| 1 | +WASM_OUT_DIR := wasm |
| 2 | +WASM_OUT_NAME := libpg-query |
| 3 | +WASM_MODULE_NAME := PgQueryModule |
| 4 | +LIBPG_QUERY_REPO := https://github.com/pganalyze/libpg_query.git |
| 5 | +LIBPG_QUERY_TAG := 16-5.1.0 |
| 6 | +CACHE_DIR := .cache |
| 7 | + |
| 8 | +OS ?= $(shell uname -s) |
| 9 | +ARCH ?= $(shell uname -m) |
| 10 | + |
| 11 | +ifdef EMSCRIPTEN |
| 12 | +PLATFORM := emscripten |
| 13 | +else ifeq ($(OS),Darwin) |
| 14 | +PLATFORM := darwin |
| 15 | +else ifeq ($(OS),Linux) |
| 16 | +PLATFORM := linux |
| 17 | +else |
| 18 | +$(error Unsupported platform: $(OS)) |
| 19 | +endif |
| 20 | + |
| 21 | +ifdef EMSCRIPTEN |
| 22 | +ARCH := wasm |
| 23 | +endif |
| 24 | + |
| 25 | +PLATFORM_ARCH := $(PLATFORM)-$(ARCH) |
| 26 | +SRC_FILES := $(wildcard src/*.cc) |
| 27 | +LIBPG_QUERY_DIR := $(CACHE_DIR)/$(PLATFORM_ARCH)/libpg_query/$(LIBPG_QUERY_TAG) |
| 28 | +LIBPG_QUERY_ARCHIVE := $(LIBPG_QUERY_DIR)/libpg_query.a |
| 29 | +LIBPG_QUERY_HEADER := $(LIBPG_QUERY_DIR)/pg_query.h |
| 30 | +CXXFLAGS := -O3 |
| 31 | + |
| 32 | +ifdef EMSCRIPTEN |
| 33 | +OUT_FILES := $(foreach EXT,.js .wasm,$(WASM_OUT_DIR)/$(WASM_OUT_NAME)$(EXT)) |
| 34 | +else |
| 35 | +OUT_FILES := build/Release/queryparser.node $(wildcard build/*) |
| 36 | +endif |
| 37 | + |
| 38 | +# Clone libpg_query source (lives in CACHE_DIR) |
| 39 | +$(LIBPG_QUERY_DIR): |
| 40 | + mkdir -p $(CACHE_DIR) |
| 41 | + git clone -b $(LIBPG_QUERY_TAG) --single-branch $(LIBPG_QUERY_REPO) $(LIBPG_QUERY_DIR) |
| 42 | + |
| 43 | +$(LIBPG_QUERY_HEADER): $(LIBPG_QUERY_DIR) |
| 44 | + |
| 45 | +# Build libpg_query |
| 46 | +$(LIBPG_QUERY_ARCHIVE): $(LIBPG_QUERY_DIR) |
| 47 | + cd $(LIBPG_QUERY_DIR); $(MAKE) build |
| 48 | + |
| 49 | +# Build libpg-query-node (based on platform) |
| 50 | +$(OUT_FILES): $(LIBPG_QUERY_ARCHIVE) $(LIBPG_QUERY_HEADER) $(SRC_FILES) |
| 51 | +ifdef EMSCRIPTEN |
| 52 | + @ $(CXX) \ |
| 53 | + $(CXXFLAGS) \ |
| 54 | + -DNAPI_HAS_THREADS \ |
| 55 | + -I$(LIBPG_QUERY_DIR) \ |
| 56 | + -I./node_modules/emnapi/include \ |
| 57 | + -I./node_modules/node-addon-api \ |
| 58 | + -L./node_modules/emnapi/lib/wasm32-emscripten \ |
| 59 | + -L$(LIBPG_QUERY_DIR) \ |
| 60 | + --js-library=./node_modules/emnapi/dist/library_napi.js \ |
| 61 | + -sEXPORTED_FUNCTIONS="['_malloc','_free','_napi_register_wasm_v1','_node_api_module_get_api_version_v1']" \ |
| 62 | + -sEXPORT_NAME="$(WASM_MODULE_NAME)" \ |
| 63 | + -sENVIRONMENT="web" \ |
| 64 | + -sMODULARIZE=1 \ |
| 65 | + -sEXPORT_ES6=1 \ |
| 66 | + -fexceptions \ |
| 67 | + -lpg_query \ |
| 68 | + -lemnapi-basic \ |
| 69 | + -o $@ \ |
| 70 | + $(SRC_FILES) |
| 71 | +else |
| 72 | +# if not wasm, defer to node-gyp |
| 73 | + yarn rebuild |
| 74 | +endif |
| 75 | + |
| 76 | +# Commands |
| 77 | +build: $(OUT_FILES) |
| 78 | + |
| 79 | +build-cache: $(LIBPG_QUERY_ARCHIVE) $(LIBPG_QUERY_HEADER) |
| 80 | + |
| 81 | +rebuild: clean build |
| 82 | + |
| 83 | +rebuild-cache: clean-cache build-cache |
| 84 | + |
| 85 | +clean: |
| 86 | + -@ rm -r $(OUT_FILES) > /dev/null 2>&1 |
| 87 | + |
| 88 | +clean-cache: |
| 89 | + -@ rm -rf $(LIBPG_QUERY_DIR) |
| 90 | + |
| 91 | +.PHONY: build build-cache rebuild rebuild-cache clean clean-cache |
0 commit comments