Merge with git+ssh://pasky.or.cz/srv/git/elinks.git
[elinks.git] / Makefile.lib
bloba81699c544f12c721a37d079a6d5cf8a7274fc6c
1 ### The build commands and verbosity
3 # Colorize the build.
4 ifdef MAKE_COLOR
5         INFO_COLOR    = $(shell tput setaf 5)
6         CC_COLOR      = $(shell tput setaf 6)
7         LD_COLOR      = $(shell tput setaf 2)
8         PO_COLOR      = $(shell tput setaf 6)
9         LINK_COLOR    = $(shell tput bold;tput setaf 4)
10         INSTALL_COLOR = $(shell tput setaf 3)
11         UNINSTALL_COLOR = $(shell tput setaf 1)
12         END_COLOR     = $(shell tput sgr0)
13 endif
15 # sparse is architecture-neutral, which means that we need to tell it
16 # explicitly what architecture to check for. Fix this up for yours..
17 SPARSE_FLAGS = -D__BIG_ENDIAN__ -D__powerpc__
20 #############################################################################
21 # Build recipies
23 # If we are verbose, we will show the "real" cmds instead of
24 # their quiet versions (which are used in the non-verbose mode).
25 # Inspired by the Linux kernel build system.
26 ifdef V
27         quiet =
28         mquiet = masq_
29         Q =
30 else
31         quiet = quiet_
32         mquiet = quiet_
33         Q = @
34 endif
36 # Show the command (quiet or non-quiet version based on the assignment
37 # just above) and then execute it.
38 ncmd = $(if $($(quiet)cmd_$(1)),echo $($(quiet)cmd_$(1)) &&) $(cmd_$(1))
39 cmd = @$(if $($(quiet)cmd_$(1)),echo $($(quiet)cmd_$(1)) &&) $(cmd_$(1))
40 mcmd = @$(if $($(mquiet)cmd_$(1)),echo $($(mquiet)cmd_$(1)) &&) $(cmd_$(1))
41 ecmd = @$(if $($(mquiet)cmd_$(1)),printf "%-38s " $($(mquiet)cmd_$(1)) &&) $(cmd_$(1))
43 quiet_cmd_compile = '      [$(CC_COLOR)CC$(END_COLOR)]   $(RELPATH)$@'
44  masq_cmd_compile = $(COMPILE) -o $(@) -c $< $(2)
45       cmd_compile = $(COMPILE) -o $(@) -Wp,-MD,.deps/$(*F).pp -c $< $(2)
47 # Rule to compile a set of .o files into one .o file
48 quiet_cmd_ld_objs = "      [$(LD_COLOR)LD$(END_COLOR)]   $(RELPATH)$@"
49       cmd_ld_objs = $(LD) -r -o $@ $(filter $(OBJS), $^) \
50                     $(foreach subdir,$(sort $(filter-out src,$(SUBDIRS))), \
51                             `test -e $(subdir)/$(LIB_O_NAME) && echo $(subdir)/$(LIB_O_NAME)`)
53    quiet_cmd_link = '    [$(LINK_COLOR)LINK$(END_COLOR)]   $(RELPATH)$@'
54          cmd_link = $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)
56  quiet_cmd_sparse = '    [SPARSE]   $(RELPATH)$(2)'
57        cmd_sparse = $(SPARSE) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(SPARSE_FLAGS) $(2)
59 # Recursive make
60 quiet_cmd_recmake = "[$(INFO_COLOR)MAKE $(3)$(END_COLOR)]   $(RELPATH)$(2)"
61       cmd_recmake = $(MAKE) -C $(2) $(3)
63 quiet_cmd_installdata = "     [$(INSTALL_COLOR)INSTALL$(END_COLOR)]   $(RELPATH)$(2) -> $(3)"
64       cmd_installdata = $(INSTALL_DATA) $(2) $(3)
66 # Install a data file from the source (not build) directory
67 quiet_cmd_installsrcdata = "     [$(INSTALL_COLOR)INSTALL$(END_COLOR)]   $(RELPATH)$(2) -> $(3)"
68       cmd_installsrcdata = $(INSTALL_DATA) $(srcdir)$(2) $(3)
70 quiet_cmd_installprog = "     [$(INSTALL_COLOR)INSTALL$(END_COLOR)]   $(RELPATH)$(2) -> $(3)"
71       cmd_installprog = $(INSTALL_PROGRAM) $(2) $(3)
73 quiet_cmd_uninstall = "     [$(UNINSTALL_COLOR)UNINSTALL$(END_COLOR)]   $(3)/$(2)"
74       cmd_uninstall = $(UNINSTALL) $(3)/$(2)
76 #############################################################################
77 # Special handling of conditional variables
79 SUBDIRS += $(SUBDIRS-yes)
80 OBJS    += $(OBJS-yes)
82 ALTDIRS  = $(SUBDIRS-no) $(SUBDIRS-)
83 ALTOBJS  = $(OBJS-no) $(OBJS-)
85 ifneq ($(findstring cleanall,$(MAKECMDGOALS)),)
86 INCLUDE_ALL=1
87 endif
89 ifneq ($(findstring init,$(MAKECMDGOALS)),)
90 INCLUDE_ALL=1
91 ifndef SRC
92 SRC = $(shell cd $(top_srcdir) && pwd)
93 endif
94 endif
96 ifdef INCLUDE_ALL
97 SUBDIRS += $(ALTDIRS)
98 OBJS    += $(ALTOBJS)
99 endif
102 #############################################################################
103 # Internal build rules
105 # All files in $(OBJS) and any $(subdir)/lib.o are linked into lib.o.
106 # Sort them to filter out duplicated and get uniform order.
107 LIB_O_DEPS = \
108  $(sort $(filter-out $(LIB_O_NAME),$(OBJS))) \
109  $(foreach subdir,$(sort $(SUBDIRS)),$(wildcard $(subdir)/$(LIB_O_NAME)))
111 $(LIB_O_NAME): $(LIB_O_DEPS)
112         $(call cmd,ld_objs)
114 DEP_FILES_1 = $(foreach src,$(OBJS),.deps/$(src))
115 DEP_FILES = $(DEP_FILES_1:%.o=%.P)
116 DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
118 ifneq ($(strip $(OBJS)),)
119 -include $(DEP_FILES)
120 ALL_OBJS = $(LIB_O_DEPS) $(LIB_O_NAME)
121 endif
123 %.o: $(srcdir)%.c
124         $(call mcmd,compile)
125         @-if test -e .deps/$(*F).pp; then \
126                 cp .deps/$(*F).pp .deps/$(*F).P; \
127                 tr ' ' '\012' < .deps/$(*F).pp \
128                         | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
129                         >> .deps/$(*F).P; \
130                 rm .deps/$(*F).pp; \
131         fi
133 CLEAN += $(PROGS) $(OBJS) $(LIB_O_NAME)
136 #############################################################################
137 # The main default rules
139 all-default: $(ALL_OBJS) $(PROGS) $(MAN1) $(MAN5)
141 # Ensure that Makefiles in subdirs are created before we recursive into them
142 init-recursive: init-default
144 init-default:
145         @$(foreach subdir,$(sort $(SUBDIRS)), \
146                 $(MKINSTALLDIRS) $(subdir) >/dev/null; \
147                 test -e "$(subdir)/Makefile" \
148                 || echo 'include $(SRC)/$(RELPATH)/$(subdir)/Makefile' > $(subdir)/Makefile;)
150 clean-default cleanall-default:
151         $(Q)-test -z "$(CLEAN)" || $(RM) $(CLEAN)
153 check-default:
154 ifneq ($(SPARSE),)
155         @$(foreach file, $(wildcard *.c), \
156                 $(call ncmd,sparse,$(file));)
157 endif
159 install-default: all-default
160 ifdef PROGS
161         @$(MKINSTALLDIRS) $(DESTDIR)$(bindir)
162         @$(foreach file,$(PROGS), \
163                 $(call ncmd,installprog,$(file),$(DESTDIR)$(bindir));)
164 endif
165 ifdef MAN1
166         @$(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man1
167         @$(foreach file,$(MAN1), \
168                 $(call ncmd,installdata,$(file),$(DESTDIR)$(mandir)/man1);)
169 endif
170 ifdef MAN5
171         @$(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man5
172         @$(foreach file,$(MAN5), \
173                 $(call ncmd,installdata,$(file),$(DESTDIR)$(mandir)/man5);)
174 endif
176 uninstall-default:
177 ifdef PROGS
178         @$(foreach file,$(PROGS), \
179                 $(call ncmd,uninstall,$(file),$(DESTDIR)$(bindir));)
180 endif           
181 ifdef MAN1
182         @$(foreach file,$(MAN1), \
183                 $(call ncmd,uninstall,$(file),$(DESTDIR)$(mandir)/man1);)
184 endif
185 ifdef MAN5
186         @$(foreach file,$(MAN5), \
187                 $(call ncmd,uninstall,$(file),$(DESTDIR)$(mandir)/man5);)
188 endif
189 ##############################################################################
190 # Auto-testing infrastructure
192 test-default:
194 ifdef TEST_PROGS
195 TESTDEPS-$(CONFIG_DEBUG) += $(top_builddir)/src/util/memdebug.o
196 TESTDEPS += $(TESTDEPS-yes)
198 TEST_LIB=$(top_srcdir)/test/libtest.sh
199 export TEST_LIB
201 # This is a very general rule but as long as we don't put test programs in src/
202 # it should work.
203 %: %.o $(TESTDEPS)
204         $(call cmd,link)
206 TESTS = $(wildcard $(srcdir)test-*)
208 $(TESTS): $(addsuffix .o,$(TEST_PROGS)) $(TEST_PROGS)
209         @echo "*** $(notdir $@) ***"; \
210         $(call shellquote,$(SHELL)) $@ $(TEST_OPTS)
212 test-default: $(TESTS)
214 clean-test:
215         @rm -fr trash
217 CLEAN += $(TEST_PROGS) $(addsuffix .o,$(TEST_PROGS))
218 clean-default: clean-test
219 endif
221 .PHONY: $(TESTS)
222 .NOPARALLEL:
225 #############################################################################
226 # Basic recursion and dependencies setup
228 RULES    = all install clean cleanall init check test uninstall
230 RULES_LOCAL = $(addsuffix -local,$(RULES))
231 RULES_REC   = $(addsuffix -recursive,$(RULES))
233 .PHONY: $(RULES) $(RULES_LOCAL) $(RULES_REC) $(addsuffix -default,$(RULES))
235 # The -recursive rules descend all subdirs.
236 # If make -k was used and a sub-Make fails, then keep building the
237 # remaining subdirectories, but return an error at the end.
238 $(RULES_REC):
239 ifneq (,$(findstring k,$(MAKEFLAGS)))
240         @suberr=0; \
241         $(foreach subdir,$(sort $(SUBDIRS)), \
242                 $(call ncmd,recmake,$(subdir),$(subst -recursive,,$@)) || suberr=1;) \
243         exit $$suberr
244 else
245         @$(foreach subdir,$(sort $(SUBDIRS)), \
246                 $(call ncmd,recmake,$(subdir),$(subst -recursive,,$@)) || exit 1;)
247 endif
249 # Dummy -local rules
250 $(RULES_LOCAL):
252 # Default deps
253 rule_deps = $(1)-recursive $(1)-default $(1)-local
254 all:      $(call rule_deps,all)
255 install:  $(call rule_deps,install)
256 clean:    $(call rule_deps,clean)
257 cleanall: $(call rule_deps,cleanall)
258 init:     $(call rule_deps,init)
259 check:    $(call rule_deps,check)
260 test:     $(call rule_deps,test)
261 uninstall: $(call rule_deps,uninstall)
263 #############################################################################
264 # Misc
266 # Tell versions [3.59,3.63) of GNU make to not export all variables.
267 # Otherwise a system limit (for SysV at least) may be exceeded.
268 .NOEXPORT:
270 # Shell quote;
271 # Result of this needs to be placed inside ''
272 # XXX: Placed here because Vim cannot highlight things right afterwards
273 shq = $(subst ','\'',$(1))
274 # This has surrounding ''
275 shellquote = '$(call shq,$(1))'
277 # vim:syntax=make