|
| 1 | +ifeq ($(OS),Windows_NT) |
| 2 | +$(error Windows is not supported) |
| 3 | +endif |
| 4 | + |
| 5 | +LANGUAGE_NAME := tree-sitter-elixir |
| 6 | +HOMEPAGE_URL := https://github.com/elixir-lang/tree-sitter-elixir |
1 | 7 | VERSION := 0.3.4 |
2 | 8 |
|
3 | | -# Repository |
| 9 | +# repository |
4 | 10 | SRC_DIR := src |
5 | 11 |
|
6 | | -PARSER_REPO_URL := $(shell git -C $(SRC_DIR) remote get-url origin ) |
7 | | - |
8 | | -ifeq (, $(PARSER_NAME)) |
9 | | - PARSER_NAME := $(shell basename $(PARSER_REPO_URL)) |
10 | | - PARSER_NAME := $(subst tree-sitter-,,$(PARSER_NAME)) |
11 | | - PARSER_NAME := $(subst .git,,$(PARSER_NAME)) |
12 | | -endif |
13 | | - |
14 | | -ifeq (, $(PARSER_URL)) |
15 | | - PARSER_URL := $(subst :,/,$(PARSER_REPO_URL)) |
16 | | - PARSER_URL := $(subst git@,https://,$(PARSER_URL)) |
17 | | - PARSER_URL := $(subst .git,,$(PARSER_URL)) |
18 | | -endif |
19 | | - |
20 | | -UPPER_PARSER_NAME := $(shell echo $(PARSER_NAME) | tr a-z A-Z ) |
| 12 | +TS ?= tree-sitter |
21 | 13 |
|
22 | 14 | # install directory layout |
23 | 15 | PREFIX ?= /usr/local |
24 | 16 | INCLUDEDIR ?= $(PREFIX)/include |
25 | 17 | LIBDIR ?= $(PREFIX)/lib |
26 | 18 | PCLIBDIR ?= $(LIBDIR)/pkgconfig |
27 | 19 |
|
28 | | -# collect C++ sources, and link if necessary |
29 | | -CPPSRC := $(wildcard $(SRC_DIR)/*.cc) |
| 20 | +# source/object files |
| 21 | +PARSER := $(SRC_DIR)/parser.c |
| 22 | +EXTRAS := $(filter-out $(PARSER),$(wildcard $(SRC_DIR)/*.c)) |
| 23 | +OBJS := $(patsubst %.c,%.o,$(PARSER) $(EXTRAS)) |
30 | 24 |
|
31 | | -ifeq (, $(CPPSRC)) |
32 | | - ADDITIONALLIBS := |
33 | | -else |
34 | | - ADDITIONALLIBS := -lc++ |
35 | | -endif |
36 | | - |
37 | | -# collect sources |
38 | | -SRC := $(wildcard $(SRC_DIR)/*.c) |
39 | | -SRC += $(CPPSRC) |
40 | | -OBJ := $(addsuffix .o,$(basename $(SRC))) |
| 25 | +# flags |
| 26 | +ARFLAGS ?= rcs |
| 27 | +override CFLAGS += -I$(SRC_DIR) -std=c11 -fPIC |
41 | 28 |
|
42 | 29 | # ABI versioning |
43 | | -SONAME_MAJOR := 0 |
44 | | -SONAME_MINOR := 0 |
45 | | - |
46 | | -CFLAGS ?= -O3 -Wall -Wextra -I$(SRC_DIR) |
47 | | -CXXFLAGS ?= -O3 -Wall -Wextra -I$(SRC_DIR) |
48 | | -override CFLAGS += -std=gnu99 -fPIC |
49 | | -override CXXFLAGS += -fPIC |
| 30 | +SONAME_MAJOR = $(shell sed -n 's/\#define LANGUAGE_VERSION //p' $(PARSER)) |
| 31 | +SONAME_MINOR = $(word 1,$(subst ., ,$(VERSION))) |
50 | 32 |
|
51 | 33 | # OS-specific bits |
52 | 34 | ifeq ($(shell uname),Darwin) |
53 | 35 | SOEXT = dylib |
54 | | - SOEXTVER_MAJOR = $(SONAME_MAJOR).dylib |
55 | | - SOEXTVER = $(SONAME_MAJOR).$(SONAME_MINOR).dylib |
56 | | - LINKSHARED := $(LINKSHARED)-dynamiclib -Wl, |
57 | | - ifneq ($(ADDITIONALLIBS),) |
58 | | - LINKSHARED := $(LINKSHARED)$(ADDITIONALLIBS), |
59 | | - endif |
60 | | - LINKSHARED := $(LINKSHARED)-install_name,$(LIBDIR)/libtree-sitter-$(PARSER_NAME).$(SONAME_MAJOR).dylib,-rpath,@executable_path/../Frameworks |
| 36 | + SOEXTVER_MAJOR = $(SONAME_MAJOR).$(SOEXT) |
| 37 | + SOEXTVER = $(SONAME_MAJOR).$(SONAME_MINOR).$(SOEXT) |
| 38 | + LINKSHARED = -dynamiclib -Wl,-install_name,$(LIBDIR)/lib$(LANGUAGE_NAME).$(SOEXTVER),-rpath,@executable_path/../Frameworks |
61 | 39 | else |
62 | 40 | SOEXT = so |
63 | | - SOEXTVER_MAJOR = so.$(SONAME_MAJOR) |
64 | | - SOEXTVER = so.$(SONAME_MAJOR).$(SONAME_MINOR) |
65 | | - LINKSHARED := $(LINKSHARED)-shared -Wl, |
66 | | - ifneq ($(ADDITIONALLIBS),) |
67 | | - LINKSHARED := $(LINKSHARED)$(ADDITIONALLIBS), |
68 | | - endif |
69 | | - LINKSHARED := $(LINKSHARED)-soname,libtree-sitter-$(PARSER_NAME).so.$(SONAME_MAJOR) |
| 41 | + SOEXTVER_MAJOR = $(SOEXT).$(SONAME_MAJOR) |
| 42 | + SOEXTVER = $(SOEXT).$(SONAME_MAJOR).$(SONAME_MINOR) |
| 43 | + LINKSHARED = -shared -Wl,-soname,lib$(LANGUAGE_NAME).$(SOEXTVER) |
70 | 44 | endif |
71 | | -ifneq (,$(filter $(shell uname),FreeBSD NetBSD DragonFly)) |
| 45 | +ifneq ($(filter $(shell uname),FreeBSD NetBSD DragonFly),) |
72 | 46 | PCLIBDIR := $(PREFIX)/libdata/pkgconfig |
73 | 47 | endif |
74 | 48 |
|
75 | | -all: libtree-sitter-$(PARSER_NAME).a libtree-sitter-$(PARSER_NAME).$(SOEXTVER) bindings/c/$(PARSER_NAME).h bindings/c/tree-sitter-$(PARSER_NAME).pc |
| 49 | +all: lib$(LANGUAGE_NAME).a lib$(LANGUAGE_NAME).$(SOEXT) $(LANGUAGE_NAME).pc |
76 | 50 |
|
77 | | -libtree-sitter-$(PARSER_NAME).a: $(OBJ) |
78 | | - $(AR) rcs $@ $^ |
| 51 | +lib$(LANGUAGE_NAME).a: $(OBJS) |
| 52 | + $(AR) $(ARFLAGS) $@ $^ |
79 | 53 |
|
80 | | -libtree-sitter-$(PARSER_NAME).$(SOEXTVER): $(OBJ) |
| 54 | +lib$(LANGUAGE_NAME).$(SOEXT): $(OBJS) |
81 | 55 | $(CC) $(LDFLAGS) $(LINKSHARED) $^ $(LDLIBS) -o $@ |
82 | | - ln -sf $@ libtree-sitter-$(PARSER_NAME).$(SOEXT) |
83 | | - ln -sf $@ libtree-sitter-$(PARSER_NAME).$(SOEXTVER_MAJOR) |
84 | | - |
85 | | -bindings/c/$(PARSER_NAME).h: |
86 | | - sed -e 's|@UPPER_PARSERNAME@|$(UPPER_PARSER_NAME)|' \ |
87 | | - -e 's|@PARSERNAME@|$(PARSER_NAME)|' \ |
88 | | - bindings/c/tree-sitter.h.in > $@ |
89 | | - |
90 | | -bindings/c/tree-sitter-$(PARSER_NAME).pc: |
91 | | - sed -e 's|@LIBDIR@|$(LIBDIR)|;s|@INCLUDEDIR@|$(INCLUDEDIR)|;s|@VERSION@|$(VERSION)|' \ |
92 | | - -e 's|=$(PREFIX)|=$${prefix}|' \ |
93 | | - -e 's|@PREFIX@|$(PREFIX)|' \ |
94 | | - -e 's|@ADDITIONALLIBS@|$(ADDITIONALLIBS)|' \ |
95 | | - -e 's|@PARSERNAME@|$(PARSER_NAME)|' \ |
96 | | - -e 's|@PARSERURL@|$(PARSER_URL)|' \ |
97 | | - bindings/c/tree-sitter.pc.in > $@ |
| 56 | +ifneq ($(STRIP),) |
| 57 | + $(STRIP) $@ |
| 58 | +endif |
| 59 | + |
| 60 | +$(LANGUAGE_NAME).pc: bindings/c/$(LANGUAGE_NAME).pc.in |
| 61 | + sed -e 's|@PROJECT_VERSION@|$(VERSION)|' \ |
| 62 | + -e 's|@CMAKE_INSTALL_LIBDIR@|$(LIBDIR:$(PREFIX)/%=%)|' \ |
| 63 | + -e 's|@CMAKE_INSTALL_INCLUDEDIR@|$(INCLUDEDIR:$(PREFIX)/%=%)|' \ |
| 64 | + -e 's|@PROJECT_DESCRIPTION@|$(DESCRIPTION)|' \ |
| 65 | + -e 's|@PROJECT_HOMEPAGE_URL@|$(HOMEPAGE_URL)|' \ |
| 66 | + -e 's|@CMAKE_INSTALL_PREFIX@|$(PREFIX)|' $< > $@ |
| 67 | + |
| 68 | +$(PARSER): $(SRC_DIR)/grammar.json |
| 69 | + $(TS) generate $^ |
98 | 70 |
|
99 | 71 | install: all |
100 | | - install -d '$(DESTDIR)$(LIBDIR)' |
101 | | - install -m755 libtree-sitter-$(PARSER_NAME).a '$(DESTDIR)$(LIBDIR)'/libtree-sitter-$(PARSER_NAME).a |
102 | | - install -m755 libtree-sitter-$(PARSER_NAME).$(SOEXTVER) '$(DESTDIR)$(LIBDIR)'/libtree-sitter-$(PARSER_NAME).$(SOEXTVER) |
103 | | - ln -sf libtree-sitter-$(PARSER_NAME).$(SOEXTVER) '$(DESTDIR)$(LIBDIR)'/libtree-sitter-$(PARSER_NAME).$(SOEXTVER_MAJOR) |
104 | | - ln -sf libtree-sitter-$(PARSER_NAME).$(SOEXTVER) '$(DESTDIR)$(LIBDIR)'/libtree-sitter-$(PARSER_NAME).$(SOEXT) |
105 | | - install -d '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter |
106 | | - install -m644 bindings/c/$(PARSER_NAME).h '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter/ |
107 | | - install -d '$(DESTDIR)$(PCLIBDIR)' |
108 | | - install -m644 bindings/c/tree-sitter-$(PARSER_NAME).pc '$(DESTDIR)$(PCLIBDIR)'/ |
| 72 | + install -d '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter '$(DESTDIR)$(PCLIBDIR)' '$(DESTDIR)$(LIBDIR)' |
| 73 | + install -m644 bindings/c/$(LANGUAGE_NAME).h '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter/$(LANGUAGE_NAME).h |
| 74 | + install -m644 $(LANGUAGE_NAME).pc '$(DESTDIR)$(PCLIBDIR)'/$(LANGUAGE_NAME).pc |
| 75 | + install -m644 lib$(LANGUAGE_NAME).a '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).a |
| 76 | + install -m755 lib$(LANGUAGE_NAME).$(SOEXT) '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER) |
| 77 | + ln -sf lib$(LANGUAGE_NAME).$(SOEXTVER) '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER_MAJOR) |
| 78 | + ln -sf lib$(LANGUAGE_NAME).$(SOEXTVER_MAJOR) '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXT) |
| 79 | + |
| 80 | +uninstall: |
| 81 | + $(RM) '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).a \ |
| 82 | + '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER) \ |
| 83 | + '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER_MAJOR) \ |
| 84 | + '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXT) \ |
| 85 | + '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter/$(LANGUAGE_NAME).h \ |
| 86 | + '$(DESTDIR)$(PCLIBDIR)'/$(LANGUAGE_NAME).pc |
109 | 87 |
|
110 | 88 | clean: |
111 | | - rm -f $(OBJ) libtree-sitter-$(PARSER_NAME).a libtree-sitter-$(PARSER_NAME).$(SOEXT) libtree-sitter-$(PARSER_NAME).$(SOEXTVER_MAJOR) libtree-sitter-$(PARSER_NAME).$(SOEXTVER) |
112 | | - rm -f bindings/c/$(PARSER_NAME).h bindings/c/tree-sitter-$(PARSER_NAME).pc |
| 89 | + $(RM) $(OBJS) $(LANGUAGE_NAME).pc lib$(LANGUAGE_NAME).a lib$(LANGUAGE_NAME).$(SOEXT) |
| 90 | + |
| 91 | +test: |
| 92 | + $(TS) test |
113 | 93 |
|
114 | | -.PHONY: all install clean |
| 94 | +.PHONY: all install uninstall clean test |
0 commit comments