|
1 | | -VERSION := 0.20.0 |
| 1 | +VERSION := 0.2.0 |
2 | 2 |
|
3 | | -# Repository |
| 3 | +LANGUAGE_NAME := tree-sitter-purescript |
| 4 | + |
| 5 | +# repository |
4 | 6 | SRC_DIR := src |
5 | 7 |
|
6 | | -PARSER_REPO_URL ?= $(shell git -C $(SRC_DIR) remote get-url origin ) |
7 | | -# the # in the sed pattern has to be escaped or it will be interpreted as a comment |
8 | | -PARSER_NAME ?= $(shell basename $(PARSER_REPO_URL) | cut -d '-' -f3 | sed 's\#.git\#\#') |
9 | | -UPPER_PARSER_NAME := $(shell echo $(PARSER_NAME) | tr a-z A-Z ) |
| 8 | +PARSER_REPO_URL := $(shell git -C $(SRC_DIR) remote get-url origin 2>/dev/null) |
| 9 | + |
| 10 | +ifeq ($(PARSER_URL),) |
| 11 | + PARSER_URL := $(subst .git,,$(PARSER_REPO_URL)) |
| 12 | +ifeq ($(shell echo $(PARSER_URL) | grep '^[a-z][-+.0-9a-z]*://'),) |
| 13 | + PARSER_URL := $(subst :,/,$(PARSER_URL)) |
| 14 | + PARSER_URL := $(subst git@,https://,$(PARSER_URL)) |
| 15 | +endif |
| 16 | +endif |
| 17 | + |
| 18 | +# ABI versioning |
| 19 | +SONAME_MAJOR := $(word 1,$(subst ., ,$(VERSION))) |
| 20 | +SONAME_MINOR := $(word 2,$(subst ., ,$(VERSION))) |
10 | 21 |
|
11 | 22 | # install directory layout |
12 | 23 | PREFIX ?= /usr/local |
13 | 24 | INCLUDEDIR ?= $(PREFIX)/include |
14 | 25 | LIBDIR ?= $(PREFIX)/lib |
15 | 26 | PCLIBDIR ?= $(LIBDIR)/pkgconfig |
16 | 27 |
|
17 | | -# collect C++ sources, and link if necessary |
18 | | -CPPSRC := $(wildcard $(SRC_DIR)/*.cc) |
| 28 | +# object files |
| 29 | +OBJS := $(patsubst %.c,%.o,$(wildcard $(SRC_DIR)/*.c)) |
19 | 30 |
|
20 | | -ifeq (, $(CPPSRC)) |
21 | | - ADDITIONALLIBS := |
22 | | -else |
23 | | - ADDITIONALLIBS := -lc++ |
24 | | -endif |
25 | | - |
26 | | -# collect sources |
27 | | -SRC := $(wildcard $(SRC_DIR)/*.c) |
28 | | -SRC += $(CPPSRC) |
29 | | -OBJ := $(addsuffix .o,$(basename $(SRC))) |
30 | | - |
31 | | -# ABI versioning |
32 | | -SONAME_MAJOR := 0 |
33 | | -SONAME_MINOR := 0 |
34 | | - |
35 | | -CFLAGS ?= -O3 -Wall -Wextra -I$(SRC_DIR) |
36 | | -CXXFLAGS ?= -O3 -Wall -Wextra -I$(SRC_DIR) |
37 | | -override CFLAGS += -std=gnu99 -fPIC |
38 | | -override CXXFLAGS += -fPIC |
| 31 | +# flags |
| 32 | +ARFLAGS := rcs |
| 33 | +override CFLAGS += -I$(SRC_DIR) -std=c11 |
39 | 34 |
|
40 | 35 | # OS-specific bits |
41 | 36 | ifeq ($(shell uname),Darwin) |
42 | 37 | SOEXT = dylib |
43 | 38 | SOEXTVER_MAJOR = $(SONAME_MAJOR).dylib |
44 | 39 | SOEXTVER = $(SONAME_MAJOR).$(SONAME_MINOR).dylib |
45 | 40 | LINKSHARED := $(LINKSHARED)-dynamiclib -Wl, |
46 | | - ifneq ($(ADDITIONALLIBS),) |
47 | | - LINKSHARED := $(LINKSHARED)$(ADDITIONALLIBS), |
| 41 | + ifneq ($(ADDITIONAL_LIBS),) |
| 42 | + LINKSHARED := $(LINKSHARED)$(ADDITIONAL_LIBS), |
48 | 43 | endif |
49 | | - LINKSHARED := $(LINKSHARED)-install_name,$(LIBDIR)/libtree-sitter-$(PARSER_NAME).$(SONAME_MAJOR).dylib,-rpath,@executable_path/../Frameworks |
50 | | -else |
| 44 | + LINKSHARED := $(LINKSHARED)-install_name,$(LIBDIR)/lib$(LANGUAGE_NAME).$(SONAME_MAJOR).dylib,-rpath,@executable_path/../Frameworks |
| 45 | +else ifneq ($(filter $(shell uname),Linux FreeBSD NetBSD DragonFly),) |
51 | 46 | SOEXT = so |
52 | 47 | SOEXTVER_MAJOR = so.$(SONAME_MAJOR) |
53 | 48 | SOEXTVER = so.$(SONAME_MAJOR).$(SONAME_MINOR) |
54 | 49 | LINKSHARED := $(LINKSHARED)-shared -Wl, |
55 | | - ifneq ($(ADDITIONALLIBS),) |
56 | | - LINKSHARED := $(LINKSHARED)$(ADDITIONALLIBS) |
| 50 | + ifneq ($(ADDITIONAL_LIBS),) |
| 51 | + LINKSHARED := $(LINKSHARED)$(ADDITIONAL_LIBS) |
57 | 52 | endif |
58 | | - LINKSHARED := $(LINKSHARED)-soname,libtree-sitter-$(PARSER_NAME).so.$(SONAME_MAJOR) |
| 53 | + LINKSHARED := $(LINKSHARED)-soname,lib$(LANGUAGE_NAME).so.$(SONAME_MAJOR) |
| 54 | +else ifeq ($(OS),Windows_NT) |
| 55 | + $(error "Windows is not supported") |
59 | 56 | endif |
60 | | -ifneq (,$(filter $(shell uname),FreeBSD NetBSD DragonFly)) |
| 57 | +ifneq ($(filter $(shell uname),FreeBSD NetBSD DragonFly),) |
61 | 58 | PCLIBDIR := $(PREFIX)/libdata/pkgconfig |
62 | 59 | endif |
63 | | - |
64 | | -# target to generate header is commented-out because the required tree-sitter.h.in file is not in the repo |
65 | | -#all: libtree-sitter-$(PARSER_NAME).a libtree-sitter-$(PARSER_NAME).$(SOEXTVER) bindings/c/$(PARSER_NAME).h |
66 | | -all: libtree-sitter-$(PARSER_NAME).a libtree-sitter-$(PARSER_NAME).$(SOEXTVER) |
67 | 60 |
|
68 | | -libtree-sitter-$(PARSER_NAME).a: $(OBJ) |
69 | | - $(AR) rcs $@ $^ |
| 61 | +all: lib$(LANGUAGE_NAME).a lib$(LANGUAGE_NAME).$(SOEXT) $(LANGUAGE_NAME).pc |
| 62 | + |
| 63 | +$(SRC_DIR)/%.o: $(SRC_DIR)/%.c |
| 64 | + $(CC) -c $^ -o $@ |
| 65 | + |
| 66 | +lib$(LANGUAGE_NAME).a: $(OBJS) |
| 67 | + $(AR) $(ARFLAGS) $@ $^ |
70 | 68 |
|
71 | | -libtree-sitter-$(PARSER_NAME).$(SOEXTVER): $(OBJ) |
72 | | - $(CC) $(LDFLAGS) $(LINKSHARED) $^ $(LDLIBS) -o $@ |
73 | | - ln -sf $@ libtree-sitter-$(PARSER_NAME).$(SOEXT) |
74 | | - ln -sf $@ libtree-sitter-$(PARSER_NAME).$(SOEXTVER_MAJOR) |
| 69 | +lib$(LANGUAGE_NAME).$(SOEXT): $(OBJS) |
| 70 | + $(CC) -fPIC $(LDFLAGS) $(LINKSHARED) $^ $(LDLIBS) -o $@ |
75 | 71 |
|
76 | | -bindings/c/$(PARSER_NAME).h: |
77 | | - sed -e 's|@UPPER_PARSERNAME@|$(UPPER_PARSER_NAME)|' \ |
78 | | - -e 's|@PARSERNAME@|$(PARSER_NAME)|' \ |
79 | | - bindings/c/tree-sitter.h.in > $@ |
| 72 | +$(LANGUAGE_NAME).pc: |
| 73 | + sed > $@ bindings/c/$(LANGUAGE_NAME).pc.in \ |
| 74 | + -e 's|@URL@|$(PARSER_URL)|' \ |
| 75 | + -e 's|@VERSION@|$(VERSION)|' \ |
| 76 | + -e 's|@LIBDIR@|$(LIBDIR)|;' \ |
| 77 | + -e 's|@INCLUDEDIR@|$(INCLUDEDIR)|;' \ |
| 78 | + -e 's|=$(PREFIX)|=$${prefix}|' \ |
| 79 | + -e 's|@PREFIX@|$(PREFIX)|' \ |
| 80 | + -e 's|@REQUIRES@|$(REQUIRES)|' \ |
| 81 | + -e 's|@ADDITIONAL_LIBS@|$(ADDITIONAL_LIBS)|' |
80 | 82 |
|
81 | 83 | install: all |
82 | | - install -d '$(DESTDIR)$(LIBDIR)' |
83 | | - install -m755 libtree-sitter-$(PARSER_NAME).a '$(DESTDIR)$(LIBDIR)'/libtree-sitter-$(PARSER_NAME).a |
84 | | - install -m755 libtree-sitter-$(PARSER_NAME).$(SOEXTVER) '$(DESTDIR)$(LIBDIR)'/libtree-sitter-$(PARSER_NAME).$(SOEXTVER) |
85 | | - ln -sf libtree-sitter-$(PARSER_NAME).$(SOEXTVER) '$(DESTDIR)$(LIBDIR)'/libtree-sitter-$(PARSER_NAME).$(SOEXTVER_MAJOR) |
86 | | - ln -sf libtree-sitter-$(PARSER_NAME).$(SOEXTVER) '$(DESTDIR)$(LIBDIR)'/libtree-sitter-$(PARSER_NAME).$(SOEXT) |
87 | | - install -d '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter |
| 84 | + install -Dm644 bindings/c/$(LANGUAGE_NAME).h '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter/$(LANGUAGE_NAME).h |
| 85 | + install -Dm644 $(LANGUAGE_NAME).pc '$(DESTDIR)$(PCLIBDIR)'/$(LANGUAGE_NAME).pc |
| 86 | + install -Dm755 lib$(LANGUAGE_NAME).a '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).a |
| 87 | + install -Dm755 lib$(LANGUAGE_NAME).$(SOEXT) '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER) |
| 88 | + ln -sf lib$(LANGUAGE_NAME).$(SOEXTVER) '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER_MAJOR) |
| 89 | + ln -sf lib$(LANGUAGE_NAME).$(SOEXTVER_MAJOR) '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXT) |
88 | 90 |
|
89 | 91 | clean: |
90 | | - rm -f $(OBJ) libtree-sitter-$(PARSER_NAME).a libtree-sitter-$(PARSER_NAME).$(SOEXT) libtree-sitter-$(PARSER_NAME).$(SOEXTVER_MAJOR) libtree-sitter-$(PARSER_NAME).$(SOEXTVER) bindings/c/$(PARSER_NAME).h |
| 92 | + $(RM) $(OBJS) $(LANGUAGE_NAME).pc lib$(LANGUAGE_NAME).a lib$(LANGUAGE_NAME).$(SOEXT) |
91 | 93 |
|
92 | 94 | .PHONY: all install clean |
0 commit comments