forked from phoenix-rtos/libphoenix
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile.rules
78 lines (55 loc) · 2.46 KB
/
Makefile.rules
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#
# Makefile for libphoenix - pattern rules for compiling and linking
#
# Copyright 2012-2018 Phoenix Systems
#
ifeq (,$(TOPDIR))
$(error Only main Makefile can be used for compilation)
endif
CURR_SUFFIX := $(patsubst $(TOPDIR)/%,%,$(abspath $(CURDIR))/)
PREFIX_O := $(BUILD_DIR)/$(CURR_SUFFIX)
PREFIX_A := $(BUILD_DIR)/$(CURR_SUFFIX)
# target install paths, can be provided exterally
PREFIX_PROG ?= $(PREFIX_BUILD)/prog/
PREFIX_PROG_STRIPPED ?= $(BUILD_DIR)/prog.stripped/
ARCH_OBJS := $(patsubst %,$(PREFIX_O)%,$(ARCH_SRCS:.c=.o)) $(patsubst %,$(PREFIX_O)%,$(ARCH_ASMS:.S=.o))
# building programs
PROGS_UNSTRIPPED := $(patsubst %,$(PREFIX_PROG)%,$(PROGS))
PROGS_STRIPPED := $(patsubst %,$(PREFIX_PROG_STRIPPED)%,$(PROGS))
PROGS_BASE_OBJS := $(patsubst %,$(PREFIX_O)%,$(PROGS:=.o))
PROGS_OBJS := $(patsubst %,$(PREFIX_O)%,$(PROGS_SRCS:.c=.o))
# suppress 'nothing to be done', prevent to delete intermediate files
all: $(ARCH) $(PROGS_UNSTRIPPED) $(PROGS_STRIPPED) $(PROGS_BASE_OBJS) $(PROGS_OBJS)
@echo >/dev/null;
# add include path for auto-generated files
CFLAGS += -I"$(BUILD_DIR)/$(CURR_SUFFIX)"
# try to find LDLIBS in toolchain/provided search paths to add dependencies
PSMK_LDPATH := $(subst ",,$(patsubst -L%,%,$(filter -L%,$(LDFLAGS)))) $(shell $(CC) $(CFLAGS) -print-search-dirs |grep "libraries: " |tr : " ")
PSMK_RESOLVED_LDLIBS := $(filter-out -l%,$(LDLIBS)) $(foreach lib,$(patsubst -l%,lib%.a,$(LDLIBS)),$(foreach ldpath,$(PSMK_LDPATH),$(wildcard $(ldpath)/$(lib))))
$(PREFIX_O)%.o: %.c
@mkdir -p $(@D)
$(SIL)(printf "CC %s/%-24s\n" "$(notdir $(@D))" "$<")
$(SIL)$(CC) -c $(CFLAGS) "$<" -o "$@"
$(SIL)$(CC) -M -MD -MP -MF $(PREFIX_O)$*.c.d -MT "$@" $(CFLAGS) $<
$(PREFIX_O)%.o: %.S
@mkdir -p $(@D)
$(SIL)(printf "ASM %-24s\n" "$<")
$(SIL)$(CC) -c $(CFLAGS) "$<" -o "$@"
$(SIL)$(CC) -M -MD -MP -MF $(PREFIX_O)$*.S.d -MT "$@" $(CFLAGS) $<
$(PREFIX_A)%.a:
@mkdir -p $(@D),
@(printf "AR %s/%-24s \n" "$(notdir $(@D))" "$(@F)")
$(SIL)$(AR) $(ARFLAGS) $@ $^ 2>/dev/null
$(PREFIX_PROG)%: $(PREFIX_O)%.o $(PROGS_OBJS) $(PSMK_RESOLVED_LDLIBS) $(LIB)
@mkdir -p $(@D)
@(printf "LD %s/%-24s\n" "$(notdir $(@D))" "$(@F)")
$(SIL)$(LD) $(LDFLAGS) -o "$@" $(filter %.o,$^) $(LDLIBS) $(LIB) $(GCCLIB)
$(PREFIX_PROG_STRIPPED)%: $(PREFIX_PROG)%
@mkdir -p $(@D)
@(printf "STR %s/%-24s\n" "$(notdir $(@D))" "$(@F)")
$(SIL)$(STRIP) -s -o "$@" "$<"
$(ARCH): $(ARCH_OBJS)
# include file dependencies
ALL_D := $(wildcard $(PREFIX_O)*.d)
-include $(ALL_D)
.PHONY: all clean