fish-shell/Makefile.in
ridiculousfish 9b4e365517 Update 'depend' target so make depend works again
This is very ugly because makedepend has no native support
for building outside the source tree. It always wants to
prepend 'src/' to the object file path. So instead we have
to cons up a new source tree, with the sources files at the
root, and run makedepend on that.
2015-07-25 15:17:08 -07:00

1081 lines
39 KiB
Makefile

# Copyright (C) 2005-2006 Axel Liljencrantz
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
#
#
# @configure_input@
#
#
# Makefile for the fish shell. Can build fish and associated
# applications, install them, and recalculate dependencies.
#
# Used by docdir
PACKAGE_TARNAME = @PACKAGE_TARNAME@
#
# Programs
#
CXX := @CXX@
INSTALL:=@INSTALL@
SED := @SED@
#
# Installation directories
#
prefix = @prefix@
exec_prefix = @exec_prefix@
datarootdir = @datarootdir@
datadir = @datadir@
bindir = @bindir@
mandir = @mandir@
sysconfdir = @sysconfdir@
docdir = @docdir@
localedir = @localedir@
#
# Various flags
#
MACROS = -DLOCALEDIR=\"$(localedir)\" -DPREFIX=L\"$(prefix)\" -DDATADIR=L\"$(datadir)\" -DSYSCONFDIR=L\"$(sysconfdir)\" -DBINDIR=L\"$(bindir)\" -DDOCDIR=L\"$(docdir)\"
CXXFLAGS = @CXXFLAGS@ -iquote. -iquote./src/ $(MACROS) $(EXTRA_CXXFLAGS)
CPPFLAGS = @CPPFLAGS@
LDFLAGS = @LDFLAGS@
LIBS = @LIBS@
LDFLAGS_FISH = ${LDFLAGS} @LDFLAGS_FISH@
#
# Set to 1 if we have gettext
#
HAVE_GETTEXT=@HAVE_GETTEXT@
#
# Set to 1 if we have doxygen
#
HAVE_DOXYGEN=@HAVE_DOXYGEN@
#
# All objects that the system needs to build fish, except fish.o
#
FISH_OBJS := obj/function.o obj/builtin.o obj/complete.o obj/env.o obj/exec.o \
obj/expand.o obj/highlight.o obj/history.o obj/kill.o obj/parser.o \
obj/proc.o obj/reader.o obj/sanity.o obj/tokenizer.o obj/wildcard.o \
obj/wgetopt.o obj/wutil.o obj/input.o obj/output.o obj/intern.o \
obj/env_universal_common.o obj/input_common.o obj/event.o obj/signal.o \
obj/io.o obj/parse_util.o obj/common.o obj/screen.o obj/path.o \
obj/autoload.o obj/parser_keywords.o obj/iothread.o obj/color.o \
obj/postfork.o obj/builtin_test.o obj/parse_tree.o obj/parse_productions.o \
obj/parse_execution.o obj/pager.o obj/utf8.o obj/fish_version.o \
obj/wcstringutil.o
FISH_INDENT_OBJS := obj/fish_indent.o obj/print_help.o $(FISH_OBJS)
#
# Additional files used by builtin.o
#
BUILTIN_FILES := src/builtin_set.cpp src/builtin_commandline.cpp \
src/builtin_ulimit.cpp src/builtin_complete.cpp \
src/builtin_jobs.cpp src/builtin_set_color.cpp \
src/builtin_printf.cpp
#
# All objects that the system needs to build fish_tests
#
FISH_TESTS_OBJS := $(FISH_OBJS) obj/fish_tests.o
#
# All of the sources that produce object files
# (that is, are not themselves #included in other source files)
#
FISH_ALL_OBJS := $(sort $(FISH_OBJS) $(FISH_INDENT_OBJS) $(FISH_TESTS_OBJS) \
obj/fish.o obj/key_reader.o)
#
# Files containing user documentation
#
#
# These files are the source files, they contain a few @FOO@-style substitutions
# Note that this order defines the order that they appear in the documentation
#
HDR_FILES_SRC := doc_src/index.hdr.in doc_src/tutorial.hdr doc_src/design.hdr doc_src/license.hdr doc_src/commands.hdr.in doc_src/faq.hdr
#
# These are the generated result files
#
HDR_FILES := $(HDR_FILES_SRC:.hdr.in=.hdr)
# Use a pattern rule so that Make knows to only issue one invocation
# per http://www.gnu.org/software/make/manual/make.html#Pattern-Intro
#
# Files containing documentation for external commands.
#
HELP_SRC := $(wildcard doc_src/*.txt)
#
# HTML includes needed for HTML help
#
HTML_SRC := doc_src/user_doc.header.html doc_src/user_doc.footer.html doc_src/user_doc.css
#
# Files in the test directory
#
TEST_IN := $(wildcard tests/test*.in)
#
# Files in ./share/completions/
#
COMPLETIONS_DIR_FILES := $(wildcard share/completions/*.fish) share/completions/..fish
#
# Files in ./share/functions/
#
FUNCTIONS_DIR_FILES := $(wildcard share/functions/*.fish)
#
# Programs to install
#
PROGRAMS := fish fish_indent
#
# Manual pages to install
#
MANUALS := $(addsuffix .1, $(addprefix share/man/man1/, \
$(PROGRAMS)))
#
# All translation message catalogs
#
TRANSLATIONS_SRC := $(wildcard po/*.po)
ifdef HAVE_GETTEXT
TRANSLATIONS := $(TRANSLATIONS_SRC:.po=.gmo)
else
TRANSLATIONS :=
endif
#
# If Doxygen is not available, don't attempt to build the documentation
#
ifeq ($(HAVE_DOXYGEN), 1)
user_doc=user_doc
share_man=share/man
else
user_doc=
share_man=
endif
#
# Make everything needed for installing fish
#
all: $(PROGRAMS) $(user_doc) $(share_man) $(TRANSLATIONS) fish.pc
@echo fish has now been built.
@echo Use \'$(MAKE) install\' to install fish.
.PHONY: all
#
# Pull version information
#
FISH-BUILD-VERSION-FILE: FORCE
@./build_tools/git_version_gen.sh
-include FISH-BUILD-VERSION-FILE
CXXFLAGS += -DFISH_BUILD_VERSION=\"$(FISH_BUILD_VERSION)\"
.PHONY: FORCE
fish_version.o: FISH-BUILD-VERSION-FILE
#
# These dependencies make sure that autoconf and configure are run
# when the source code for the build configuration has changed.
#
configure: configure.ac
./config.status --recheck
Makefile: Makefile.in configure
./config.status
#
# Build fish with some debug flags specified. This is GCC specific,
# and should only be used when debuging fish.
#
prof: EXTRA_CXXFLAGS += -pg
prof: LDFLAGS += -pg
prof: all
.PHONY: prof
#
# User documentation, describing the features of the fish shell.
#
# Depend on the sources (*.hdr.in) and manually make the
# intermediate *.hdr and doc.h files if needed
# The sed command deletes everything including and after the first -, for simpler version numbers
# Cleans up the user_doc/html directory once Doxygen is done.
user_doc: $(HDR_FILES_SRC) Doxyfile.user $(HTML_SRC) $(HELP_SRC) doc.h $(HDR_FILES) lexicon_filter
(cat Doxyfile.user; echo INPUT_FILTER=./lexicon_filter; \
echo PROJECT_NUMBER=$(FISH_BUILD_VERSION) | $(SED) "s/-.*//") | doxygen - && touch user_doc; \
cd user_doc/html && rm -f bc_s.png bdwn.png closed.png ftv2*.png nav*.png open.png sync_*.png tab*.* doxygen.* dynsections.js jquery.js pages.html
#
# Source code documentation. Also includes user documentation.
#
doc: *.h *.cpp doc.h Doxyfile lexicon_filter
(cat Doxyfile; echo INPUT_FILTER=./lexicon_filter; echo PROJECT_NUMBER=$(FISH_BUILD_VERSION)) | doxygen - ;
#
# PDF version of the source code documentation.
#
doc/refman.pdf: doc
cd doc/latex && \
make && \
mv refman.pdf ..;
rm -r doc/latex;
#
# This target runs both the low level code tests and the high level script tests.
#
test: test_low_level test_high_level
.PHONY: test
# We want the various tests to run serially so their output doesn't mix
# We can do that by adding ordering dependencies based on what goals are being used.
test_goals := test_low_level test_fishscript test_interactive
# The following variables define targets that depend on the tests. If any more targets
# are added that depend, directly or indirectly, on tests, they need to be recorded here.
test_test_deps = test_low_level $(test_high_level_test_deps)
test_high_level_test_deps = test_fishscript test_interactive
active_test_goals = $(filter $(test_goals),$(foreach a,$(or $(MAKECMDGOALS),$(.DEFAULT_GOAL)),$(a) $($(a)_test_deps)))
filter_up_to = $(eval b:=1)$(foreach a,$(2),$(and $(b),$(if $(subst $(1),,$(a)),$(a),$(eval b:=))))
test_low_level: fish_tests $(call filter_up_to,test_low_level,$(active_test_goals))
./fish_tests
.PHONY: test_low_level
test_high_level: test_fishscript test_interactive
.PHONY: test_high_level
test_fishscript: $(PROGRAMS) $(call filter_up_to,test_fishscript,$(active_test_goals))
cd tests && ../fish test.fish
.PHONY: test_fishscript
test_interactive: $(PROGRAMS) $(call filter_up_to,test_interactive,$(active_test_goals))
cd tests && ../fish interactive.fish
.PHONY: test_interactive
#
# commands.hdr collects documentation on all commands, functions and
# builtins
#
doc_src/commands.hdr:$(HELP_SRC) doc_src/commands.hdr.in
-rm command_list.tmp command_list_toc.tmp $@
for i in `printf "%s\n" $(HELP_SRC)|sort`; do \
echo "<hr>" >>command_list.tmp; \
cat $$i >>command_list.tmp; \
echo >>command_list.tmp; \
echo >>command_list.tmp; \
NAME=`basename $$i .txt`; \
echo '- <a href="#'$$NAME'">'$$NAME'</a>' >> command_list_toc.tmp; \
echo "Back to <a href='index.html#toc-commands'>index</a>". >>command_list.tmp; \
done
mv command_list.tmp command_list.txt
mv command_list_toc.tmp command_list_toc.txt
cat $@.in | awk '{if ($$0 ~ /@command_list_toc@/) { system("cat command_list_toc.txt"); } else if ($$0 ~ /@command_list@/){ system("cat command_list.txt");} else{ print $$0;}}' >$@
toc.txt: $(HDR_FILES:index.hdr=index.hdr.in)
-rm toc.tmp $@
# Ugly hack to set the toc initial title for the main page
echo '- <a href="index.html" id="toc-index">Documentation</a>' > toc.tmp
# The first sed command captures the page name, followed by the description
# The second sed command captures the command name \1 and the description \2, but only up to a dash
# This is to reduce the size of the TOC in the command listing on the main page
for i in $(HDR_FILES:index.hdr=index.hdr.in); do\
NAME=`basename $$i .hdr`; \
NAME=`basename $$NAME .hdr.in`; \
$(SED) <$$i >>toc.tmp -n \
-e 's,.*\\page *\([^ ]*\) *\(.*\)$$,- <a href="'$$NAME'.html" id="toc-'$$NAME'">\2</a>,p' \
-e 's,.*\\section *\([^ ]*\) *\([^-]*\)\(.*\)$$, - <a href="'$$NAME'.html#\1">\2</a>,p'; \
done
mv toc.tmp $@
doc_src/index.hdr: toc.txt doc_src/index.hdr.in
cat $@.in | awk '{if ($$0 ~ /@toc@/){ system("cat toc.txt");} else{ print $$0;}}' >$@
#
# To enable the lexicon filter, we first need to be aware of what fish
# considers to be a command, function, or external binary. We use
# command_list_toc.txt for the base commands. Scan the share/functions
# directory for other functions, some of which are mentioned in the docs, and
# use /share/completions to find a good selection of binaries. Additionally,
# colour defaults from __fish_config_interactive to set the docs colours when
# used in a 'cli' style context.
#
lexicon.txt: doc_src/commands.hdr $(FUNCTIONS_DIR_FILES) $(COMPLETIONS_DIR_FILES) share/functions/__fish_config_interactive.fish
-rm lexicon.tmp lexicon_catalog.tmp lexicon_catalog.txt $@
# Scan sources for commands/functions/binaries/colours. If GNU sed was portable, this could be much smarter.
$(SED) <command_list_toc.txt >>lexicon.tmp -n \
-e "s|^.*>\([a-z][a-z_]*\)</a>|'\1'|w lexicon_catalog.tmp" \
-e "s|'\(.*\)'|bltn \1|p"; mv lexicon_catalog.tmp lexicon_catalog.txt; \
printf "%s\n" $(COMPLETIONS_DIR_FILES) | $(SED) -n \
-e "s|[^ ]*/\([a-z][a-z_-]*\).fish|'\1'|p" | fgrep -vx -f lexicon_catalog.txt | $(SED) >>lexicon.tmp -n \
-e 'w lexicon_catalog.tmp' \
-e "s|'\(.*\)'|cmnd \1|p"; cat lexicon_catalog.tmp >> lexicon_catalog.txt; \
printf "%s\n" $(FUNCTIONS_DIR_FILES) | $(SED) -n \
-e "s|[^ ]*/\([a-z][a-z_-]*\).fish|'\1'|p" | fgrep -vx -f lexicon_catalog.txt | $(SED) >>lexicon.tmp -n \
-e 'w lexicon_catalog.tmp' \
-e "s|'\(.*\)'|func \1|p"; \
$(SED) <share/functions/__fish_config_interactive.fish >>lexicon.tmp -n \
-e '/set_default/s/.*\(fish_[a-z][a-z_]*\).*$$/clrv \1/p'; \
$(SED) <lexicon_filter.in >>lexicon.tmp -n \
-e '/^#.!#/s/^#.!# \(.... [a-z][a-z_]*\)/\1/p'; \
mv lexicon.tmp lexicon.txt; rm -f lexicon_catalog.tmp lexicon_catalog.txt;
#
# Compile Doxygen Input Filter from the lexicon. This is an executable sed
# script as Doxygen opens it via popen()(3) Input (doc.h) is piped through and
# matching words inside /fish../endfish blocks are marked up, contextually,
# with custom Doxygen commands in the form of @word_type{content}. These are
# trapped by ALIASES in the various Doxyfiles, allowing the content to be
# transformed depending on output type (HTML, man page, developer docs). In
# HTML, a style context can be applied through the /fish{style} block and
# providing suitable CSS in user_doc.css.in
#
lexicon_filter: lexicon.txt lexicon_filter.in
-rm $@.tmp $@
# Set the shebang as sed can reside in multiple places.
$(SED) <$@.in >$@.tmp -e 's|@sed@|'$(SED)'|'
# Scan through the lexicon, transforming each line to something useful to Doxygen.
if echo x | $(SED) "/[[:<:]]x/d" 2>/dev/null; then \
WORDBL='[[:<:]]'; WORDBR='[[:>:]]'; \
else \
WORDBL='\\<'; WORDBR='\\>'; \
fi; \
$(SED) <lexicon.txt >>$@.tmp -n \
-e "s|^\([a-z][a-z][a-z][a-z]\) \([a-z_-]*\)$$|s,$$WORDBL\2$$WORDBR,@\1{\2},g|p" \
-e '$$G;s/.*\n/b tidy/p'; \
mv $@.tmp $@; if test -x $@; then true; else chmod a+x $@; fi
#
# doc.h is a compilation of the various snipptes of text used both for
# the user documentation and for internal help functions into a single
# file that can be parsed by Doxygen to generate the user
# documentation.
#
doc.h: $(HDR_FILES)
cat $(HDR_FILES) >$@
#
# This rule creates complete doxygen headers from each of the various
# snipptes of text used both for the user documentation and for
# internal help functions, that can be parsed to Doxygen to generate
# the internal help function text.
#
%.doxygen:%.txt
echo "/** \page " `basename $*` >$@;
cat $*.txt >>$@;
echo "*/" >>$@
# Depend on Makefile because I don't see a better way of rebuilding
# if any of the paths change.
%: %.in Makefile FISH-BUILD-VERSION-FILE
$(SED) <$< >$@ \
-e "s,@sysconfdir\@,$(sysconfdir),g" \
-e "s,@datadir\@,$(datadir),g" \
-e "s,@docdir\@,$(docdir),g" \
-e "s|@configure_input\@|$@, generated from $@.in by the Makefile. DO NOT MANUALLY EDIT THIS FILE!|g" \
-e "s,@prefix\@,$(prefix),g" \
-e "s,@fish_build_version\@,$(FISH_BUILD_VERSION),g" \
#
# Compile translation files to binary format
#
%.gmo:
msgfmt -o $@ $*.po
#
# Update existing po file or copy messages.pot
#
%.po:messages.pot
if test -f $*.po; then \
msgmerge -U --backup=existing $*.po messages.pot;\
else \
cp messages.pot $*.po;\
fi
#
# Create a template translation object
#
messages.pot: *.cpp *.h share/completions/*.fish share/functions/*.fish
xgettext -k_ -kN_ *.cpp *.h -o messages.pot
xgettext -j -k_ -kN_ -k--description -LShell --from-code=UTF-8 share/completions/*.fish share/functions/*.fish -o messages.pot
builtin.o: $(BUILTIN_FILES)
#
# Generate the internal help functions by making doxygen create
# man-pages. The convertion path looks like this:
#
# .txt file
# ||
# (make)
# ||
# \/
# .doxygen file
# ||
# (doxygen)
# ||
# \/
# roff file
# ||
# (__fish_print_help)
# ||
# \/
# formated text
# with escape
# sequences
#
#
# There ought to be something simpler.
#
share/man: $(HELP_SRC) lexicon_filter
-mkdir share/man
touch share/man
-rm -Rf share/man/man1
PROJECT_NUMBER=`echo $(FISH_BUILD_VERSION)| $(SED) "s/-.*//"` INPUT_FILTER=./lexicon_filter \
./build_tools/build_documentation.sh Doxyfile.help ./doc_src ./share
#
# The build rules for installing/uninstalling fish
#
#
# Check for an incompatible installed fish version, and fail with an
# error if found
#
check-uninstall:
if test -f $(DESTDIR)$(sysconfdir)/fish.d/fish_function.fish -o -f $(DESTDIR)$(sysconfdir)/fish.d/fish_complete.fish; then \
echo;\
echo ERROR;\
echo;\
echo An older fish installation using an incompatible filesystem hierarchy was detected;\
echo You must uninstall this fish version before proceeding;\
echo type \'$(MAKE) uninstall-legacy\' to uninstall these files,;\
echo or type \'$(MAKE) force-install\' to force installation.;\
echo The latter may result in a broken installation.;\
echo;\
false;\
fi;
if test -f $(DESTDIR)$(sysconfdir)/fish; then \
echo;\
echo ERROR;\
echo;\
echo An older fish installation using an incompatible filesystem hierarchy was detected;\
echo You must remove the file $(DESTDIR)$(sysconfdir)/fish before proceeding;\
echo type \'$(MAKE) uninstall-legacy\' to uninstall this file,;\
echo or remove it manually using \'rm $(DESTDIR)$(sysconfdir)/fish\'.;\
echo;\
false;\
fi;
.PHONY: check-uninstall
check-legacy-binaries:
@SEQLOC=$(prefix)/bin/seq;\
if test -f "$$SEQLOC" && grep -q '\(^#!/.*/fish\|^#!/usr/bin/env fish\)' "$$SEQLOC"; then\
echo "An outdated seq from a previous fish install was found. You should remove it with:";\
echo " rm '$$SEQLOC'";\
fi;
@SETCOLOR_LOC=$(prefix)/bin/set_color;\
if test -x "$$SETCOLOR_LOC" && $$SETCOLOR_LOC -v 2>&1 >/dev/null | grep -q "^set_color, version "; then\
echo "An outdated set_color from a previous fish install was found. You should remove it with:";\
echo " rm '$$SETCOLOR_LOC'";\
fi;
@MIMEDB_LOC=$(prefix)/bin/mimedb;\
if test -x "$$MIMEDB_LOC" && $$MIMEDB_LOC --version 2>&1 | grep -q "^mimedb, version "; then\
echo "An outdated mimedb binary from a previous fish install was found. You should remove it with:";\
echo " rm '$$MIMEDB_LOC'";\
fi;
@FISHD_LOC=$(prefix)/bin/fishd;\
if test -x "$$FISHD_LOC" && $$FISHD_LOC --version 2>&1 | grep -q "^fishd: fishd, version "; then\
echo "An outdated fishd binary from a previous fish install was found. You should remove it with:";\
echo " rm '$$FISHD_LOC'";\
fi;
@true;
.PHONY: check-legacy-binaries
#
# This check makes sure that the install-sh script is executable. The
# darcs repo doesn't preserve the executable bit, so this needs to be
# run after checkout.
#
install-sh:
if test -x $@; then true; else chmod 755 $@; fi
.PHONY: install-sh
#
# Try to install after checking for incompatible installed versions.
#
install: all install-sh check-uninstall install-force check-legacy-binaries
.PHONY: install
#
# Xcode install
#
xcode-install:
rm -Rf /tmp/fish_build;\
xcodebuild install DSTROOT=/tmp/fish_build;\
ditto /tmp/fish_build /
.PHONY: xcode-install
#
# Force installation, even in presense of incompatible previous
# version. This may fail.
# These 'true' lines are to prevent installs from failing for (e.g.) missing man pages.
#
install-force: all install-translations
$(INSTALL) -m 755 -d $(DESTDIR)$(bindir)
for i in $(PROGRAMS); do\
$(INSTALL) -m 755 $$i $(DESTDIR)$(bindir) ; \
true ;\
done;
$(INSTALL) -m 755 -d $(DESTDIR)$(sysconfdir)/fish
$(INSTALL) -m 755 -d $(DESTDIR)$(datadir)/fish
$(INSTALL) -m 755 -d $(DESTDIR)$(datadir)/fish/completions
$(INSTALL) -m 755 -d $(DESTDIR)$(datadir)/fish/vendor_completions.d
$(INSTALL) -m 755 -d $(DESTDIR)$(datadir)/fish/functions
$(INSTALL) -m 755 -d $(DESTDIR)$(datadir)/fish/man/man1
$(INSTALL) -m 755 -d $(DESTDIR)$(datadir)/fish/tools
$(INSTALL) -m 755 -d $(DESTDIR)$(datadir)/fish/tools/web_config
$(INSTALL) -m 755 -d $(DESTDIR)$(datadir)/fish/tools/web_config/js
$(INSTALL) -m 755 -d $(DESTDIR)$(datadir)/fish/tools/web_config/partials
$(INSTALL) -m 755 -d $(DESTDIR)$(datadir)/fish/tools/web_config/sample_prompts
$(INSTALL) -m 644 etc/config.fish $(DESTDIR)$(sysconfdir)/fish/
$(INSTALL) -m 644 share/config.fish $(DESTDIR)$(datadir)/fish/
$(INSTALL) -m 755 -d $(DESTDIR)$(datadir)/pkgconfig
$(INSTALL) -m 644 fish.pc $(DESTDIR)$(datadir)/pkgconfig
for i in $(COMPLETIONS_DIR_FILES:%='%'); do \
$(INSTALL) -m 644 $$i $(DESTDIR)$(datadir)/fish/completions/; \
true; \
done;
for i in $(FUNCTIONS_DIR_FILES:%='%'); do \
$(INSTALL) -m 644 $$i $(DESTDIR)$(datadir)/fish/functions/; \
true; \
done;
for i in share/man/man1/*.1; do \
$(INSTALL) -m 644 $$i $(DESTDIR)$(datadir)/fish/man/man1/; \
true; \
done;
for i in share/tools/*.py; do\
$(INSTALL) -m 755 $$i $(DESTDIR)$(datadir)/fish/tools/; \
true; \
done;
for i in share/tools/web_config/*; do\
$(INSTALL) -m 644 $$i $(DESTDIR)$(datadir)/fish/tools/web_config/; \
true; \
done;
for i in share/tools/web_config/js/*; do\
$(INSTALL) -m 644 $$i $(DESTDIR)$(datadir)/fish/tools/web_config/js/; \
true; \
done;
for i in share/tools/web_config/partials/*; do\
$(INSTALL) -m 644 $$i $(DESTDIR)$(datadir)/fish/tools/web_config/partials/; \
true; \
done;
for i in share/tools/web_config/sample_prompts/*.fish; do\
$(INSTALL) -m 644 $$i $(DESTDIR)$(datadir)/fish/tools/web_config/sample_prompts/; \
true; \
done;
for i in share/tools/web_config/*.py; do\
$(INSTALL) -m 755 $$i $(DESTDIR)$(datadir)/fish/tools/web_config/; \
true; \
done;
$(INSTALL) -m 755 -d $(DESTDIR)$(docdir)
for i in user_doc/html/* ChangeLog; do \
if test -f $$i; then \
$(INSTALL) -m 644 $$i $(DESTDIR)$(docdir); \
fi; \
done;
$(INSTALL) -m 755 -d $(DESTDIR)$(mandir)/man1
for i in $(MANUALS); do \
$(INSTALL) -m 644 $$i $(DESTDIR)$(mandir)/man1/; \
true; \
done;
@echo fish is now installed on your system.
@echo To run fish, type \'fish\' in your terminal.
@echo
@if type chsh >/dev/null 2>&1; then \
echo To use fish as your login shell:; \
grep -q -- "$(DESTDIR)$(bindir)/fish" /etc/shells || echo \* add the line \'$(DESTDIR)$(bindir)/fish\' to the file \'/etc/shells\'.; \
echo \* use the command \'chsh -s $(DESTDIR)$(bindir)/fish\'.; \
echo; \
fi;
@if type chcon >/dev/null 2>&1; then \
echo If you have SELinux enabled, you may need to manually update the security policy:; \
echo \* use the command \'chcon -t shell_exec_t $(DESTDIR)$(bindir)/fish\'.; \
echo; \
fi;
@echo To set your colors, run \'fish_config\'
@echo To scan your man pages for completions, run \'fish_update_completions\'
@echo To autocomplete command suggestions press Ctrl + F or right arrow key.
@echo
@echo Have fun!
.PHONY: install-force
#
# Uninstall this fish version
#
uninstall: uninstall-translations
-for i in $(PROGRAMS); do \
rm -f $(DESTDIR)$(bindir)/$$i; \
done;
-rm -rf $(DESTDIR)$(sysconfdir)/fish
-if test -d $(DESTDIR)$(datadir)/fish; then \
rm -r $(DESTDIR)$(datadir)/fish; \
fi
-if test -d $(DESTDIR)$(docdir); then \
rm -rf $(DESTDIR)$(docdir);\
fi
-if test -f $(DESTDIR)$(datadir)/pkgconfig/fish.pc; then \
rm -f $(DESTDIR)$(datadir)/pkgconfig/fish.pc;\
fi
-for i in $(MANUALS); do \
rm -rf $(DESTDIR)$(mandir)/man1/`basename $$i`*; \
done;
.PHONY: uninstall
#
# Uninstall an older fish release. This is not the default uninstall
# since there is a slight chance that it removes a file put in place by
# the sysadmin. But if 'make install' detects a file confligt, it
# suggests using this target.
#
uninstall-legacy: uninstall
-rm -f $(DESTDIR)$(sysconfdir)/fish.d/fish_interactive.fish
-rm -f $(DESTDIR)$(sysconfdir)/fish.d/fish_complete.fish
-rm -f $(DESTDIR)$(sysconfdir)/fish.d/fish_function.fish
-rm -f $(DESTDIR)$(sysconfdir)/fish/fish_inputrc
-if test -d $(DESTDIR)$(sysconfdir)/fish.d/completions; then \
for i in $(COMPLETIONS_DIR_FILES); do \
basename=`basename $$i`; \
if test -f $(DESTDIR)$(sysconfdir)/fish.d/completions/$$basename; then \
rm $(DESTDIR)$(sysconfdir)/fish.d/completions/$$basename; \
fi; \
done; \
fi;
-rmdir $(DESTDIR)$(sysconfdir)/fish.d/completions
-rmdir $(DESTDIR)$(sysconfdir)/fish.d
-rm $(DESTDIR)$(sysconfdir)/fish
@echo The previous fish installation has been removed.
.PHONY: uninstall-legacy
install-translations: $(TRANSLATIONS)
ifdef HAVE_GETTEXT
for i in $(TRANSLATIONS); do \
$(INSTALL) -m 755 -d $(DESTDIR)$(localedir)/`basename $$i .gmo`/LC_MESSAGES; \
$(INSTALL) -m 644 $$i $(DESTDIR)$(localedir)/`basename $$i .gmo`/LC_MESSAGES/fish.mo; \
echo $(DESTDIR)$(localedir)/`basename $$i .gmo`/LC_MESSAGES/fish.mo;\
done
endif
.PHONY: install-translations
uninstall-translations:
rm -f $(DESTDIR)$(localedir)/*/LC_MESSAGES/fish.mo
.PHONY: uninstall-translations
#
# The build rules for all the commands
#
#
# How basic files get compiled
#
obj/%.o: src/%.cpp | obj
$(CXX) $(CXXFLAGS) -c $< -o $@
#
# obj directory
#
obj:
mkdir obj
#
# Build the fish program.
#
fish: $(FISH_OBJS) obj/fish.o
$(CXX) $(CXXFLAGS) $(LDFLAGS_FISH) $(FISH_OBJS) obj/fish.o $(LIBS) -o $@
#
# Build the fish_tests program.
#
fish_tests: $(FISH_TESTS_OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS_FISH) $(FISH_TESTS_OBJS) $(LIBS) -o $@
#
# Build the fish_indent program.
#
fish_indent: $(FISH_INDENT_OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) $(FISH_INDENT_OBJS) $(LIBS) -o $@
#
# Neat little program to show output from terminal
#
key_reader: $(FISH_OBJS) key_reader.o
$(CXX) $(CXXFLAGS) $(LDFLAGS_FISH) $^ $(LIBS) -o $@
#
# Update dependencies
# Unfortunately makedepend cannot handle source files in one directory
# and object files in another. So we have to cons up a fake directory
# tree and run it there. Note that some .cpp files do not result in
# objects because they are #include'd directly. In that case we need to
# leave them in the 'header' directory, so they get picked up by the
# dependencies. So we put everything in the header directory and move out
# exactly the files that result in objects, leaving the #include'd files
# behind.
#
depend:
mkdir -p /tmp/fish_make_depend/src
cp src/*.cpp src/*.h /tmp/fish_make_depend/src
cp config.h /tmp/fish_make_depend/
mv $(subst obj/,/tmp/fish_make_depend/src/,$(FISH_ALL_OBJS:.o=.cpp)) /tmp/fish_make_depend/
cd /tmp/fish_make_depend && \
makedepend -f$(CURDIR)/Makefile.in -pobj/ -Y -Isrc *.cpp
rm -Rf /tmp/fish_make_depend
./config.status
.PHONY: depend
#
# Cleanup targets
#
#
# distclean should restore the tree to the state right after extracting a tarball.
#
distclean: clean
rm -f config.status config.log config.h Makefile
.PHONY: distclean
#
# clean removes everything built by the makefile, but not things that
# are created by the configure script.
#
# Don't delete the docs unless we have Doxygen installed
# We provide pre-built docs in the tarball, and if they get
# deleted we won't be able to regenerate them
clean:
rm -f obj/*.o *.o doc.h doc.tmp doc_src/*.doxygen doc_src/*.cpp doc_src/*.o doc_src/commands.hdr
rm -f tests/tmp.err tests/tmp.out tests/tmp.status tests/foo.txt
rm -f $(PROGRAMS) fish_tests key_reader
rm -f command_list.txt command_list_toc.txt toc.txt
rm -f doc_src/index.hdr doc_src/commands.hdr
rm -f lexicon_filter lexicon.txt lexicon.log
rm -f FISH-BUILD-VERSION-FILE
if test "$(HAVE_DOXYGEN)" = 1; then \
rm -rf doc user_doc share/man; \
fi
rm -f po/*.gmo
rm -rf obj
.PHONY: clean
# DO NOT DELETE THIS LINE -- make depend depends on it.
obj/autoload.o: config.h src/autoload.h src/common.h src/util.h src/lru.h
obj/autoload.o: src/wutil.h src/signal.h src/env.h src/exec.h src/proc.h
obj/autoload.o: src/io.h src/parse_tree.h src/tokenizer.h
obj/autoload.o: src/parse_constants.h
obj/builtin.o: config.h src/signal.h src/fallback.h src/util.h src/wutil.h
obj/builtin.o: src/common.h src/builtin.h src/io.h src/function.h src/event.h
obj/builtin.o: src/env.h src/complete.h src/proc.h src/parse_tree.h
obj/builtin.o: src/tokenizer.h src/parse_constants.h src/parser.h
obj/builtin.o: src/reader.h src/highlight.h src/color.h src/wgetopt.h
obj/builtin.o: src/sanity.h src/wildcard.h src/expand.h src/input_common.h
obj/builtin.o: src/input.h src/intern.h src/exec.h src/parse_util.h
obj/builtin.o: src/autoload.h src/lru.h src/parser_keywords.h src/path.h
obj/builtin.o: src/history.h src/wcstringutil.h src/builtin_set.cpp
obj/builtin.o: src/builtin_commandline.cpp src/builtin_complete.cpp
obj/builtin.o: src/builtin_ulimit.cpp src/builtin_jobs.cpp
obj/builtin.o: src/builtin_set_color.cpp src/output.h src/screen.h
obj/builtin.o: src/builtin_printf.cpp
obj/builtin_test.o: config.h src/common.h src/util.h src/builtin.h src/io.h
obj/builtin_test.o: src/wutil.h src/proc.h src/signal.h src/parse_tree.h
obj/builtin_test.o: src/tokenizer.h src/parse_constants.h
obj/color.o: src/color.h config.h src/common.h src/util.h src/fallback.h
obj/color.o: src/signal.h
obj/common.o: config.h src/fallback.h src/signal.h src/util.h src/wutil.h
obj/common.o: src/common.h src/expand.h src/parse_constants.h src/proc.h
obj/common.o: src/io.h src/parse_tree.h src/tokenizer.h src/wildcard.h
obj/common.o: src/complete.h src/parser.h src/event.h src/function.h
obj/common.o: src/env.h src/util.cpp src/fallback.cpp
obj/complete.o: config.h src/signal.h src/fallback.h src/util.h
obj/complete.o: src/tokenizer.h src/common.h src/wildcard.h src/expand.h
obj/complete.o: src/parse_constants.h src/complete.h src/proc.h src/io.h
obj/complete.o: src/parse_tree.h src/parser.h src/event.h src/function.h
obj/complete.o: src/env.h src/builtin.h src/exec.h src/reader.h
obj/complete.o: src/highlight.h src/color.h src/history.h src/wutil.h
obj/complete.o: src/intern.h src/parse_util.h src/autoload.h src/lru.h
obj/complete.o: src/parser_keywords.h src/path.h src/iothread.h
obj/env.o: config.h src/signal.h src/fallback.h src/util.h src/wutil.h
obj/env.o: src/common.h src/proc.h src/io.h src/parse_tree.h src/tokenizer.h
obj/env.o: src/parse_constants.h src/env.h src/sanity.h src/expand.h
obj/env.o: src/history.h src/reader.h src/complete.h src/highlight.h
obj/env.o: src/color.h src/parser.h src/event.h src/function.h
obj/env.o: src/env_universal_common.h src/input.h src/input_common.h
obj/env.o: src/path.h src/fish_version.h
obj/env_universal_common.o: config.h src/env_universal_common.h src/wutil.h
obj/env_universal_common.o: src/common.h src/util.h src/env.h src/fallback.h
obj/env_universal_common.o: src/signal.h src/utf8.h src/path.h src/iothread.h
obj/event.o: config.h src/signal.h src/fallback.h src/util.h src/wutil.h
obj/event.o: src/common.h src/function.h src/event.h src/env.h
obj/event.o: src/input_common.h src/proc.h src/io.h src/parse_tree.h
obj/event.o: src/tokenizer.h src/parse_constants.h src/parser.h
obj/exec.o: config.h src/signal.h src/fallback.h src/util.h src/iothread.h
obj/exec.o: src/postfork.h src/common.h src/proc.h src/io.h src/parse_tree.h
obj/exec.o: src/tokenizer.h src/parse_constants.h src/wutil.h src/exec.h
obj/exec.o: src/parser.h src/event.h src/function.h src/env.h src/builtin.h
obj/exec.o: src/wildcard.h src/expand.h src/complete.h src/sanity.h
obj/exec.o: src/parse_util.h src/autoload.h src/lru.h
obj/expand.o: config.h src/signal.h src/fallback.h src/util.h src/common.h
obj/expand.o: src/wutil.h src/env.h src/proc.h src/io.h src/parse_tree.h
obj/expand.o: src/tokenizer.h src/parse_constants.h src/parser.h src/event.h
obj/expand.o: src/function.h src/expand.h src/wildcard.h src/complete.h
obj/expand.o: src/exec.h src/iothread.h src/parse_util.h src/autoload.h
obj/expand.o: src/lru.h
obj/fish.o: config.h src/signal.h src/fallback.h src/util.h src/common.h
obj/fish.o: src/reader.h src/io.h src/complete.h src/highlight.h src/env.h
obj/fish.o: src/color.h src/parse_constants.h src/builtin.h src/function.h
obj/fish.o: src/event.h src/wutil.h src/sanity.h src/proc.h src/parse_tree.h
obj/fish.o: src/tokenizer.h src/parser.h src/expand.h src/intern.h src/exec.h
obj/fish.o: src/output.h src/screen.h src/history.h src/path.h src/input.h
obj/fish.o: src/input_common.h src/fish_version.h
obj/fish_indent.o: config.h src/wutil.h src/common.h src/util.h src/output.h
obj/fish_indent.o: src/fallback.h src/signal.h src/screen.h src/highlight.h
obj/fish_indent.o: src/env.h src/color.h src/input.h src/input_common.h
obj/fish_indent.o: src/parse_tree.h src/tokenizer.h src/parse_constants.h
obj/fish_indent.o: src/print_help.h src/fish_version.h
obj/fish_tests.o: config.h src/signal.h src/fallback.h src/util.h
obj/fish_tests.o: src/common.h src/proc.h src/io.h src/parse_tree.h
obj/fish_tests.o: src/tokenizer.h src/parse_constants.h src/reader.h
obj/fish_tests.o: src/complete.h src/highlight.h src/env.h src/color.h
obj/fish_tests.o: src/builtin.h src/function.h src/event.h src/autoload.h
obj/fish_tests.o: src/lru.h src/wutil.h src/expand.h src/parser.h
obj/fish_tests.o: src/output.h src/screen.h src/exec.h src/path.h
obj/fish_tests.o: src/history.h src/iothread.h src/postfork.h
obj/fish_tests.o: src/parse_util.h src/pager.h src/input.h src/input_common.h
obj/fish_tests.o: src/utf8.h src/env_universal_common.h src/wcstringutil.h
obj/fish_version.o: src/fish_version.h
obj/function.o: config.h src/signal.h src/wutil.h src/common.h src/util.h
obj/function.o: src/fallback.h src/function.h src/event.h src/env.h
obj/function.o: src/proc.h src/io.h src/parse_tree.h src/tokenizer.h
obj/function.o: src/parse_constants.h src/parser.h src/intern.h src/reader.h
obj/function.o: src/complete.h src/highlight.h src/color.h src/parse_util.h
obj/function.o: src/autoload.h src/lru.h src/parser_keywords.h src/expand.h
obj/highlight.o: config.h src/signal.h src/fallback.h src/util.h src/wutil.h
obj/highlight.o: src/common.h src/highlight.h src/env.h src/color.h
obj/highlight.o: src/tokenizer.h src/proc.h src/io.h src/parse_tree.h
obj/highlight.o: src/parse_constants.h src/parser.h src/event.h
obj/highlight.o: src/function.h src/parse_util.h src/autoload.h src/lru.h
obj/highlight.o: src/parser_keywords.h src/builtin.h src/expand.h
obj/highlight.o: src/sanity.h src/complete.h src/output.h src/screen.h
obj/highlight.o: src/wildcard.h src/path.h src/history.h
obj/history.o: config.h src/fallback.h src/signal.h src/util.h src/sanity.h
obj/history.o: src/tokenizer.h src/common.h src/reader.h src/io.h
obj/history.o: src/complete.h src/highlight.h src/env.h src/color.h
obj/history.o: src/parse_constants.h src/parse_tree.h src/wutil.h
obj/history.o: src/history.h src/intern.h src/path.h src/autoload.h src/lru.h
obj/history.o: src/iothread.h
obj/input.o: config.h src/signal.h src/fallback.h src/util.h src/wutil.h
obj/input.o: src/common.h src/reader.h src/io.h src/complete.h
obj/input.o: src/highlight.h src/env.h src/color.h src/parse_constants.h
obj/input.o: src/proc.h src/parse_tree.h src/tokenizer.h src/sanity.h
obj/input.o: src/input_common.h src/input.h src/parser.h src/event.h
obj/input.o: src/function.h src/expand.h src/output.h src/screen.h
obj/input.o: src/intern.h
obj/input_common.o: config.h src/fallback.h src/signal.h src/util.h
obj/input_common.o: src/common.h src/wutil.h src/input_common.h
obj/input_common.o: src/env_universal_common.h src/env.h src/iothread.h
obj/intern.o: config.h src/fallback.h src/signal.h src/util.h src/wutil.h
obj/intern.o: src/common.h src/intern.h
obj/io.o: config.h src/fallback.h src/signal.h src/util.h src/wutil.h
obj/io.o: src/common.h src/exec.h src/proc.h src/io.h src/parse_tree.h
obj/io.o: src/tokenizer.h src/parse_constants.h
obj/iothread.o: config.h src/iothread.h src/common.h src/util.h src/signal.h
obj/key_reader.o: config.h src/common.h src/util.h src/fallback.h
obj/key_reader.o: src/signal.h src/input_common.h
obj/kill.o: config.h src/signal.h src/fallback.h src/util.h src/wutil.h
obj/kill.o: src/common.h src/kill.h src/proc.h src/io.h src/parse_tree.h
obj/kill.o: src/tokenizer.h src/parse_constants.h src/sanity.h src/env.h
obj/kill.o: src/exec.h src/path.h
obj/output.o: config.h src/signal.h src/fallback.h src/util.h src/wutil.h
obj/output.o: src/common.h src/expand.h src/parse_constants.h src/output.h
obj/output.o: src/screen.h src/highlight.h src/env.h src/color.h
obj/pager.o: config.h src/pager.h src/complete.h src/util.h src/common.h
obj/pager.o: src/screen.h src/highlight.h src/env.h src/color.h src/reader.h
obj/pager.o: src/io.h src/parse_constants.h src/input_common.h src/wutil.h
obj/parse_execution.o: src/parse_execution.h config.h src/util.h
obj/parse_execution.o: src/parse_tree.h src/common.h src/tokenizer.h
obj/parse_execution.o: src/parse_constants.h src/proc.h src/signal.h src/io.h
obj/parse_execution.o: src/parse_util.h src/autoload.h src/lru.h
obj/parse_execution.o: src/complete.h src/wildcard.h src/expand.h
obj/parse_execution.o: src/builtin.h src/parser.h src/event.h src/function.h
obj/parse_execution.o: src/env.h src/reader.h src/highlight.h src/color.h
obj/parse_execution.o: src/wutil.h src/exec.h src/path.h
obj/parse_productions.o: src/parse_productions.h src/parse_tree.h config.h
obj/parse_productions.o: src/util.h src/common.h src/tokenizer.h
obj/parse_productions.o: src/parse_constants.h
obj/parse_tree.o: src/parse_productions.h src/parse_tree.h config.h
obj/parse_tree.o: src/util.h src/common.h src/tokenizer.h
obj/parse_tree.o: src/parse_constants.h src/fallback.h src/signal.h
obj/parse_tree.o: src/wutil.h src/proc.h src/io.h src/expand.h
obj/parse_util.o: config.h src/fallback.h src/signal.h src/util.h src/wutil.h
obj/parse_util.o: src/common.h src/tokenizer.h src/parse_util.h
obj/parse_util.o: src/autoload.h src/lru.h src/parse_tree.h
obj/parse_util.o: src/parse_constants.h src/expand.h src/intern.h src/exec.h
obj/parse_util.o: src/proc.h src/io.h src/env.h src/wildcard.h src/complete.h
obj/parse_util.o: src/parser.h src/event.h src/function.h src/builtin.h
obj/parser.o: config.h src/fallback.h src/signal.h src/util.h src/common.h
obj/parser.o: src/wutil.h src/proc.h src/io.h src/parse_tree.h
obj/parser.o: src/tokenizer.h src/parse_constants.h src/parser.h src/event.h
obj/parser.o: src/function.h src/env.h src/parser_keywords.h src/exec.h
obj/parser.o: src/wildcard.h src/expand.h src/complete.h src/builtin.h
obj/parser.o: src/reader.h src/highlight.h src/color.h src/sanity.h
obj/parser.o: src/intern.h src/parse_util.h src/autoload.h src/lru.h
obj/parser.o: src/path.h src/parse_execution.h
obj/parser_keywords.o: config.h src/fallback.h src/signal.h src/common.h
obj/parser_keywords.o: src/util.h src/parser_keywords.h
obj/path.o: config.h src/fallback.h src/signal.h src/util.h src/common.h
obj/path.o: src/env.h src/wutil.h src/path.h src/expand.h
obj/path.o: src/parse_constants.h
obj/postfork.o: src/signal.h src/postfork.h config.h src/common.h src/util.h
obj/postfork.o: src/proc.h src/io.h src/parse_tree.h src/tokenizer.h
obj/postfork.o: src/parse_constants.h src/wutil.h src/iothread.h src/exec.h
obj/print_help.o: src/print_help.h
obj/proc.o: config.h src/signal.h src/fallback.h src/util.h src/wutil.h
obj/proc.o: src/common.h src/proc.h src/io.h src/parse_tree.h src/tokenizer.h
obj/proc.o: src/parse_constants.h src/reader.h src/complete.h src/highlight.h
obj/proc.o: src/env.h src/color.h src/sanity.h src/parser.h src/event.h
obj/proc.o: src/function.h src/output.h src/screen.h
obj/reader.o: config.h src/signal.h src/fallback.h src/util.h src/wutil.h
obj/reader.o: src/common.h src/highlight.h src/env.h src/color.h src/reader.h
obj/reader.o: src/io.h src/complete.h src/parse_constants.h src/proc.h
obj/reader.o: src/parse_tree.h src/tokenizer.h src/parser.h src/event.h
obj/reader.o: src/function.h src/history.h src/sanity.h src/exec.h
obj/reader.o: src/expand.h src/kill.h src/input_common.h src/input.h
obj/reader.o: src/output.h src/screen.h src/iothread.h src/intern.h
obj/reader.o: src/path.h src/parse_util.h src/autoload.h src/lru.h
obj/reader.o: src/parser_keywords.h src/pager.h
obj/sanity.o: config.h src/signal.h src/fallback.h src/util.h src/common.h
obj/sanity.o: src/sanity.h src/proc.h src/io.h src/parse_tree.h
obj/sanity.o: src/tokenizer.h src/parse_constants.h src/history.h src/wutil.h
obj/sanity.o: src/reader.h src/complete.h src/highlight.h src/env.h
obj/sanity.o: src/color.h src/kill.h
obj/screen.o: config.h src/fallback.h src/signal.h src/common.h src/util.h
obj/screen.o: src/wutil.h src/output.h src/screen.h src/highlight.h src/env.h
obj/screen.o: src/color.h src/pager.h src/complete.h src/reader.h src/io.h
obj/screen.o: src/parse_constants.h
obj/signal.o: config.h src/signal.h src/common.h src/util.h src/fallback.h
obj/signal.o: src/wutil.h src/event.h src/reader.h src/io.h src/complete.h
obj/signal.o: src/highlight.h src/env.h src/color.h src/parse_constants.h
obj/signal.o: src/proc.h src/parse_tree.h src/tokenizer.h
obj/tokenizer.o: config.h src/fallback.h src/signal.h src/util.h src/wutil.h
obj/tokenizer.o: src/common.h src/tokenizer.h
obj/utf8.o: src/utf8.h
obj/wcstringutil.o: config.h src/wcstringutil.h src/common.h src/util.h
obj/wgetopt.o: config.h src/wgetopt.h src/wutil.h src/common.h src/util.h
obj/wgetopt.o: src/fallback.h src/signal.h
obj/wildcard.o: config.h src/fallback.h src/signal.h src/util.h src/wutil.h
obj/wildcard.o: src/common.h src/complete.h src/wildcard.h src/expand.h
obj/wildcard.o: src/parse_constants.h src/reader.h src/io.h src/highlight.h
obj/wildcard.o: src/env.h src/color.h src/exec.h src/proc.h src/parse_tree.h
obj/wildcard.o: src/tokenizer.h
obj/wutil.o: config.h src/fallback.h src/signal.h src/util.h src/common.h
obj/wutil.o: src/wutil.h