| ifeq ($(OS),Windows_NT) |
| $(error Windows is not supported) |
| endif |
| |
| LANGUAGE_NAME := tree-sitter-devicetree |
| HOMEPAGE_URL := https://github.com/joelspadin/tree-sitter-devicetree |
| VERSION := 0.15.0 |
| |
| # repository |
| SRC_DIR := src |
| |
| TS ?= tree-sitter |
| |
| # install directory layout |
| PREFIX ?= /usr/local |
| DATADIR ?= $(PREFIX)/share |
| INCLUDEDIR ?= $(PREFIX)/include |
| LIBDIR ?= $(PREFIX)/lib |
| PCLIBDIR ?= $(LIBDIR)/pkgconfig |
| |
| # source/object files |
| PARSER := $(SRC_DIR)/parser.c |
| EXTRAS := $(filter-out $(PARSER),$(wildcard $(SRC_DIR)/*.c)) |
| OBJS := $(patsubst %.c,%.o,$(PARSER) $(EXTRAS)) |
| |
| # flags |
| ARFLAGS ?= rcs |
| override CFLAGS += -I$(SRC_DIR) -std=c11 -fPIC |
| |
| # ABI versioning |
| SONAME_MAJOR = $(shell sed -n 's/\#define LANGUAGE_VERSION //p' $(PARSER)) |
| SONAME_MINOR = $(word 1,$(subst ., ,$(VERSION))) |
| |
| # OS-specific bits |
| ifeq ($(shell uname),Darwin) |
| SOEXT = dylib |
| SOEXTVER_MAJOR = $(SONAME_MAJOR).$(SOEXT) |
| SOEXTVER = $(SONAME_MAJOR).$(SONAME_MINOR).$(SOEXT) |
| LINKSHARED = -dynamiclib -Wl,-install_name,$(LIBDIR)/lib$(LANGUAGE_NAME).$(SOEXTVER),-rpath,@executable_path/../Frameworks |
| else |
| SOEXT = so |
| SOEXTVER_MAJOR = $(SOEXT).$(SONAME_MAJOR) |
| SOEXTVER = $(SOEXT).$(SONAME_MAJOR).$(SONAME_MINOR) |
| LINKSHARED = -shared -Wl,-soname,lib$(LANGUAGE_NAME).$(SOEXTVER) |
| endif |
| ifneq ($(filter $(shell uname),FreeBSD NetBSD DragonFly),) |
| PCLIBDIR := $(PREFIX)/libdata/pkgconfig |
| endif |
| |
| all: lib$(LANGUAGE_NAME).a lib$(LANGUAGE_NAME).$(SOEXT) $(LANGUAGE_NAME).pc |
| |
| lib$(LANGUAGE_NAME).a: $(OBJS) |
| $(AR) $(ARFLAGS) $@ $^ |
| |
| lib$(LANGUAGE_NAME).$(SOEXT): $(OBJS) |
| $(CC) $(LDFLAGS) $(LINKSHARED) $^ $(LDLIBS) -o $@ |
| ifneq ($(STRIP),) |
| $(STRIP) $@ |
| endif |
| |
| $(LANGUAGE_NAME).pc: bindings/c/$(LANGUAGE_NAME).pc.in |
| sed -e 's|@PROJECT_VERSION@|$(VERSION)|' \ |
| -e 's|@CMAKE_INSTALL_LIBDIR@|$(LIBDIR:$(PREFIX)/%=%)|' \ |
| -e 's|@CMAKE_INSTALL_INCLUDEDIR@|$(INCLUDEDIR:$(PREFIX)/%=%)|' \ |
| -e 's|@PROJECT_DESCRIPTION@|$(DESCRIPTION)|' \ |
| -e 's|@PROJECT_HOMEPAGE_URL@|$(HOMEPAGE_URL)|' \ |
| -e 's|@CMAKE_INSTALL_PREFIX@|$(PREFIX)|' $< > $@ |
| |
| $(PARSER): $(SRC_DIR)/grammar.json |
| $(TS) generate $^ |
| |
| install: all |
| install -d '$(DESTDIR)$(DATADIR)'/tree-sitter/queries/devicetree '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter '$(DESTDIR)$(PCLIBDIR)' '$(DESTDIR)$(LIBDIR)' |
| install -m644 bindings/c/tree_sitter/$(LANGUAGE_NAME).h '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter/$(LANGUAGE_NAME).h |
| install -m644 $(LANGUAGE_NAME).pc '$(DESTDIR)$(PCLIBDIR)'/$(LANGUAGE_NAME).pc |
| install -m644 lib$(LANGUAGE_NAME).a '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).a |
| install -m755 lib$(LANGUAGE_NAME).$(SOEXT) '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER) |
| ln -sf lib$(LANGUAGE_NAME).$(SOEXTVER) '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER_MAJOR) |
| ln -sf lib$(LANGUAGE_NAME).$(SOEXTVER_MAJOR) '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXT) |
| ifneq ($(wildcard queries/*.scm),) |
| install -m644 queries/*.scm '$(DESTDIR)$(DATADIR)'/tree-sitter/queries/devicetree |
| endif |
| |
| uninstall: |
| $(RM) '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).a \ |
| '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER) \ |
| '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER_MAJOR) \ |
| '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXT) \ |
| '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter/$(LANGUAGE_NAME).h \ |
| '$(DESTDIR)$(PCLIBDIR)'/$(LANGUAGE_NAME).pc |
| $(RM) -r '$(DESTDIR)$(DATADIR)'/tree-sitter/queries/devicetree |
| |
| clean: |
| $(RM) $(OBJS) $(LANGUAGE_NAME).pc lib$(LANGUAGE_NAME).a lib$(LANGUAGE_NAME).$(SOEXT) |
| |
| test: |
| $(TS) test |
| |
| .PHONY: all install uninstall clean test |