# Copyright (c) 2021 B. Atticus Grobe (grobe0ba@gmail.com) # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. AFLAGS ?= CFLAGS ?= CFLAGS += -Iinclude LDFLAGS ?= PREFIX ?= /usr LDFLAGS += '-Wl,-rpath,$$ORIGIN/lib' LIBRARIES = libhw PROGRAMS = example libhw_OBJS = src/hw/hw.c.o libhw_LIBS = example_OBJS = src/example/example.c.o example_LIBS = libhw.a AS = nasm CC = clang CXX = clang++ LD = clang++ .PHONY: all install clean all: $(LIBRARIES:=.a) $(PROGRAMS) depfiles = $($(LIBRARIES)_OBJS:.o=.d) $($(PROGRAMS)_OBJS:.o=.d) libmkfiles = $(LIBRARIES:=.mk) promkfiles = $(PROGRAMS:=.mk) include $(depfiles) include $(libmkfiles) include $(promkfiles) $(depfiles): touch $@ $(libmkfiles): echo '$(@:.mk=.a): $$($(@:.mk=)_OBJS) $$($(@:.mk=)_LIBS)' > $@ echo ' $$(AR) crs $$@ $$($(@:.mk=)_OBJS) $$($(@:.mk=)_LIBS)' >> $@ echo >> $@ echo '$(@:.mk=)-clean:' >> $@ echo ' rm -rf $(@:.mk=.a) $$($(@:.mk=)_OBJS) $$($(@:.mk=)_OBJS:.lo=.d) $$($(@:.mk=)_OBJS:.o=.d)' >> $@ $(promkfiles): echo '$(@:.mk=): $$($(@:.mk=)_OBJS) $$($(@:.mk=)_LIBS)' > $@ echo ' $$(LD) $$(LDFLAGS) -o $$@ $$($(@:.mk=)_OBJS) $$($(@:.mk=)_LIBS)' >> $@ echo >> $@ echo '$(@:.mk=)-clean:' >> $@ echo ' rm -rf $(@:.mk=) $$($(@:.mk=)_OBJS) $$($(@:.mk=)_OBJS:.lo=.d) $$($(@:.mk=)_OBJS:.o=.d)' >> $@ %.S.o: %.S $(AS) -MT $@ -MD -MP -MF $<.d -g -F dwarf -f elf64 -o $@ $< %.c.o: %.c $(CC) $(CFLAGS) -MT $@ -MMD -MP -MF $<.d -c -o $@ $< %.cc.o: %.cc $(CXX) $(CFLAGS) -MT $@ -MMD -MP -MF $<.d -c -o $@ $< install: $(PROGRAMS) $(LIBRARIES:=.a) install -d -m755 $(PREFIX)/bin install -d -m755 $(PREFIX)/lib libtool --mode=install install -m644 $(LIBRARIES:=.a) $(PREFIX)/lib libtool --mode=install install -m755 $(PROGRAMS) $(PREFIX)/bin libtool --finish $(PREFIX)/lib clean: $(MAKE) $(PROGRAMS:=-clean) $(LIBRARIES:=-clean) rm -rf $(libmkfiles) rm -rf $(promkfiles) rm -rf *.mk