mirror of
https://github.com/rkd77/elinks.git
synced 2024-11-04 08:17:17 -05:00
44cf54f0fc
By recursively 'bootstrapping' the builddir specific Makefiles we no longer depend on running make in the srcdir. The problem was pointed out by zas.
161 lines
4.2 KiB
Makefile
161 lines
4.2 KiB
Makefile
### The build commands and verbosity
|
|
|
|
# If we are verbose, we will show commands prefixed by $(Q) (which acts as
|
|
# @ in the non-verbose mode), and we will show the "real" cmds instead of
|
|
# their quiet versions (which are used in the non-verbose mode).
|
|
# Inspired by the Linux kernel build system.
|
|
ifdef V
|
|
Q =
|
|
quiet =
|
|
mquiet = masq_
|
|
else
|
|
Q = @
|
|
quiet = quiet_
|
|
mquiet = quiet_
|
|
endif
|
|
|
|
# Show the command (quiet or non-quiet version based on the assignment
|
|
# just above) and then execute it.
|
|
ncmd = $(if $($(quiet)cmd_$(1)),echo $($(quiet)cmd_$(1)) &&) $(cmd_$(1))
|
|
cmd = @$(if $($(quiet)cmd_$(1)),echo $($(quiet)cmd_$(1)) &&) $(cmd_$(1))
|
|
mcmd = @$(if $($(mquiet)cmd_$(1)),echo $($(mquiet)cmd_$(1)) &&) $(cmd_$(1))
|
|
|
|
quiet_cmd_compile = ' [CC] $(RELPATH)$@'
|
|
masq_cmd_compile = $(COMPILE) -c $<
|
|
cmd_compile = $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
|
|
|
|
# Rule to compile a set of .o files into one .o file
|
|
quiet_cmd_ld_objs = " [LD] $(RELPATH)$@"
|
|
cmd_ld_objs = $(LD) -r -o $@ $(filter $(OBJS), $^) \
|
|
$(foreach subdir,$(sort $(filter-out src,$(SUBDIRS))), \
|
|
`test -e $(subdir)/lib.o && echo $(subdir)/lib.o`)
|
|
|
|
quiet_cmd_link = ' [LINK] $(RELPATH)$@'
|
|
cmd_link = $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)
|
|
|
|
# Recursive make
|
|
quiet_cmd_recmake = "[MAKE $(3)] $(RELPATH)$(2)"
|
|
cmd_recmake = $(MAKE) -C $(2) $(3)
|
|
|
|
quiet_cmd_installdata = " [INSTALL] $(RELPATH)$(2) -> $(3)"
|
|
cmd_installdata = $(INSTALL_DATA) $(2) $(3)
|
|
|
|
quiet_cmd_installprog = " [INSTALL] $(RELPATH)$(2) -> $(3)"
|
|
cmd_installprog = $(INSTALL_PROGRAM) $(2) $(3)
|
|
|
|
|
|
|
|
### Internal build rules
|
|
|
|
DEP_FILES_1 = $(foreach src,$(OBJS),.deps/$(src))
|
|
DEP_FILES = $(DEP_FILES_1:%.o=%.P)
|
|
|
|
DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
|
|
|
|
ifdef OBJS
|
|
-include $(DEP_FILES)
|
|
endif
|
|
|
|
%.o: $(srcdir)%.c
|
|
$(call mcmd,compile)
|
|
@-cp .deps/$(*F).pp .deps/$(*F).P; \
|
|
tr ' ' '\012' < .deps/$(*F).pp \
|
|
| sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
|
|
>> .deps/$(*F).P; \
|
|
rm .deps/$(*F).pp
|
|
|
|
ifdef SUBDIRS-yes
|
|
SUBDIRS += $(SUBDIRS-yes)
|
|
endif
|
|
|
|
ifdef OBJS-yes
|
|
OBJS += $(OBJS-yes)
|
|
endif
|
|
|
|
ifneq ($(findstring cleanall,$(MAKECMDGOALS)),)
|
|
INCLUDE_ALL=1
|
|
endif
|
|
|
|
ifneq ($(findstring init,$(MAKECMDGOALS)),)
|
|
# FIXME: Detect when $(subdir)/Makefile is $(srcdir)/$(subdir)/Makefile
|
|
# and error out so the user won't overwrite the 'master' Makefiles.
|
|
INCLUDE_ALL=1
|
|
endif
|
|
|
|
ifdef INCLUDE_ALL
|
|
ifdef SUBDIRS-no
|
|
SUBDIRS += $(SUBDIRS-no)
|
|
endif
|
|
ifdef OBJS-no
|
|
OBJS += $(OBJS-no)
|
|
endif
|
|
|
|
endif
|
|
|
|
|
|
ifdef OBJS
|
|
lib.o: $(sort $(OBJS)) $(foreach subdir,$(sort $(filter-out src,$(SUBDIRS))), $(wildcard $(subdir)/lib.o))
|
|
$(call cmd,ld_objs)
|
|
|
|
LIB_O = lib.o
|
|
CLEAN += $(OBJS) $(LIB_O)
|
|
endif
|
|
|
|
CLEAN += $(PROG)
|
|
|
|
all-default: $(LIB_O) $(PROGS) $(MAN1) $(MAN5)
|
|
|
|
init-default:
|
|
@$(foreach subdir,$(sort $(SUBDIRS)), \
|
|
$(MKINSTALLDIRS) $(subdir) >/dev/null; \
|
|
echo 'include $(SRC)/$(RELPATH)/$(subdir)/Makefile' > $(subdir)/Makefile;)
|
|
|
|
clean-default:
|
|
-test -z "$(CLEAN)" || $(RM) $(CLEAN)
|
|
|
|
cleanall-default: clean-default
|
|
|
|
install-default: all-default
|
|
ifdef PROGS
|
|
@$(MKINSTALLDIRS) $(DESTDIR)$(bindir)
|
|
@$(foreach file,$(PROGS), \
|
|
$(call ncmd,installprog,$(file),$(DESTDIR)$(bindir));)
|
|
endif
|
|
ifdef MAN1
|
|
@$(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man1
|
|
@$(foreach file,$(MAN1), \
|
|
$(call ncmd,installdata,$(file),$(DESTDIR)$(mandir)/man1);)
|
|
endif
|
|
ifdef MAN5
|
|
@$(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man5
|
|
@$(foreach file,$(MAN5), \
|
|
$(call ncmd,installdata,$(file),$(DESTDIR)$(mandir)/man5);)
|
|
endif
|
|
|
|
# Recursion:
|
|
|
|
.PHONY: all-recursive install-recursive clean-recursive cleanall-recursive init-recursive
|
|
|
|
all-recursive install-recursive clean-recursive cleanall-recursive init-recursive:
|
|
ifdef SUBDIRS
|
|
@$(foreach subdir,$(sort $(SUBDIRS)), \
|
|
$(call ncmd,recmake,$(subdir),$(subst -recursive,,$@)) || exit 1;)
|
|
endif
|
|
|
|
all: all-recursive all-default all-local
|
|
install: install-recursive install-default install-local
|
|
clean: clean-recursive clean-default clean-local
|
|
|
|
cleanall: cleanall-recursive cleanall-default
|
|
init: init-default init-recursive
|
|
|
|
all-local:
|
|
install-local:
|
|
clean-local:
|
|
|
|
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
|
.NOEXPORT:
|
|
|
|
# vim:syntax=make
|