diff --git a/Makefile b/Makefile index 5311fd5..deeefd0 100644 --- a/Makefile +++ b/Makefile @@ -1,29 +1,246 @@ -CC=gcc -CFLAGS=-Wall -g -LDFLAGS= -CFILES=$(wildcard *.c) # CFILES => recompiles everything on a C file change -EXEC=$(basename $(wildcard *.c)) -SOURCES=$(wildcard lib/*.c) -OBJECTS=$(SOURCES:.c=.o) -TESTS=$(addsuffix .test, $(EXEC)) +PACKAGE = 'perfect-os-junk' +VERSION = '0.0.1' -all: $(SOURCES) $(EXEC) +PREFIX := /usr/local +BINDIR := $(PREFIX)/bin +LIBDIR := $(PREFIX)/lib +SHAREDIR := $(PREFIX)/share +INCLUDEDIR := $(PREFIX)/include -$(EXEC): $(OBJECTS) $(CFILES) - $(CC) $(CFLAGS) $(LDFLAGS) $(OBJECTS) $@.c -o $@ +CC := cc +AR := ar +RANLIB := ranlib +CFLAGS := +LDFLAGS := -.c.o: - $(CC) -c $(CFLAGS) $< -o $@ +Q := @ -clean: - -rm $(OBJECTS) +all: libposj init-connection service-test -mrproper: clean - rm $(EXEC) +libposj: libposj.so libposj.a + @: +libposj.install: libposj.so.install libposj.a.install -# to test a binary "prog" : make prog.test +libposj.clean: libposj.so.clean libposj.a.clean -$(TESTS): - valgrind --leak-check=full -v --track-origins=yes ./$(basename $@) +libposj.uninstall: libposj.so.uninstall libposj.a.uninstall + +init-connection: init-connection.o lib/communication.o + @echo ' [LD] init-connection' + $(Q)$(CC) -o init-connection $(LDFLAGS) init-connection.o lib/communication.o + +init-connection.install: init-connection + @echo ' [IN] $(BINDIR)/init-connection' + $(Q)mkdir -p '$(DESTDIR)$(BINDIR)' + $(Q)install -m0755 init-connection $(DESTDIR)$(BINDIR)/init-connection + +init-connection.clean: init-connection.o.clean lib/communication.o.clean + @echo ' [RM] init-connection' + $(Q)rm -f init-connection + +init-connection.uninstall: + @echo ' [RM] $(BINDIR)/init-connection' + $(Q)rm -f '$(DESTDIR)$(BINDIR)/init-connection' + +service-test: service-test.o lib/communication.o + @echo ' [LD] service-test' + $(Q)$(CC) -o service-test $(LDFLAGS) service-test.o lib/communication.o + +service-test.install: service-test + @echo ' [IN] $(BINDIR)/service-test' + $(Q)mkdir -p '$(DESTDIR)$(BINDIR)' + $(Q)install -m0755 service-test $(DESTDIR)$(BINDIR)/service-test + +service-test.clean: service-test.o.clean lib/communication.o.clean + @echo ' [RM] service-test' + $(Q)rm -f service-test + +service-test.uninstall: + @echo ' [RM] $(BINDIR)/service-test' + $(Q)rm -f '$(DESTDIR)$(BINDIR)/service-test' + +libposj.so: lib/communication.o + @echo ' [LD] libposj.so' + $(Q)$(CC) -o libposj.so -shared $(LDFLAGS) lib/communication.o + +libposj.so.install: libposj.so + @echo ' [IN] $(LIBDIR)/libposj.so.0.0.1' + $(Q)mkdir -p '$(DESTDIR)$(LIBDIR)' + $(Q)install -m0755 libposj.so $(DESTDIR)$(LIBDIR)/libposj.so.0.0.1 + @echo ' [LN] $(LIBDIR)/libposj.so.0.0' + $(Q)ln -sf '$(LIBDIR)/libposj.so.0.0.1' '$(DESTDIR)/$(LIBDIR)/libposj.so.0.0' + @echo ' [LN] $(LIBDIR)/libposj.so.0' + $(Q)ln -sf '$(LIBDIR)/libposj.so.0.0.1' '$(DESTDIR)/$(LIBDIR)/libposj.so.0' + @echo ' [LN] $(LIBDIR)/libposj.so' + $(Q)ln -sf '$(LIBDIR)/libposj.so.0.0.1' '$(DESTDIR)/$(LIBDIR)/libposj.so' + +libposj.so.clean: + @echo ' [RM] libposj.so' + $(Q)rm -f libposj.so + +libposj.so.uninstall: + @echo ' [RM] $(LIBDIR)/libposj.so.0.0.1' + $(Q)rm -f '$(DESTDIR)$(LIBDIR)/libposj.so.0.0.1' + @echo ' [RM] $(LIBDIR)/libposj.so.0.0' + $(Q)rm -f '$(DESTDIR)$(LIBDIR)/libposj.so.0.0' + @echo ' [RM] $(LIBDIR)/libposj.so.0' + $(Q)rm -f '$(DESTDIR)$(LIBDIR)/libposj.so.0' + @echo ' [RM] $(LIBDIR)/libposj.so' + $(Q)rm -f '$(DESTDIR)$(LIBDIR)/libposj.so' + +libposj.a: lib/communication.o + @echo ' [LD] libposj.a' + $(Q)$(AR) rc 'libposj.a' lib/communication.o + +libposj.a.install: libposj.a + @echo ' [IN] $(LIBDIR)/libposj.a' + $(Q)mkdir -p '$(DESTDIR)$(LIBDIR)' + $(Q)install -m0755 libposj.a $(DESTDIR)$(LIBDIR)/libposj.a + +libposj.a.clean: + @echo ' [RM] libposj.a' + $(Q)rm -f libposj.a + +libposj.a.uninstall: + @echo ' [RM] $(LIBDIR)/libposj.a' + $(Q)rm -f '$(DESTDIR)$(LIBDIR)/libposj.a' + +init-connection.o: init-connection.c ./lib/communication.h + @echo ' [CC] init-connection.o' + $(Q)$(CC) $(CFLAGS) -c init-connection.c -o init-connection.o + +init-connection.o.install: + +init-connection.o.clean: + @echo ' [RM] init-connection.o' + $(Q)rm -f init-connection.o + +init-connection.o.uninstall: + +lib/communication.o: lib/communication.c lib/communication.h + @echo ' [CC] lib/communication.o' + $(Q)$(CC) $(CFLAGS) -fPIC -c lib/communication.c -fPIC -o lib/communication.o + +lib/communication.o.install: + +lib/communication.o.clean: + @echo ' [RM] lib/communication.o' + $(Q)rm -f lib/communication.o + +lib/communication.o.uninstall: + +service-test.o: service-test.c ./lib/communication.h + @echo ' [CC] service-test.o' + $(Q)$(CC) $(CFLAGS) -c service-test.c -o service-test.o + +service-test.o.install: + +service-test.o.clean: + @echo ' [RM] service-test.o' + $(Q)rm -f service-test.o + +service-test.o.uninstall: + +$(DESTDIR)$(PREFIX): + @echo ' [DIR] $(PREFIX)' + $(Q)mkdir -p $(DESTDIR)$(PREFIX) +$(DESTDIR)$(BINDIR): + @echo ' [DIR] $(BINDIR)' + $(Q)mkdir -p $(DESTDIR)$(BINDIR) +$(DESTDIR)$(LIBDIR): + @echo ' [DIR] $(LIBDIR)' + $(Q)mkdir -p $(DESTDIR)$(LIBDIR) +$(DESTDIR)$(SHAREDIR): + @echo ' [DIR] $(SHAREDIR)' + $(Q)mkdir -p $(DESTDIR)$(SHAREDIR) +$(DESTDIR)$(INCLUDEDIR): + @echo ' [DIR] $(INCLUDEDIR)' + $(Q)mkdir -p $(DESTDIR)$(INCLUDEDIR) +install: subdirs.install libposj.install init-connection.install service-test.install libposj.so.install libposj.a.install init-connection.o.install lib/communication.o.install service-test.o.install lib/communication.o.install lib/communication.o.install lib/communication.o.install + @: + +subdirs.install: + +uninstall: subdirs.uninstall libposj.uninstall init-connection.uninstall service-test.uninstall libposj.so.uninstall libposj.a.uninstall init-connection.o.uninstall lib/communication.o.uninstall service-test.o.uninstall lib/communication.o.uninstall lib/communication.o.uninstall lib/communication.o.uninstall + @: + +subdirs.uninstall: + +test: all subdirs subdirs.test + @: + +subdirs.test: + +clean: libposj.clean init-connection.clean service-test.clean libposj.so.clean libposj.a.clean init-connection.o.clean lib/communication.o.clean service-test.o.clean lib/communication.o.clean lib/communication.o.clean lib/communication.o.clean + +distclean: clean + +dist: dist-gz dist-xz dist-bz2 + $(Q)rm -- $(PACKAGE)-$(VERSION) + +distdir: + $(Q)rm -rf -- $(PACKAGE)-$(VERSION) + $(Q)ln -s -- . $(PACKAGE)-$(VERSION) + +dist-gz: $(PACKAGE)-$(VERSION).tar.gz +$(PACKAGE)-$(VERSION).tar.gz: distdir + @echo ' [TAR] $(PACKAGE)-$(VERSION).tar.gz' + $(Q)tar czf $(PACKAGE)-$(VERSION).tar.gz \ + $(PACKAGE)-$(VERSION)/init-connection.c \ + $(PACKAGE)-$(VERSION)/service-test.c \ + $(PACKAGE)-$(VERSION)/lib/communication.c \ + $(PACKAGE)-$(VERSION)/lib/communication.h + +dist-xz: $(PACKAGE)-$(VERSION).tar.xz +$(PACKAGE)-$(VERSION).tar.xz: distdir + @echo ' [TAR] $(PACKAGE)-$(VERSION).tar.xz' + $(Q)tar cJf $(PACKAGE)-$(VERSION).tar.xz \ + $(PACKAGE)-$(VERSION)/init-connection.c \ + $(PACKAGE)-$(VERSION)/service-test.c \ + $(PACKAGE)-$(VERSION)/lib/communication.c \ + $(PACKAGE)-$(VERSION)/lib/communication.h + +dist-bz2: $(PACKAGE)-$(VERSION).tar.bz2 +$(PACKAGE)-$(VERSION).tar.bz2: distdir + @echo ' [TAR] $(PACKAGE)-$(VERSION).tar.bz2' + $(Q)tar cjf $(PACKAGE)-$(VERSION).tar.bz2 \ + $(PACKAGE)-$(VERSION)/init-connection.c \ + $(PACKAGE)-$(VERSION)/service-test.c \ + $(PACKAGE)-$(VERSION)/lib/communication.c \ + $(PACKAGE)-$(VERSION)/lib/communication.h + +help: + @echo ' :: perfect-os-junk-0.0.1' + @echo '' + @echo 'Generic targets:' + @echo ' - help Prints this help message.' + @echo ' - all Builds all targets.' + @echo ' - dist Creates tarballs of the files of the project.' + @echo ' - install Installs the project.' + @echo ' - clean Removes compiled files.' + @echo ' - uninstall Deinstalls the project.' + @echo '' + @echo 'CLI-modifiable variables:' + @echo ' - CC ${CC}' + @echo ' - CFLAGS ${CFLAGS}' + @echo ' - LDFLAGS ${LDFLAGS}' + @echo ' - DESTDIR ${DESTDIR}' + @echo ' - PREFIX ${PREFIX}' + @echo ' - BINDIR ${BINDIR}' + @echo ' - LIBDIR ${LIBDIR}' + @echo ' - SHAREDIR ${SHAREDIR}' + @echo ' - INCLUDEDIR ${INCLUDEDIR}' + @echo '' + @echo 'Project targets: ' + @echo ' - libposj library' + @echo ' - init-connectionbinary' + @echo ' - service-test binary' + @echo '' + @echo 'Makefile options:' + @echo ' - gnu: true' + @echo ' - colors: true' + @echo '' + @echo 'Rebuild the Makefile with:' + @echo ' zsh ./build.zsh -c -g' +.PHONY: all subdirs clean distclean dist install uninstall help -test: all $(TESTS) diff --git a/project.zsh b/project.zsh new file mode 100644 index 0000000..0a4e283 --- /dev/null +++ b/project.zsh @@ -0,0 +1,14 @@ + +package=perfect-os-junk +version=0.0.1 + +targets=(libposj) +type[libposj]=library +sources[libposj]="$(echo lib/*.c)" + +for i in *.c; do + targets+=(${i%.c}) + sources[${i%.c}]="$i $(echo lib/*.c)" + type[${i%.c}]=binary +done +