CROSS_COMPILE ?=
CC ?= gcc
OUT ?= ./
DO_STRIP ?= 0
STRIP ?= $(CROSS_COMPILE)strip
OBJ += threads
OBJ += forkwait
OBJ += sleep
OBJ += getpid
SO += sofile.so
CFLAGS += -Wall
CFLAGS += -Werror
CFLAGS += -g
CFLAGS += -std=c90
LDFLAGS ?=
LDFLAGS += -ldl
SOFLAGS += -shared
SOFLAGS += -fPIC
GCC= $(CROSS_COMPILE)$(CC)
CDIR = $(shell pwd)
ROUT = $(shell realpath --relative-to=${CDIR} ${OUT})/
ENVIRON = $(ROUT).environ
$(shell touch $(ENVIRON)) OCC=$(shell cat $(ENVIRON))
OBJS=$(patsubst %, $(ROUT)%, $(OBJ))
SOS=$(patsubst %, $(ROUT)%, $(SO))
all: condclean $(OBJS) $(SOS) finally
condclean:
if [ "$(OCC)" != "$(CROSS_COMPILE)" ]; then rm -f $(OBJ) $(SO) $(ENVIRON); fi
if [ ! -d $(ROUT) ]; then mkdir $(ROUT); fi
$(ROUT)%: %.c
$(GCC) $(CFLAGS) -o $@ $< $(LDFLAGS)
ifeq ($(DO_STRIP),1)
$(STRIP) $@
endif
$(ROUT)%.so: %.c Makefile
$(GCC) $(CFLAGS) $(SOFLAGS) -o $@ $<
finally:
echo $(CROSS_COMPILE) > $(ENVIRON)
clean:
-rm -f $(OBJS) $(SOS) $(ENVIRON)