forked from Aegisub/Aegisub
-
Notifications
You must be signed in to change notification settings - Fork 48
/
Makefile.target
121 lines (101 loc) · 4.03 KB
/
Makefile.target
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
ifneq (yes, $(INCLUDING_CHILD_MAKEFILES))
COMMANDS := all install clean distclean test depclean osx-bundle osx-dmg test-automation test-libaegisub
.PHONY: $(COMMANDS)
.DEFAULT_GOAL := all
# Would be nice to move this somewhere else (Makefile.inc?)
ifeq (yes, $(BUILD_DARWIN))
CFLAGS += -mmacosx-version-min=10.10 -gfull -DLUAJIT_ENABLE_GC64
CXXFLAGS += -mmacosx-version-min=10.10 -gfull -DLUAJIT_ENABLE_GC64
LDFLAGS += -mmacosx-version-min=10.10 -Wl,-dead_strip
LIB_SHARED_LINK = $(LIB_SHARED_LINK_OSX)
endif
LIB_TARGETS := $(addprefix $(TOP)lib/,$(LIB:%=lib%.a))
# Handle per-target flags in the form foo_CFLAGS := -w by mapping them to all
# of the objects a target depends on. This has potentially dumb results if
# multiple targets use a single object file, so don't do that.
define set_target_flags
OBJ += $($1_OBJ)
$($1_OBJ): CPPFLAGS := $(CPPFLAGS) $($1_CPPFLAGS)
$($1_OBJ): CXXFLAGS := $(CXXFLAGS) $($1_CXXFLAGS)
$($1_OBJ): OBJCXXFLAGS := $(CXXFLAGS) $($1_CXXFLAGS)
ifeq (yes, $(PRECOMPILED_HEADER))
ifdef $1_PCH
CLEANFILES += $($1_PCH).gch
$($1_OBJ): CXXFLAGS += -include $($1_PCH) $(PCHFLAGS)
$($1_OBJ): $($1_PCH).gch
$($1_PCH).gch: $($1_PCH)
$($1_PCH).gch: CPPFLAGS := $(CPPFLAGS) $($1_CPPFLAGS)
$($1_PCH).gch: CXXFLAGS := $(CXXFLAGS) $($1_CXXFLAGS)
else
$($1_OBJ): CXXFLAGS += -include acconf.h
endif
else
$($1_OBJ): CXXFLAGS += -include acconf.h
endif
endef
$(foreach target,$(LIB),$(eval $(call set_target_flags,$(target),$(TOP)lib/lib$(target).a)))
$(foreach target,$(PROGRAM),$(eval $(call set_target_flags,$(notdir $(target)),$(target))))
# Create the build and install targets for programs
# Not done with a pattern rule since the pattern would be just %: and doing that
# leads to make trying to use gcc to make any nonexistent targets rather than
# erroring
define create_program_targets
ifdef $1_INSTALLNAME
install: $(DESTDIR)$(P_BINDIR)/$($1_INSTALLNAME)
$(DESTDIR)$(P_BINDIR)/$($1_INSTALLNAME): $(dir $2)$($1_INSTALLNAME)
@$(BIN_MKDIR) -p $(DESTDIR)$(P_BINDIR)
@$(BIN_INSTALL) $(dir $2)$($1_INSTALLNAME) $(DESTDIR)$(P_BINDIR)/$($1_INSTALLNAME)
$(dir $2)$($1_INSTALLNAME): $($1_OBJ)
$(BIN_CXX) -o $(dir $2)$($1_INSTALLNAME) $(LDFLAGS) $($1_OBJ) $(LIBS) $($1_LIBS)
all: $(dir $2)$($1_INSTALLNAME)
else
$2: $($1_OBJ)
$(BIN_CXX) -o $2 $(LDFLAGS) $($1_OBJ) $(LIBS) $($1_LIBS)
all: $2
endif
$(eval CLEANFILES += $(filter-out %/,$2 $(dir $2)$($1_INSTALLNAME)))
endef
$(foreach target,$(PROGRAM),$(eval $(call create_program_targets,$(notdir $(target)),$(target))))
# The dependency files which will be automatically generated by gcc.
# The filter is due to that libraries also appear in OBJ
DEP := $(filter %.d,$(OBJ:%.o=%.d))
# If the goal is a relative path to a file, convert it to an absolute path
ifneq ($(filter-out $(COMMANDS),$(MAKECMDGOALS)),)
ABSGOAL := $(abspath $(MAKECMDGOALS))
ifneq ($(MAKECMDGOALS),$(ABSGOAL))
$(MAKECMDGOALS): $(ABSGOAL) ;
endif
endif
# Primary build targets
all: $(LIB_TARGETS)
clean:
$(BIN_RM) -f $(OBJ) $(CLEANFILES) $(LIB_TARGETS)
distclean: clean
$(BIN_RM) -rf $(DISTCLEANFILES) $(DEP)
depclean: clean
$(BIN_RM) -rf $(DEP)
install:
# The actual build rules
.SUFFIXES:
CXX_CMD = $(CXX_ENV) $(BIN_CXX) $(CFLAGS_DEP) $(CPPFLAGS)
CC_CMD = $(CXX_ENV) $(BIN_CC) $(CFLAGS_DEP) $(CPPFLAGS)
POST_FLAGS = $($@_FLAGS) -c -o $@ $<
%.o: %.c ; $(CC_CMD) $(CFLAGS) $(POST_FLAGS)
%.o: %.cpp ; $(CXX_CMD) $(CXXFLAGS) $(POST_FLAGS)
%.o: %.cxx ; $(CXX_CMD) $(CXXFLAGS) $(POST_FLAGS)
%.o: %.cc ; $(CXX_CMD) $(CXXFLAGS) $(POST_FLAGS)
%.o: %.mm ; $(CXX_CMD) $(OBJCXXFLAGS) $(POST_FLAGS)
%.o: %.m ; $(CC_CMD) $(CFLAGS) -fmodules $(POST_FLAGS)
%.gch: %
@$(BIN_RM) -f $@
$(CXX_ENV) $(BIN_CXX) $(CPPFLAGS) $(CXXFLAGS) -x c++-header $<
.SECONDEXPANSION:
# Libraries contain all object files they depend on (but they may depend on other files)
# Not using libtool on OS X because it has an unsilenceable warning about a
# compatibility issue with BSD 4.3 (wtf)
lib%.a: $$($$(*F)_OBJ)
@$(BIN_MKDIR_P) $(dir $@)
$(BIN_AR) cru $@ $(filter %.o,$^)
$(BIN_RANLIB) $@
-include $(DEP)
endif