lr/Makefile
2024-02-01 12:42:50 -06:00

103 lines
3.9 KiB
Makefile

#
# VARIABLES/MACROS
#
CFLAGS= -Wfatal-errors -Wall -Wextra -Werror=discarded-qualifiers -Werror=ignored-qualifiers
LDFLAGS= -no-pie -z noexecstack -lm
ASFLAGS=
OBJS= str.o tok.o vec.o lex.o pnode.o reg.o mem.o state.o err.o x86_64.o run.o ir.o gen.o i386.o sprint.o
LIB= liblr.a
TESTS_i386= $(notdir $(basename $(shell find tests/i386/ -name '*.lr'))) $(notdir $(basename $(shell find tests/all/ -name '*.lr')))
TESTS_x86_64= $(notdir $(basename $(shell find tests/x86_64/ -name '*.lr'))) $(notdir $(basename $(shell find tests/all/ -name '*.lr')))
TESTS_CORE= $(notdir $(basename $(shell find tests/core/ -name '*.c')))
LR ?= ./lr
#VALGRIND ?= valgrind --leak-check=full --log-file=$(@D)/valgrind.$*
PREFIX ?= /usr/local
# If DEBUG is defined, use further memory checks
ifdef DEBUG
CFLAGS += -fsanitize=address
LDFLAGS += -fsanitize=address -static-libasan
endif
# If RELEASE is defined, remove debug info, strip executable
ifdef RELEASE
CFLAGS += -g0
LDFLAGS += -s -static
else
CFLAGS += -g3
endif
#
# MAIN TARGETS
#
.PHONY: FORCE
all: lr
liblr.a: $(OBJS)
$(AR) rc $@ $^
version.h:
./scripts/update_ver.sh
lr: version.h main.o liblr.a
$(CC) $(filter-out %.h, $^) -o $@ $(LDFLAGS)
tests_i386: lr tests/i386/bin $(addprefix tests/i386/bin/, $(TESTS_i386)) $(addprefix tests/i386/bin/, $(TESTS_i386)) FORCE
tests_x86_64: lr tests/x86_64/bin $(addprefix tests/x86_64/bin/, $(TESTS_x86_64)) FORCE
tests: lr tests_i386 tests_x86_64 FORCE
@./tests/dotests.sh tests
tests_core: $(LIB) tests/core/bin $(addprefix tests/core/bin/, $(TESTS_CORE)) FORCE
fails: lr tests_i386 tests_x86_64 FORCE
@./tests/dotests.sh tests --color=always|grep -v OK
#
# IMPLICIT RULES
#
%.o: %.c %.h
$(CC) $< -c $(CFLAGS)
tests/i386/bin tests/x86_64/bin tests/core/bin:
@mkdir $@
tests/core/bin/%: tests/core/%.c $(LIB)
$(CC) $< -o $@ $(CFLAGS) $(LDFLAGS) $(LIB) -I.
tests/x86_64/bin/%.s: tests/x86_64/%.lr lr
$(VALGRIND) $(LR) -m x86_64 -o $@ $<
tests/x86_64/bin/%.s: tests/all/%.lr lr
$(VALGRIND) $(LR) -m x86_64 -o $@ $<
tests/i386/bin/%.s: tests/all/%.lr lr
$(VALGRIND) $(LR) -m i386 -o $@ $<
tests/i386/bin/%.s: tests/i386/%.lr lr
$(VALGRIND) $(LR) -m i386 -o $@ $<
tests/i386/bin/%: tests/i386/bin/%.s
$(CC) -m32 $^ -o $@ $(LDFLAGS)
%.s: %.lr lr
$(LR) $<
%.o: %.s
$(AS) $(ASFLAGS) $< -o $@
%: %.o
$(CC) $^ -o $@ $(LDFLAGS)
#
# HELP, INSTALL, CLEAN
#
/usr/share/bash-completion/completions $(DESTDIR)$(PREFIX)/bin $(DESTDIR)$(PREFIX)/man/man1 $(DESTDIR)$(HOME)/.vim/ftdetect $(DESTDIR)$(HOME)/.vim/syntax:
@mkdir -p $@
help:
@printf "Targets\n"
@printf " all Build lr (default)\n"
@printf " clean Remove build files\n"
@printf " tests Build and run tests\n"
@printf " tests_core Build lib tests\n"
@printf " install_vimfiles Install syntax files in ~/.vim/\n"
@printf " install_shell_completion Install bash completion files in /usr/\n"
install_vimfiles: FORCE | $(DESTDIR)$(HOME)/.vim/ftdetect $(DESTDIR)$(HOME)/.vim/syntax
install -m 644 ./vimfiles/syntax/lr.vim $(DESTDIR)$(HOME)/.vim/syntax/
install -m 644 ./vimfiles/ftdetect/lr.vim $(DESTDIR)$(HOME)/.vim/ftdetect/
completion/lr: completion/lr_template
cd completion && LR=../lr ./make_completion.sh
install_shell_completion: lr completion/lr FORCE | /usr/share/bash-completion/completions
@sed -i "s/ARCHES=.*/ARCHES='$(shell ./lr --list-arches|column)'/" completion/lr
install -m 644 completion/lr /usr/share/bash-completion/completions/
install_docs: FORCE | $(DESTDIR)$(PREFIX)/man/man1
install lr.1 $(DESTDIR)$(PREFIX)/man/man1/
install_all: install install_vimfiles install_shell_completion FORCE
install: lr install_docs $(DESTDIR)$(PREFIX)/bin FORCE
install -m 755 lr $(DESTDIR)$(PREFIX)/bin/
clean:
$(RM) a.out *.o $(OBJS) lr liblr.a $(addprefix tests/x86_64/bin/, *.s *.o $(TESTS_x86_64)) tests/core/bin/* tests/x86_64/bin/* listing version.h completion/lr