2006-05-14 16:07:53 +04:00
|
|
|
# Makefile for QEMU.
|
|
|
|
|
2019-05-26 17:47:47 +03:00
|
|
|
ifneq ($(words $(subst :, ,$(CURDIR))), 1)
|
|
|
|
$(error main directory cannot contain spaces nor colons)
|
|
|
|
endif
|
|
|
|
|
2011-09-16 23:50:43 +04:00
|
|
|
# Always point to the root of the build tree (needs GNU make).
|
|
|
|
BUILD_DIR=$(CURDIR)
|
2011-09-16 00:45:35 +04:00
|
|
|
|
2015-05-22 08:35:07 +03:00
|
|
|
# Before including a proper config-host.mak, assume we are in the source tree
|
|
|
|
SRC_PATH=.
|
|
|
|
|
2020-09-01 19:10:05 +03:00
|
|
|
# Don't use implicit rules or variables
|
|
|
|
# we have explicit rules for everything
|
|
|
|
MAKEFLAGS += -rR
|
|
|
|
|
|
|
|
# Usage: $(call quiet-command,command and args,"NAME","args to print")
|
|
|
|
# This will run "command and args", and either:
|
|
|
|
# if V=1 just print the whole command and args
|
|
|
|
# otherwise print the 'quiet' output in the format " NAME args to print"
|
|
|
|
# NAME should be a short name of the command, 7 letters or fewer.
|
|
|
|
# If called with only a single argument, will print nothing in quiet mode.
|
|
|
|
quiet-command-run = $(if $(V),,$(if $2,printf " %-7s %s\n" $2 $3 && ))$1
|
|
|
|
quiet-@ = $(if $(V),,@)
|
|
|
|
quiet-command = $(quiet-@)$(call quiet-command-run,$1,$2,$3)
|
|
|
|
|
2017-11-21 06:22:47 +03:00
|
|
|
UNCHECKED_GOALS := %clean TAGS cscope ctags dist \
|
2018-01-04 19:05:08 +03:00
|
|
|
help check-help print-% \
|
2019-05-31 09:43:41 +03:00
|
|
|
docker docker-% vm-help vm-test vm-build-%
|
2015-05-22 08:35:07 +03:00
|
|
|
|
2012-03-06 22:50:38 +04:00
|
|
|
# All following code might depend on configuration variables
|
2009-04-15 18:42:57 +04:00
|
|
|
ifneq ($(wildcard config-host.mak),)
|
2009-05-19 19:17:58 +04:00
|
|
|
# Put the all: rule here so that config-host.mak can contain dependencies.
|
2012-07-09 22:36:36 +04:00
|
|
|
all:
|
2006-04-16 16:41:07 +04:00
|
|
|
include config-host.mak
|
2012-10-19 17:54:23 +04:00
|
|
|
|
2017-09-29 13:11:56 +03:00
|
|
|
git-submodule-update:
|
|
|
|
|
|
|
|
.PHONY: git-submodule-update
|
|
|
|
|
2017-11-06 14:08:14 +03:00
|
|
|
git_module_status := $(shell \
|
|
|
|
cd '$(SRC_PATH)' && \
|
|
|
|
GIT="$(GIT)" ./scripts/git-submodule.sh status $(GIT_SUBMODULES); \
|
|
|
|
echo $$?; \
|
|
|
|
)
|
2017-09-29 13:11:56 +03:00
|
|
|
|
|
|
|
ifeq (1,$(git_module_status))
|
2017-10-26 15:52:26 +03:00
|
|
|
ifeq (no,$(GIT_UPDATE))
|
|
|
|
git-submodule-update:
|
|
|
|
$(call quiet-command, \
|
|
|
|
echo && \
|
|
|
|
echo "GIT submodule checkout is out of date. Please run" && \
|
|
|
|
echo " scripts/git-submodule.sh update $(GIT_SUBMODULES)" && \
|
|
|
|
echo "from the source directory checkout $(SRC_PATH)" && \
|
|
|
|
echo && \
|
|
|
|
exit 1)
|
|
|
|
else
|
2017-09-29 13:11:56 +03:00
|
|
|
git-submodule-update:
|
|
|
|
$(call quiet-command, \
|
2017-10-20 17:02:43 +03:00
|
|
|
(cd $(SRC_PATH) && GIT="$(GIT)" ./scripts/git-submodule.sh update $(GIT_SUBMODULES)), \
|
2017-09-29 13:11:56 +03:00
|
|
|
"GIT","$(GIT_SUBMODULES)")
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
2019-06-10 13:05:14 +03:00
|
|
|
export NINJA=./ninjatool
|
|
|
|
|
|
|
|
# Running meson regenerates both build.ninja and ninjatool, and that is
|
|
|
|
# enough to prime the rest of the build.
|
|
|
|
ninjatool: build.ninja
|
|
|
|
|
|
|
|
Makefile.ninja: build.ninja ninjatool
|
2020-09-01 17:20:10 +03:00
|
|
|
./ninjatool -t ninja2make --omit clean dist uninstall cscope TAGS ctags < $< > $@
|
2019-06-10 13:05:14 +03:00
|
|
|
-include Makefile.ninja
|
|
|
|
|
|
|
|
${ninja-targets-c_COMPILER} ${ninja-targets-cpp_COMPILER}: .var.command += -MP
|
|
|
|
|
2020-01-28 16:48:54 +03:00
|
|
|
# If MESON is empty, the rule will be re-evaluated after Makefiles are
|
|
|
|
# reread (and MESON won't be empty anymore).
|
|
|
|
ifneq ($(MESON),)
|
|
|
|
Makefile.mtest: build.ninja scripts/mtest2make.py
|
2020-09-04 17:06:06 +03:00
|
|
|
$(MESON) introspect --targets --tests --benchmarks | $(PYTHON) scripts/mtest2make.py > $@
|
2020-01-28 16:48:54 +03:00
|
|
|
-include Makefile.mtest
|
|
|
|
endif
|
|
|
|
|
2020-09-01 19:10:05 +03:00
|
|
|
Makefile: .git-submodule-status
|
2017-09-29 13:11:58 +03:00
|
|
|
.git-submodule-status: git-submodule-update config-host.mak
|
2017-09-29 13:11:56 +03:00
|
|
|
|
2012-10-19 17:54:23 +04:00
|
|
|
# Check that we're not trying to do an out-of-tree build from
|
|
|
|
# a tree that's been used for an in-tree build.
|
|
|
|
ifneq ($(realpath $(SRC_PATH)),$(realpath .))
|
|
|
|
ifneq ($(wildcard $(SRC_PATH)/config-host.mak),)
|
|
|
|
$(error This is an out of tree build but your source tree ($(SRC_PATH)) \
|
|
|
|
seems to have been used for an in-tree build. You can fix this by running \
|
2017-11-21 12:55:10 +03:00
|
|
|
"$(MAKE) distclean && rm -rf *-linux-user *-softmmu" in your source tree)
|
2012-10-19 17:54:23 +04:00
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
2018-12-14 11:47:54 +03:00
|
|
|
config-host.mak: $(SRC_PATH)/configure $(SRC_PATH)/pc-bios $(SRC_PATH)/VERSION
|
2009-10-07 04:40:59 +04:00
|
|
|
@echo $@ is out-of-date, running configure
|
2019-06-10 13:05:14 +03:00
|
|
|
@if test -f meson-private/coredata.dat; then \
|
|
|
|
./config.status --skip-meson; \
|
|
|
|
else \
|
|
|
|
./config.status; \
|
|
|
|
fi
|
2018-10-21 20:56:29 +03:00
|
|
|
|
|
|
|
# Force configure to re-run if the API symbols are updated
|
|
|
|
ifeq ($(CONFIG_PLUGIN),y)
|
|
|
|
config-host.mak: $(SRC_PATH)/plugins/qemu-plugins.symbols
|
2020-09-09 14:27:41 +03:00
|
|
|
|
|
|
|
.PHONY: plugins
|
|
|
|
plugins:
|
|
|
|
$(call quiet-command,\
|
|
|
|
$(MAKE) $(SUBDIR_MAKEFLAGS) -C contrib/plugins V="$(V)", \
|
|
|
|
"BUILD", "example plugins")
|
2018-10-21 20:56:29 +03:00
|
|
|
endif
|
|
|
|
|
2009-04-15 18:42:57 +04:00
|
|
|
else
|
|
|
|
config-host.mak:
|
2015-05-22 08:35:07 +03:00
|
|
|
ifneq ($(filter-out $(UNCHECKED_GOALS),$(MAKECMDGOALS)),$(if $(MAKECMDGOALS),,fail))
|
2009-04-15 18:42:57 +04:00
|
|
|
@echo "Please call configure before running make!"
|
|
|
|
@exit 1
|
|
|
|
endif
|
2012-09-17 00:07:13 +04:00
|
|
|
endif
|
2003-02-19 02:35:48 +03:00
|
|
|
|
2020-09-01 17:20:16 +03:00
|
|
|
# Only needed in case Makefile.ninja does not exist.
|
|
|
|
.PHONY: ninja-clean ninja-distclean clean-ctlist
|
|
|
|
clean-ctlist:
|
|
|
|
ninja-clean::
|
|
|
|
ninja-distclean::
|
|
|
|
build.ninja: config-host.mak
|
|
|
|
|
2009-10-06 23:11:15 +04:00
|
|
|
# Don't try to regenerate Makefile or configure
|
|
|
|
# We don't generate any of them
|
|
|
|
Makefile: ;
|
|
|
|
configure: ;
|
|
|
|
|
2020-09-03 22:47:48 +03:00
|
|
|
.PHONY: all clean distclean install \
|
2020-08-05 14:07:48 +03:00
|
|
|
recurse-all dist msi FORCE
|
2006-05-14 16:07:53 +04:00
|
|
|
|
2020-09-01 19:10:05 +03:00
|
|
|
SUBDIR_MAKEFLAGS=$(if $(V),,--no-print-directory --quiet)
|
2009-11-22 19:25:30 +03:00
|
|
|
|
2016-06-01 05:23:31 +03:00
|
|
|
include $(SRC_PATH)/tests/Makefile.include
|
2012-12-21 11:34:49 +04:00
|
|
|
|
2019-12-12 15:30:36 +03:00
|
|
|
all: recurse-all
|
2020-10-05 12:31:15 +03:00
|
|
|
Makefile:
|
2019-02-12 19:25:23 +03:00
|
|
|
|
Makefile: Rename targets for make recursion
We make a few sub-directories recursively, in particular
$(TARGET_DIRS).
For goal "all", we do it the nice way: "all" has a prerequisite
subdir-T for each T in $(TARGET_DIRS), and T's recipe runs make
recursively. Behaves nicely with -j and -k.
For other goals such as "clean" and "install", the recipe runs make
recursively in a for loop. Ignores -j and -k.
The next commit will fix that for "clean" and "install". This commit
prepares the ground by renaming the targets we use for "all" to
include the goal for the sub-make. This will permit reusing them for
goals other than "all".
Targets subdir-T for T in $(TARGET_DIRS) run "make all" in T. Rename
to T/all, and declare phony.
Targets romsubdir-R for R in $(ROMS) run "make" in pc-bios/R. Default
goal is "all" for all R. Rename to pc-bios/R/all, and declare phony.
The remainder are renamed just for consistency.
Target subdir-dtc runs "make libbft/libfdt.a" in dtc. Rename to
dtc/all, and declare phony.
Target subdir-capstone runs make $(BUILD_DIR)/capstone/$(LIBCAPSTONE)
in $(SRC_PATH)/capstone. Rename to capstone/all, and declare phony.
Target subdir-slirp runs "make" in $(SRC_PATH)/slirp. Default goal is
all, which builds $(BUILD_DIR)/libslirp.a. Rename to slirp/all, and
declare phony.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Message-Id: <20190528082308.22032-4-armbru@redhat.com>
[Add compatibility gunk to keep make working across the rename]
2019-05-28 11:23:07 +03:00
|
|
|
ROM_DIRS = $(addprefix pc-bios/, $(ROMS))
|
2019-05-28 11:23:08 +03:00
|
|
|
ROM_DIRS_RULES=$(foreach t, all clean, $(addsuffix /$(t), $(ROM_DIRS)))
|
2016-08-05 11:23:46 +03:00
|
|
|
# Only keep -O and -g cflags
|
2019-05-28 11:23:08 +03:00
|
|
|
.PHONY: $(ROM_DIRS_RULES)
|
|
|
|
$(ROM_DIRS_RULES):
|
2020-08-31 15:36:27 +03:00
|
|
|
$(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C $(dir $@) V="$(V)" TARGET_DIR="$(dir $@)" $(notdir $@),)
|
2009-07-31 16:18:32 +04:00
|
|
|
|
2020-08-05 14:05:13 +03:00
|
|
|
.PHONY: recurse-all recurse-clean
|
2020-08-31 15:36:27 +03:00
|
|
|
recurse-all: $(addsuffix /all, $(ROM_DIRS))
|
2020-08-05 14:05:13 +03:00
|
|
|
recurse-clean: $(addsuffix /clean, $(ROM_DIRS))
|
2006-08-01 20:21:11 +04:00
|
|
|
|
2011-05-15 12:51:28 +04:00
|
|
|
######################################################################
|
2007-11-07 22:24:02 +03:00
|
|
|
|
2019-06-10 13:05:14 +03:00
|
|
|
clean: recurse-clean ninja-clean clean-ctlist
|
2020-09-01 17:20:16 +03:00
|
|
|
if test -f ninjatool; then ./ninjatool $(if $(V),-v,) -t clean; fi
|
2003-08-12 03:01:33 +04:00
|
|
|
# avoid old build problems by removing potentially incorrect old files
|
2009-10-07 04:41:00 +04:00
|
|
|
rm -f config.mak op-i386.h opc-i386.h gen-op-i386.h op-arm.h opc-arm.h gen-op-arm.h
|
2019-12-12 15:30:36 +03:00
|
|
|
find . \( -name '*.so' -o -name '*.dll' -o -name '*.[oda]' \) -type f \
|
2019-02-04 19:03:21 +03:00
|
|
|
! -path ./roms/edk2/ArmPkg/Library/GccLto/liblto-aarch64.a \
|
|
|
|
! -path ./roms/edk2/ArmPkg/Library/GccLto/liblto-arm.a \
|
|
|
|
-exec rm {} +
|
2019-07-18 14:21:28 +03:00
|
|
|
rm -f TAGS cscope.* *.pod *~ */*~
|
2017-08-22 07:50:18 +03:00
|
|
|
rm -f fsdev/*.pod scsi/*.pod
|
2003-02-19 01:55:36 +03:00
|
|
|
|
2020-08-04 19:14:26 +03:00
|
|
|
VERSION = $(shell cat $(SRC_PATH)/VERSION)
|
2012-07-17 22:33:32 +04:00
|
|
|
|
|
|
|
dist: qemu-$(VERSION).tar.bz2
|
|
|
|
|
|
|
|
qemu-%.tar.bz2:
|
|
|
|
$(SRC_PATH)/scripts/make-release "$(SRC_PATH)" "$(patsubst qemu-%.tar.bz2,%,$@)"
|
|
|
|
|
2019-06-10 13:05:14 +03:00
|
|
|
distclean: clean ninja-distclean
|
|
|
|
-test -f ninjatool && ./ninjatool $(if $(V),-v,) -t clean -g
|
2020-08-05 14:07:48 +03:00
|
|
|
rm -f config-host.mak config-host.h*
|
2019-08-07 17:35:23 +03:00
|
|
|
rm -f tests/tcg/config-*.mak
|
2020-02-03 13:42:03 +03:00
|
|
|
rm -f config-all-disas.mak config.status
|
2019-09-19 20:02:09 +03:00
|
|
|
rm -f tests/qemu-iotests/common.env
|
2009-11-13 12:51:05 +03:00
|
|
|
rm -f roms/seabios/config.mak roms/vgabios/config.mak
|
2018-10-21 20:56:29 +03:00
|
|
|
rm -f qemu-plugins-ld.symbols qemu-plugins-ld64.symbols
|
2020-08-03 18:04:25 +03:00
|
|
|
rm -f *-config-target.h *-config-devices.mak *-config-devices.h
|
2019-06-10 13:05:14 +03:00
|
|
|
rm -rf meson-private meson-logs meson-info compile_commands.json
|
2020-01-28 16:48:54 +03:00
|
|
|
rm -f Makefile.ninja ninjatool ninjatool.stamp Makefile.mtest
|
2011-07-26 07:56:02 +04:00
|
|
|
rm -f config.log
|
2012-02-01 22:50:42 +04:00
|
|
|
rm -f linux-headers/asm
|
2013-08-07 19:40:03 +04:00
|
|
|
rm -Rf .sdk
|
2003-03-07 02:23:54 +03:00
|
|
|
|
2020-09-03 22:47:55 +03:00
|
|
|
find-src-path = find "$(SRC_PATH)/" -path "$(SRC_PATH)/meson" -prune -o -name "*.[chsS]"
|
|
|
|
|
2020-09-01 17:20:10 +03:00
|
|
|
.PHONY: ctags
|
|
|
|
ctags:
|
|
|
|
rm -f tags
|
2020-09-03 22:47:55 +03:00
|
|
|
$(find-src-path) -exec ctags --append {} +
|
2020-09-01 17:20:10 +03:00
|
|
|
|
|
|
|
.PHONY: TAGS
|
|
|
|
TAGS:
|
|
|
|
rm -f TAGS
|
2020-09-03 22:47:55 +03:00
|
|
|
$(find-src-path) -exec etags --append {} +
|
2020-09-01 17:20:10 +03:00
|
|
|
|
|
|
|
.PHONY: cscope
|
|
|
|
cscope:
|
|
|
|
rm -f "$(SRC_PATH)"/cscope.*
|
2020-09-03 22:47:55 +03:00
|
|
|
$(find-src-path) -print | sed -e 's,^\./,,' > "$(SRC_PATH)/cscope.files"
|
2020-09-01 17:20:10 +03:00
|
|
|
cscope -b -i"$(SRC_PATH)/cscope.files"
|
|
|
|
|
2019-06-10 13:05:14 +03:00
|
|
|
# Needed by "meson install"
|
|
|
|
export DESTDIR
|
2003-03-22 20:31:19 +03:00
|
|
|
|
Makefile: Rules for docker testing
This adds a group of make targets to run docker tests, all are available
in source tree without running ./configure.
The usage is shown with "make docker".
Besides the fixed ones, dynamic targets for building each image and
running each test in each image are generated automatically by make,
scanning $(SRC_PATH)/tests/docker/ files with specific patterns.
Alternative to manually list particular targets (docker-TEST@IMAGE)
set, you can control which tests/images to run by filtering variables,
TESTS= and IMAGES=, which are expressed in Makefile pattern syntax,
"foo% %bar ...". For example:
$ make docker-test IMAGES="ubuntu fedora"
Unfortunately, it's impossible to propagate "-j $JOBS" into make in
containers, however since each combination is made a first class target
in the top Makefile, "make -j$N docker-test" still parallels the tests
coarsely.
Still, $J is made a magic variable to let all make invocations in
containers to use -j$J.
Instead of providing a live version of the source tree to the docker
container we snapshot it with git-archive. This ensures the tree is in a
pristine state for whatever operations the container is going to run on
them.
Uncommitted changes known to files known by the git index will be
included in the snapshot if there are any.
Signed-off-by: Fam Zheng <famz@redhat.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-id: 1464755128-32490-5-git-send-email-famz@redhat.com
2016-06-01 07:25:17 +03:00
|
|
|
include $(SRC_PATH)/tests/docker/Makefile.include
|
2017-09-05 05:11:58 +03:00
|
|
|
include $(SRC_PATH)/tests/vm/Makefile.include
|
2016-09-13 17:20:33 +03:00
|
|
|
|
2020-03-05 03:48:54 +03:00
|
|
|
print-help-run = printf " %-30s - %s\\n" "$1" "$2"
|
|
|
|
print-help = $(quiet-@)$(call print-help-run,$1,$2)
|
|
|
|
|
2016-09-13 17:20:33 +03:00
|
|
|
.PHONY: help
|
|
|
|
help:
|
|
|
|
@echo 'Generic targets:'
|
2020-03-05 03:48:54 +03:00
|
|
|
$(call print-help,all,Build all)
|
|
|
|
$(call print-help,dir/file.o,Build specified target only)
|
|
|
|
$(call print-help,install,Install QEMU, documentation and tools)
|
|
|
|
$(call print-help,ctags/TAGS,Generate tags file for editors)
|
|
|
|
$(call print-help,cscope,Generate cscope index)
|
2020-02-03 16:45:33 +03:00
|
|
|
$(call print-help,sparse,Run sparse on the QEMU source)
|
2016-09-13 17:20:33 +03:00
|
|
|
@echo ''
|
2020-09-09 14:27:41 +03:00
|
|
|
ifeq ($(CONFIG_PLUGIN),y)
|
|
|
|
@echo 'Plugin targets:'
|
|
|
|
$(call print-help,plugins,Build the example TCG plugins)
|
|
|
|
@echo ''
|
|
|
|
endif
|
2016-09-13 17:20:33 +03:00
|
|
|
@echo 'Cleaning targets:'
|
2020-03-05 03:48:54 +03:00
|
|
|
$(call print-help,clean,Remove most generated files but keep the config)
|
|
|
|
$(call print-help,distclean,Remove all generated files)
|
|
|
|
$(call print-help,dist,Build a distributable tarball)
|
2016-09-13 17:20:33 +03:00
|
|
|
@echo ''
|
|
|
|
@echo 'Test targets:'
|
2020-03-05 03:48:54 +03:00
|
|
|
$(call print-help,check,Run all tests (check-help for details))
|
2020-09-02 14:25:19 +03:00
|
|
|
$(call print-help,bench,Run all benchmarks)
|
2020-03-05 03:48:54 +03:00
|
|
|
$(call print-help,docker,Help about targets running tests inside containers)
|
|
|
|
$(call print-help,vm-help,Help about targets running tests inside VM)
|
2016-09-13 17:20:33 +03:00
|
|
|
@echo ''
|
|
|
|
@echo 'Documentation targets:'
|
docs/interop: Convert qemu-qmp-ref to rST
Convert qemu-qmp-ref to rST format. This includes dropping
the plain-text, pdf and info format outputs for this document;
as with all our other Sphinx-based documentation, we provide
HTML and manpage only.
The qemu-qmp-ref.rst is somewhat more stripped down than
the .texi was, because we do not (currently) attempt to
generate indexes for the commands, events and data types
being documented.
Again, we drop the direct link from index.html.in now that
the QMP ref is part of the interop manual.
This commit removes the code from the root meson.build file that
handled the various Texinfo-based outputs, because we no longer
generate any documentation except for the Sphinx HTML manuals and the
manpages, and the code can't handle having an empty list of files
to process.. We'll do further cleanup of the remainders of
Texinfo support in subsequent commits.
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Message-Id: <20200925162316.21205-10-peter.maydell@linaro.org>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
[Unicode legacy literal dumbed down to plain string literal, TODO
comment on displaying QEMU version added, "make html" fixed,
storage-daemon/qapi/meson.build updated]
Signed-off-by: Markus Armbruster <armbru@redhat.com>
2020-09-25 19:23:04 +03:00
|
|
|
$(call print-help,html man,Build documentation in specified format)
|
2016-09-13 17:20:33 +03:00
|
|
|
@echo ''
|
|
|
|
ifdef CONFIG_WIN32
|
|
|
|
@echo 'Windows targets:'
|
2020-03-05 03:48:54 +03:00
|
|
|
$(call print-help,installer,Build NSIS-based installer for QEMU)
|
2020-09-14 12:52:31 +03:00
|
|
|
ifdef CONFIG_QGA_MSI
|
2020-03-05 03:48:54 +03:00
|
|
|
$(call print-help,msi,Build MSI-based installer for qemu-ga)
|
2016-09-13 17:20:33 +03:00
|
|
|
endif
|
|
|
|
@echo ''
|
|
|
|
endif
|
2020-03-05 03:48:54 +03:00
|
|
|
$(call print-help,$(MAKE) [targets],(quiet build, default))
|
|
|
|
$(call print-help,$(MAKE) V=1 [targets],(verbose build))
|
2020-09-01 19:10:05 +03:00
|
|
|
|
|
|
|
# will delete the target of a rule if commands exit with a nonzero exit status
|
|
|
|
.DELETE_ON_ERROR:
|
|
|
|
|
|
|
|
print-%:
|
|
|
|
@echo '$*=$($*)'
|