| CC ?= clang |
| ifeq "$(ARCH)" "" |
| ARCH = x86_64 |
| endif |
| |
| ifeq "$(OS)" "" |
| OS = $(shell uname -s) |
| endif |
| |
| CFLAGS ?= -g -O0 |
| CWD := $(shell pwd) |
| |
| LIB_PREFIX := libloadunload_ |
| |
| ifeq "$(OS)" "Darwin" |
| CFLAGS += -arch $(ARCH) |
| DS := dsymutil |
| LD_FLAGS := -dynamiclib |
| LIB_A := $(LIB_PREFIX)a.dylib |
| LIB_B := $(LIB_PREFIX)b.dylib |
| LIB_C := $(LIB_PREFIX)c.dylib |
| LIB_D := $(LIB_PREFIX)d.dylib |
| EXEC_PATH := "@executable_path" |
| EXEC_PATH_A := -install_name $(EXEC_PATH)/$(LIB_A) |
| EXEC_PATH_B := -install_name $(EXEC_PATH)/$(LIB_B) |
| EXEC_PATH_C := -install_name $(EXEC_PATH)/$(LIB_C) |
| EXEC_PATH_D := -install_name $(CWD)/$(LIB_D) |
| else |
| CFLAGS += -fPIC |
| LD_FLAGS := -shared |
| LIB_DL := -ldl |
| LIB_A := $(LIB_PREFIX)a.so |
| LIB_B := $(LIB_PREFIX)b.so |
| LIB_C := $(LIB_PREFIX)c.so |
| LIB_D := $(LIB_PREFIX)d.so |
| endif |
| |
| all: a.out $(LIB_A) $(LIB_B) $(LIB_C) $(LIB_D) hidden/$(LIB_D) |
| |
| a.out: main.o $(LIB_D) |
| $(CC) $(CFLAGS) -o a.out main.o -L. -lloadunload_d $(LIB_DL) |
| |
| main.o: main.c |
| $(CC) $(CFLAGS) -c main.c |
| |
| hidden/$(LIB_D): b.o |
| $(CC) $(CFLAGS) $(LD_FLAGS) -o hidden/$(LIB_D) d.o |
| if [ "$(OS)" = "Darwin" ]; then dsymutil -o hidden/$(LIB_D).dSYM hidden/$(LIB_D); fi |
| |
| $(LIB_A): a.o $(LIB_B) |
| $(CC) $(CFLAGS) $(LD_FLAGS) $(EXEC_PATH_A) -o $(LIB_A) a.o -L. -lloadunload_b |
| if [ "$(OS)" = "Darwin" ]; then dsymutil $(LIB_A); fi |
| |
| a.o: a.c |
| $(CC) $(CFLAGS) -c a.c |
| |
| $(LIB_B): b.o |
| $(CC) $(CFLAGS) $(LD_FLAGS) $(EXEC_PATH_B) -o $(LIB_B) b.o |
| if [ "$(OS)" = "Darwin" ]; then dsymutil $(LIB_B); fi |
| |
| b.o: b.c |
| $(CC) $(CFLAGS) -c b.c |
| |
| $(LIB_C): c.o |
| $(CC) $(CFLAGS) $(LD_FLAGS) $(EXEC_PATH_C) -o $(LIB_C) c.o |
| if [ "$(OS)" = "Darwin" ]; then dsymutil $(LIB_C); fi |
| |
| c.o: c.c |
| $(CC) $(CFLAGS) -c c.c |
| |
| $(LIB_D): d.o |
| $(CC) $(CFLAGS) $(LD_FLAGS) $(EXEC_PATH_D) -o $(LIB_D) d.o |
| if [ "$(OS)" = "Darwin" ]; then dsymutil $(LIB_D); fi |
| |
| d.o: d.c |
| $(CC) $(CFLAGS) -c d.c |
| |
| clean: |
| rm -rf *.o *~ *.dylib *.so a.out *.dSYM hidden/* |