1#! /usr/bin/make
2
3# Extract version from git, or if we're from a zipfile, use dirname
4VERSION=$(shell git describe --always --dirty=-modded --abbrev=7 2>/dev/null || pwd | sed -n 's|.*/c\{0,1\}lightning-v\{0,1\}\([0-9a-f.rc\-]*\)$$|\1|gp')
5
6ifeq ($(VERSION),)
7$(error "ERROR: git is required for generating version information")
8endif
9
10# --quiet / -s means quiet, dammit!
11ifeq ($(findstring s,$(word 1, $(MAKEFLAGS))),s)
12ECHO := :
13SUPPRESS_OUTPUT := > /dev/null
14else
15ECHO := echo
16SUPPRESS_OUTPUT :=
17endif
18
19DISTRO=$(shell lsb_release -is 2>/dev/null || echo unknown)-$(shell lsb_release -rs 2>/dev/null || echo unknown)
20PKGNAME = c-lightning
21
22# We use our own internal ccan copy.
23CCANDIR := ccan
24
25# Where we keep the BOLT RFCs
26BOLTDIR := ../lightning-rfc/
27DEFAULT_BOLTVERSION := 498f104fd399488c77f449d05cb21c0b604636a2
28# Can be overridden on cmdline.
29BOLTVERSION := $(DEFAULT_BOLTVERSION)
30
31-include config.vars
32
33SORT=LC_ALL=C sort
34
35
36ifeq ($V,1)
37VERBOSE = $(ECHO) '$(2)'; $(2)
38else
39VERBOSE = $(ECHO) $(1); $(2)
40endif
41
42ifneq ($(VALGRIND),0)
43VG=VALGRIND=1 valgrind -q --error-exitcode=7
44VG_TEST_ARGS = --track-origins=yes --leak-check=full --show-reachable=yes --errors-for-leak-kinds=all
45endif
46
47SANITIZER_FLAGS :=
48
49ifneq ($(ASAN),0)
50SANITIZER_FLAGS += -fsanitize=address
51endif
52
53ifneq ($(UBSAN),0)
54SANITIZER_FLAGS += -fsanitize=undefined
55endif
56
57ifneq ($(FUZZING), 0)
58SANITIZER_FLAGS += -fsanitize=fuzzer-no-link
59endif
60
61ifeq ($(DEVELOPER),1)
62DEV_CFLAGS=-DCCAN_TAKE_DEBUG=1 -DCCAN_TAL_DEBUG=1 -DCCAN_JSON_OUT_DEBUG=1
63else
64DEV_CFLAGS=
65endif
66
67ifeq ($(COVERAGE),1)
68COVFLAGS = --coverage
69endif
70
71ifeq ($(PIE),1)
72PIE_CFLAGS=-fPIE -fPIC
73PIE_LDFLAGS=-pie
74endif
75
76ifeq ($(COMPAT),1)
77# We support compatibility with pre-0.6.
78COMPAT_CFLAGS=-DCOMPAT_V052=1 -DCOMPAT_V060=1 -DCOMPAT_V061=1 -DCOMPAT_V062=1 -DCOMPAT_V070=1 -DCOMPAT_V072=1 -DCOMPAT_V073=1 -DCOMPAT_V080=1 -DCOMPAT_V081=1 -DCOMPAT_V082=1 -DCOMPAT_V090=1 -DCOMPAT_V0100=1
79endif
80
81# (method=thread to support xdist)
82PYTEST_OPTS := -v -p no:logging $(PYTEST_OPTS)
83PYTHONPATH=$(shell pwd)/contrib/pyln-client:$(shell pwd)/contrib/pyln-testing:$(shell pwd)/contrib/pyln-proto/:$(shell pwd)/external/lnprototest:$(shell pwd)/contrib/pyln-spec/bolt1:$(shell pwd)/contrib/pyln-spec/bolt2:$(shell pwd)/contrib/pyln-spec/bolt4:$(shell pwd)/contrib/pyln-spec/bolt7
84# Collect generated python files to be excluded from lint checks
85PYTHON_GENERATED=
86
87# Options to pass to cppcheck. Mostly used to exclude files that are
88# generated with external tools that we don't have control over
89CPPCHECK_OPTS=-q --language=c --std=c11 --error-exitcode=1 --suppressions-list=.cppcheck-suppress --inline-suppr
90
91# This is where we add new features as bitcoin adds them.
92FEATURES :=
93
94CCAN_OBJS :=					\
95	ccan-asort.o				\
96	ccan-bitmap.o				\
97	ccan-bitops.o				\
98	ccan-breakpoint.o			\
99	ccan-closefrom.o			\
100	ccan-crc32c.o				\
101	ccan-crypto-hmac.o			\
102	ccan-crypto-hkdf.o			\
103	ccan-crypto-ripemd160.o			\
104	ccan-crypto-sha256.o			\
105	ccan-crypto-shachain.o			\
106	ccan-crypto-siphash24.o			\
107	ccan-err.o				\
108	ccan-fdpass.o				\
109	ccan-htable.o				\
110	ccan-ilog.o				\
111	ccan-io-io.o				\
112	ccan-intmap.o				\
113	ccan-io-poll.o				\
114	ccan-io-fdpass.o			\
115	ccan-isaac.o				\
116	ccan-isaac64.o				\
117	ccan-json_escape.o			\
118	ccan-json_out.o				\
119	ccan-list.o				\
120	ccan-mem.o				\
121	ccan-membuf.o				\
122	ccan-noerr.o				\
123	ccan-opt-helpers.o			\
124	ccan-opt-parse.o			\
125	ccan-opt-usage.o			\
126	ccan-opt.o				\
127	ccan-pipecmd.o				\
128	ccan-ptr_valid.o			\
129	ccan-rbuf.o				\
130	ccan-read_write_all.o			\
131	ccan-str-base32.o			\
132	ccan-str-hex.o				\
133	ccan-str.o				\
134	ccan-strmap.o				\
135	ccan-take.o				\
136	ccan-tal-grab_file.o			\
137	ccan-tal-link.o				\
138	ccan-tal-path.o				\
139	ccan-tal-str.o				\
140	ccan-tal.o				\
141	ccan-time.o				\
142	ccan-timer.o				\
143	ccan-utf8.o
144
145CCAN_HEADERS :=						\
146	$(CCANDIR)/config.h				\
147	$(CCANDIR)/ccan/alignof/alignof.h		\
148	$(CCANDIR)/ccan/array_size/array_size.h		\
149	$(CCANDIR)/ccan/asort/asort.h			\
150	$(CCANDIR)/ccan/base64/base64.h			\
151	$(CCANDIR)/ccan/bitmap/bitmap.h			\
152	$(CCANDIR)/ccan/bitops/bitops.h			\
153	$(CCANDIR)/ccan/breakpoint/breakpoint.h		\
154	$(CCANDIR)/ccan/build_assert/build_assert.h	\
155	$(CCANDIR)/ccan/cast/cast.h			\
156	$(CCANDIR)/ccan/cdump/cdump.h			\
157	$(CCANDIR)/ccan/check_type/check_type.h		\
158	$(CCANDIR)/ccan/closefrom/closefrom.h		\
159	$(CCANDIR)/ccan/compiler/compiler.h		\
160	$(CCANDIR)/ccan/container_of/container_of.h	\
161	$(CCANDIR)/ccan/cppmagic/cppmagic.h		\
162	$(CCANDIR)/ccan/crc32c/crc32c.h			\
163	$(CCANDIR)/ccan/crypto/hkdf_sha256/hkdf_sha256.h \
164	$(CCANDIR)/ccan/crypto/hmac_sha256/hmac_sha256.h \
165	$(CCANDIR)/ccan/crypto/ripemd160/ripemd160.h	\
166	$(CCANDIR)/ccan/crypto/sha256/sha256.h		\
167	$(CCANDIR)/ccan/crypto/shachain/shachain.h	\
168	$(CCANDIR)/ccan/crypto/siphash24/siphash24.h	\
169	$(CCANDIR)/ccan/endian/endian.h			\
170	$(CCANDIR)/ccan/err/err.h			\
171	$(CCANDIR)/ccan/fdpass/fdpass.h			\
172	$(CCANDIR)/ccan/htable/htable.h			\
173	$(CCANDIR)/ccan/htable/htable_type.h		\
174	$(CCANDIR)/ccan/ilog/ilog.h			\
175	$(CCANDIR)/ccan/intmap/intmap.h			\
176	$(CCANDIR)/ccan/io/backend.h			\
177	$(CCANDIR)/ccan/io/fdpass/fdpass.h		\
178	$(CCANDIR)/ccan/io/io.h				\
179	$(CCANDIR)/ccan/io/io_plan.h			\
180	$(CCANDIR)/ccan/isaac/isaac.h			\
181	$(CCANDIR)/ccan/isaac/isaac64.h			\
182	$(CCANDIR)/ccan/json_escape/json_escape.h	\
183	$(CCANDIR)/ccan/json_out/json_out.h		\
184	$(CCANDIR)/ccan/likely/likely.h			\
185	$(CCANDIR)/ccan/list/list.h			\
186	$(CCANDIR)/ccan/mem/mem.h			\
187	$(CCANDIR)/ccan/membuf/membuf.h			\
188	$(CCANDIR)/ccan/noerr/noerr.h			\
189	$(CCANDIR)/ccan/opt/opt.h			\
190	$(CCANDIR)/ccan/opt/private.h			\
191	$(CCANDIR)/ccan/order/order.h			\
192	$(CCANDIR)/ccan/pipecmd/pipecmd.h		\
193	$(CCANDIR)/ccan/ptr_valid/ptr_valid.h		\
194	$(CCANDIR)/ccan/ptrint/ptrint.h			\
195	$(CCANDIR)/ccan/rbuf/rbuf.h			\
196	$(CCANDIR)/ccan/read_write_all/read_write_all.h	\
197	$(CCANDIR)/ccan/short_types/short_types.h	\
198	$(CCANDIR)/ccan/str/base32/base32.h		\
199	$(CCANDIR)/ccan/str/hex/hex.h			\
200	$(CCANDIR)/ccan/str/str.h			\
201	$(CCANDIR)/ccan/str/str_debug.h			\
202	$(CCANDIR)/ccan/strmap/strmap.h			\
203	$(CCANDIR)/ccan/structeq/structeq.h		\
204	$(CCANDIR)/ccan/take/take.h			\
205	$(CCANDIR)/ccan/tal/grab_file/grab_file.h	\
206	$(CCANDIR)/ccan/tal/link/link.h			\
207	$(CCANDIR)/ccan/tal/path/path.h			\
208	$(CCANDIR)/ccan/tal/str/str.h			\
209	$(CCANDIR)/ccan/tal/tal.h			\
210	$(CCANDIR)/ccan/tcon/tcon.h			\
211	$(CCANDIR)/ccan/time/time.h			\
212	$(CCANDIR)/ccan/timer/timer.h			\
213	$(CCANDIR)/ccan/typesafe_cb/typesafe_cb.h	\
214	$(CCANDIR)/ccan/utf8/utf8.h
215
216CDUMP_OBJS := ccan-cdump.o ccan-strmap.o
217
218BOLT_GEN := tools/generate-wire.py
219WIRE_GEN := $(BOLT_GEN)
220
221# If you use wiregen, you're dependent on the tool and its templates
222WIRE_GEN_DEPS := $(WIRE_GEN) $(wildcard tools/gen/*_template)
223
224# These are filled by individual Makefiles
225ALL_PROGRAMS :=
226ALL_TEST_PROGRAMS :=
227ALL_FUZZ_TARGETS :=
228ALL_C_SOURCES :=
229ALL_C_HEADERS := header_versions_gen.h version_gen.h
230
231CPPFLAGS += -DBINTOPKGLIBEXECDIR="\"$(shell sh tools/rel.sh $(bindir) $(pkglibexecdir))\""
232CFLAGS = $(CPPFLAGS) $(CWARNFLAGS) $(CDEBUGFLAGS) $(COPTFLAGS) -I $(CCANDIR) $(EXTERNAL_INCLUDE_FLAGS) -I . -I/usr/local/include $(SQLITE3_CFLAGS) $(POSTGRES_INCLUDE) $(FEATURES) $(COVFLAGS) $(DEV_CFLAGS) -DSHACHAIN_BITS=48 -DJSMN_PARENT_LINKS $(PIE_CFLAGS) $(COMPAT_CFLAGS) -DBUILD_ELEMENTS=1
233# If CFLAGS is already set in the environment of make (to whatever value, it
234# does not matter) then it would export it to subprocesses with the above value
235# we set, including CWARNFLAGS which by default contains -Wall -Werror. This
236# breaks at least libwally-core which tries to switch off some warnings with
237# -Wno-whatever. So, tell make to not export our CFLAGS to subprocesses.
238unexport CFLAGS
239
240# We can get configurator to run a different compile cmd to cross-configure.
241CONFIGURATOR_CC := $(CC)
242
243LDFLAGS += $(PIE_LDFLAGS) $(SANITIZER_FLAGS) $(COPTFLAGS)
244CFLAGS += $(SANITIZER_FLAGS)
245
246ifeq ($(STATIC),1)
247# For MacOS, Jacob Rapoport <jacob@rumblemonkey.com> changed this to:
248#  -L/usr/local/lib -Wl,-lgmp -lsqlite3 -lz -Wl,-lm -lpthread -ldl $(COVFLAGS)
249# But that doesn't static link.
250LDLIBS = -L/usr/local/lib -Wl,-dn -lgmp $(SQLITE3_LDLIBS) -lz -Wl,-dy -lm -lpthread -ldl $(COVFLAGS)
251else
252LDLIBS = -L/usr/local/lib -lm -lgmp $(SQLITE3_LDLIBS) -lz $(COVFLAGS)
253endif
254
255# If we have the postgres client library we need to link against it as well
256ifeq ($(HAVE_POSTGRES),1)
257LDLIBS += $(POSTGRES_LDLIBS)
258endif
259
260default: show-flags all-programs all-test-programs doc-all
261
262ifneq ($(SUPPRESS_GENERATION),1)
263FORCE = FORCE
264FORCE::
265endif
266
267show-flags: config.vars
268	@$(ECHO) "CC: $(CC) $(CFLAGS) -c -o"
269	@$(ECHO) "LD: $(LINK.o) $(filter-out %.a,$^) $(LOADLIBES) $(EXTERNAL_LDLIBS) $(LDLIBS) -o"
270
271ccan/config.h: config.vars configure ccan/tools/configurator/configurator.c
272	./configure --reconfigure
273
274config.vars:
275	@echo 'File config.vars not found: you must run ./configure before running make.' >&2
276	@exit 1
277
278%.o: %.c
279	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
280
281# '_exp' inserted before _wiregen.[ch] to demark experimental
282# spec-derived headers, which are *not* committed into git.
283ifeq ($(EXPERIMENTAL_FEATURES),1)
284EXP := _exp
285else
286EXP :=
287endif
288
289# tools/update-mocks.sh does nasty recursive make, must not do this!
290ifeq ($(SUPPRESS_GENERATION),1)
291SHA256STAMP_CHANGED = false
292SHA256STAMP = exit 1
293else
294# Git doesn't maintain timestamps, so we only regen if sources actually changed:
295# We place the SHA inside some generated files so we can tell if they need updating.
296# Usage: $(call SHA256STAMP_CHANGED)
297SHA256STAMP_CHANGED = [ x"`sed -n 's/.*SHA256STAMP:\([a-f0-9]*\).*/\1/p' $@ 2>/dev/null`" != x"`cat $(sort $(filter-out FORCE,$^)) | $(SHA256SUM) | cut -c1-64`" ]
298# Usage: $(call SHA256STAMP,commentprefix,commentpostfix)
299SHA256STAMP = echo "$(1) SHA256STAMP:"`cat $(sort $(filter-out FORCE,$^)) | $(SHA256SUM) | cut -c1-64`"$(2)" >> $@
300endif
301
302# generate-wire.py --page [header|impl] hdrfilename wirename < csv > file
303%_wiregen.h: %_wire.csv $(WIRE_GEN_DEPS)
304	@if $(call SHA256STAMP_CHANGED); then \
305		$(call VERBOSE,"wiregen $@",tools/generate-wire.py --page header $($@_args) $@ `basename $< .csv | sed 's/_exp_/_/'` < $< > $@ && $(call SHA256STAMP,//,)); \
306	fi
307
308%_wiregen.c: %_wire.csv $(WIRE_GEN_DEPS)
309	@if $(call SHA256STAMP_CHANGED); then \
310		$(call VERBOSE,"wiregen $@",tools/generate-wire.py --page impl $($@_args) ${@:.c=.h} `basename $< .csv | sed 's/_exp_/_/'` < $< > $@ && $(call SHA256STAMP,//,)); \
311	fi
312
313%_printgen.h: %_wire.csv $(WIRE_GEN_DEPS)
314	@if $(call SHA256STAMP_CHANGED); then \
315		$(call VERBOSE,"printgen $@",tools/generate-wire.py -s -P --page header $($@_args) $@ `basename $< .csv | sed 's/_exp_/_/'` < $< > $@ && $(call SHA256STAMP,//,)); \
316	fi
317
318%_printgen.c: %_wire.csv $(WIRE_GEN_DEPS)
319	@if $(call SHA256STAMP_CHANGED); then \
320		$(call VERBOSE,"printgen $@",tools/generate-wire.py -s -P --page impl $($@_args) ${@:.c=.h} `basename $< .csv | sed 's/_exp_/_/'` < $< > $@ && $(call SHA256STAMP,//,)); \
321	fi
322
323include external/Makefile
324include bitcoin/Makefile
325include common/Makefile
326include wire/Makefile
327include hsmd/Makefile
328include gossipd/Makefile
329include openingd/Makefile
330include channeld/Makefile
331include closingd/Makefile
332include onchaind/Makefile
333include connectd/Makefile
334include lightningd/Makefile
335include cli/Makefile
336include doc/Makefile
337include devtools/Makefile
338include tools/Makefile
339include plugins/Makefile
340include tests/plugins/Makefile
341include contrib/libhsmd_python/Makefile
342ifneq ($(FUZZING),0)
343	include tests/fuzz/Makefile
344endif
345
346# We make pretty much everything depend on these.
347ALL_GEN_HEADERS := $(filter %gen.h,$(ALL_C_HEADERS))
348ALL_GEN_SOURCES := $(filter %gen.c,$(ALL_C_SOURCES))
349ALL_NONGEN_HEADERS := $(filter-out %gen.h,$(ALL_C_HEADERS))
350ALL_NONGEN_SOURCES := $(filter-out %gen.c,$(ALL_C_SOURCES))
351ALL_NONGEN_SRCFILES := $(ALL_NONGEN_HEADERS) $(ALL_NONGEN_SOURCES)
352
353# Programs to install in bindir and pkglibexecdir.
354# TODO: $(EXEEXT) support for Windows?  Needs more coding for
355# the individual Makefiles, however.
356BIN_PROGRAMS = \
357	       cli/lightning-cli \
358	       lightningd/lightningd \
359	       tools/lightning-hsmtool
360PKGLIBEXEC_PROGRAMS = \
361	       lightningd/lightning_channeld \
362	       lightningd/lightning_closingd \
363	       lightningd/lightning_connectd \
364	       lightningd/lightning_dualopend \
365	       lightningd/lightning_gossipd \
366	       lightningd/lightning_hsmd \
367	       lightningd/lightning_onchaind \
368	       lightningd/lightning_openingd \
369	       lightningd/lightning_websocketd
370
371# Don't delete these intermediaries.
372.PRECIOUS: $(ALL_GEN_HEADERS) $(ALL_GEN_SOURCES)
373
374# Every single object file.
375ALL_OBJS := $(ALL_C_SOURCES:.c=.o)
376
377# We always regen wiregen and printgen files, since SHA256STAMP protects against
378# spurious rebuilds.
379$(filter %printgen.h %printgen.c %wiregen.h %wiregen.c, $(ALL_C_HEADERS) $(ALL_C_SOURCES)): $(FORCE)
380
381ifneq ($(TEST_GROUP_COUNT),)
382PYTEST_OPTS += --test-group=$(TEST_GROUP) --test-group-count=$(TEST_GROUP_COUNT)
383endif
384
385# If we run the tests in parallel we can speed testing up by a lot, however we
386# then don't exit on the first error, since that'd kill the other tester
387# processes and result in loads in loads of output. So we only tell py.test to
388# abort early if we aren't running in parallel.
389ifneq ($(PYTEST_PAR),)
390PYTEST_OPTS += -n=$(PYTEST_PAR)
391else
392PYTEST_OPTS += -x
393endif
394
395check-units:
396
397check: check-units installcheck check-protos pytest
398
399check-protos: $(ALL_PROGRAMS)
400ifeq ($(PYTEST),)
401	@echo "py.test is required to run the protocol tests, please install using 'pip3 install -r requirements.txt', and rerun 'configure'."; false
402else
403ifeq ($(DEVELOPER),1)
404	@(cd external/lnprototest && PYTHONPATH=$(PYTHONPATH) LIGHTNING_SRC=../.. $(PYTEST) --runner lnprototest.clightning.Runner $(PYTEST_OPTS))
405else
406	@echo "lnprototest target requires DEVELOPER=1, skipping"
407endif
408endif
409
410pytest: $(ALL_PROGRAMS) $(ALL_TEST_PROGRAMS)
411ifeq ($(PYTEST),)
412	@echo "py.test is required to run the integration tests, please install using 'pip3 install -r requirements.txt', and rerun 'configure'."
413	exit 1
414else
415# Explicitly hand DEVELOPER and VALGRIND so you can override on make cmd line.
416	PYTHONPATH=$(PYTHONPATH) TEST_DEBUG=1 DEVELOPER=$(DEVELOPER) VALGRIND=$(VALGRIND) $(PYTEST) tests/ $(PYTEST_OPTS)
417endif
418
419# Keep includes in alpha order.
420check-src-include-order/%: %
421	@if [ "$$(grep '^#include' < $<)" != "$$(grep '^#include' < $< | $(SORT))" ]; then echo "$<:1: includes out of order"; grep '^#include' < $<; echo VERSUS; grep '^#include' < $< | $(SORT); exit 1; fi
422
423# Keep includes in alpha order, after including "config.h"
424check-hdr-include-order/%: %
425	@if [ "$$(grep '^#include' < $< | head -n1)" != '#include "config.h"' ]; then echo "$<:1: doesn't include config.h first"; exit 1; fi
426	@if [ "$$(grep '^#include' < $< | tail -n +2)" != "$$(grep '^#include' < $< | tail -n +2 | $(SORT))" ]; then echo "$<:1: includes out of order"; exit 1; fi
427
428# Make sure Makefile includes all headers.
429check-makefile:
430	@if [ x"$(CCANDIR)/config.h `find $(CCANDIR)/ccan -name '*.h' | grep -v /test/ | $(SORT) | tr '\n' ' '`" != x"$(CCAN_HEADERS) " ]; then echo CCAN_HEADERS incorrect; exit 1; fi
431
432# We exclude test files, which need to do weird include tricks!
433SRC_TO_CHECK := $(filter-out $(ALL_TEST_PROGRAMS:=.c), $(ALL_NONGEN_SOURCES))
434check-src-includes: $(SRC_TO_CHECK:%=check-src-include-order/%)
435check-hdr-includes: $(ALL_NONGEN_HEADERS:%=check-hdr-include-order/%)
436
437# If you want to check a specific variant of quotes use:
438#   make check-source-bolt BOLTVERSION=xxx
439ifeq ($(BOLTVERSION),$(DEFAULT_BOLTVERSION))
440CHECK_BOLT_PREFIX=
441else
442CHECK_BOLT_PREFIX=--prefix="BOLT-$(BOLTVERSION)"
443endif
444
445# Any mention of BOLT# must be followed by an exact quote, modulo whitespace.
446bolt-check/%: % bolt-precheck tools/check-bolt
447	@if [ -d .tmp.lightningrfc ]; then tools/check-bolt $(CHECK_BOLT_PREFIX) .tmp.lightningrfc $<; else echo "Not checking BOLTs: BOLTDIR $(BOLTDIR) does not exist" >&2; fi
448
449LOCAL_BOLTDIR=.tmp.lightningrfc
450
451bolt-precheck:
452	@[ -d $(BOLTDIR) ] || exit 0; set -e; if [ -z "$(BOLTVERSION)" ]; then rm -rf $(LOCAL_BOLTDIR); ln -sf $(BOLTDIR) $(LOCAL_BOLTDIR); exit 0; fi; [ "$$(git -C $(LOCAL_BOLTDIR) rev-list --max-count=1 HEAD 2>/dev/null)" != "$(BOLTVERSION)" ] || exit 0; rm -rf $(LOCAL_BOLTDIR) && git clone -q $(BOLTDIR) $(LOCAL_BOLTDIR) && cd $(LOCAL_BOLTDIR) && git checkout -q $(BOLTVERSION)
453
454check-source-bolt: $(ALL_NONGEN_SRCFILES:%=bolt-check/%)
455
456check-whitespace/%: %
457	@if grep -Hn '[ 	]$$' $<; then echo Extraneous whitespace found >&2; exit 1; fi
458
459check-whitespace: check-whitespace/Makefile check-whitespace/tools/check-bolt.c $(ALL_NONGEN_SRCFILES:%=check-whitespace/%)
460
461check-markdown:
462	@tools/check-markdown.sh
463
464check-spelling:
465	@tools/check-spelling.sh
466
467PYSRC=$(shell git ls-files "*.py" | grep -v /text.py) contrib/pylightning/lightning-pay
468
469# Some tests in pyln will need to find lightningd to run, so have a PATH that
470# allows it to find that
471PYLN_PATH=$(shell pwd)/lightningd:$(PATH)
472check-pyln-%: $(BIN_PROGRAMS) $(PKGLIBEXEC_PROGRAMS) $(PLUGINS)
473	@(cd contrib/$(shell echo $@ | cut -b 7-) && PATH=$(PYLN_PATH) PYTHONPATH=$(PYTHONPATH) $(MAKE) check)
474
475check-python: check-python-flake8 check-pytest-pyln-proto check-pyln-client check-pyln-testing
476
477check-python-flake8:
478	@# E501 line too long (N > 79 characters)
479	@# E731 do not assign a lambda expression, use a def
480	@# W503: line break before binary operator
481	@# E741: ambiguous variable name
482	@flake8 --ignore=E501,E731,E741,W503 --exclude $(shell echo ${PYTHON_GENERATED} | sed 's/ \+/,/g') ${PYSRC}
483
484check-pytest-pyln-proto:
485	PATH=$(PYLN_PATH) PYTHONPATH=$(PYTHONPATH) $(PYTEST) contrib/pyln-proto/tests/
486
487check-includes: check-src-includes check-hdr-includes
488	@tools/check-includes.sh
489
490# cppcheck gets confused by list_for_each(head, i, list): thinks i is uninit.
491.cppcheck-suppress:
492	@git ls-files -- "*.c" "*.h" | grep -vE '^(ccan|contrib)/' | xargs grep -n '_for_each' | sed 's/\([^:]*:.*\):.*/uninitvar:\1/' > $@
493
494check-cppcheck: .cppcheck-suppress
495	@trap 'rm -f .cppcheck-suppress' 0; git ls-files -- "*.c" "*.h" | grep -vE '^ccan/' | xargs cppcheck  ${CPPCHECK_OPTS}
496
497check-shellcheck:
498	@git ls-files -- "*.sh" | xargs shellcheck
499
500check-setup_locale:
501	@tools/check-setup_locale.sh
502
503check-tmpctx:
504	@if git grep -n 'tal_free[(]tmpctx)' | grep -Ev '^ccan/|/test/|^common/setup.c:|^common/utils.c:'; then echo "Don't free tmpctx!">&2; exit 1; fi
505
506check-discouraged-functions:
507	@if git grep -E "[^a-z_/](fgets|fputs|gets|scanf|sprintf)\(" -- "*.c" "*.h" ":(exclude)ccan/" ":(exclude)contrib/"; then exit 1; fi
508
509# Don't access amount_msat and amount_sat members directly without a good reason
510# since it risks overflow.
511check-amount-access:
512	@! (git grep -nE "(->|\.)(milli)?satoshis" -- "*.c" "*.h" ":(exclude)common/amount.*" ":(exclude)*/test/*" | grep -v '/* Raw:')
513	@! git grep -nE "\\(struct amount_(m)?sat\\)" -- "*.c" "*.h" ":(exclude)common/amount.*" ":(exclude)*/test/*"
514
515check-source: check-makefile check-source-bolt check-whitespace check-markdown check-spelling check-python check-includes check-cppcheck check-shellcheck check-setup_locale check-tmpctx check-discouraged-functions check-amount-access
516
517full-check: check check-source
518
519# Simple target to be used on CI systems to check that all the derived
520# files were checked in and updated. It depends on the generated
521# targets, and checks if any of the tracked files changed. If they did
522# then one of the gen-targets caused this change, meaning either the
523# gen-target is not reproducible or the files were forgotten.
524#
525# Do not run on your development tree since it will complain if you
526# have a dirty tree.
527check-gen-updated: $(ALL_GEN_HEADERS) $(ALL_GEN_SOURCES) wallet/statements_gettextgen.po $(MANPAGES)
528	@echo "Checking for generated files being changed by make"
529	git diff --exit-code HEAD $?
530
531coverage/coverage.info: check pytest
532	mkdir coverage || true
533	lcov --capture --directory . --output-file coverage/coverage.info
534
535coverage: coverage/coverage.info
536	genhtml coverage/coverage.info --output-directory coverage
537
538# We make libwallycore.la a dependency, so that it gets built normally, without ncc.
539# Ncc can't handle the libwally source code (yet).
540ncc: ${TARGET_DIR}/libwally-core-build/src/libwallycore.la
541	$(MAKE) CC="ncc -ncgcc -ncld -ncfabs" AR=nccar LD=nccld
542
543# Ignore test/ directories.
544TAGS:
545	$(RM) TAGS; find * -name test -type d -prune -o -name '*.[ch]' -print -o -name '*.py' -print | xargs etags --append
546
547ccan/ccan/cdump/tools/cdump-enumstr: ccan/ccan/cdump/tools/cdump-enumstr.o $(CDUMP_OBJS) $(CCAN_OBJS)
548
549ALL_PROGRAMS += ccan/ccan/cdump/tools/cdump-enumstr
550# Can't add to ALL_OBJS, as that makes a circular dep.
551ccan/ccan/cdump/tools/cdump-enumstr.o: $(CCAN_HEADERS) Makefile
552
553version_gen.h: $(FORCE)
554	@(echo "#define VERSION \"$(VERSION)\"" && echo "#define BUILD_FEATURES \"$(FEATURES)\"") > $@.new
555	@if cmp $@.new $@ >/dev/null 2>&1; then rm -f $@.new; else mv $@.new $@; $(ECHO) Version updated; fi
556
557# That forces this rule to be run every time, too.
558header_versions_gen.h: tools/headerversions
559	@tools/headerversions $@
560
561# All binaries require the external libs, ccan and system library versions.
562$(ALL_PROGRAMS) $(ALL_TEST_PROGRAMS) $(ALL_FUZZ_TARGETS): $(EXTERNAL_LIBS) $(CCAN_OBJS)
563
564# Each test program depends on its own object.
565$(ALL_TEST_PROGRAMS) $(ALL_FUZZ_TARGETS): %: %.o
566
567# Without this rule, the (built-in) link line contains
568# external/libwallycore.a directly, which causes a symbol clash (it
569# uses some ccan modules internally).  We want to rely on -lwallycore etc.
570# (as per EXTERNAL_LDLIBS) so we filter them out here.
571$(ALL_PROGRAMS) $(ALL_TEST_PROGRAMS):
572	@$(call VERBOSE, "ld $@", $(LINK.o) $(filter-out %.a,$^) $(LOADLIBES) $(EXTERNAL_LDLIBS) $(LDLIBS) -o $@)
573
574# We special case the fuzzing target binaries, as they need to link against libfuzzer,
575# which brings its own main().
576FUZZ_LDFLAGS = -fsanitize=fuzzer
577$(ALL_FUZZ_TARGETS):
578	@$(call VERBOSE, "ld $@", $(LINK.o) $(filter-out %.a,$^) $(LOADLIBES) $(EXTERNAL_LDLIBS) $(LDLIBS) $(FUZZ_LDFLAGS) -o $@)
579
580
581# Everything depends on the CCAN headers, and Makefile
582$(CCAN_OBJS) $(CDUMP_OBJS): $(CCAN_HEADERS) Makefile
583
584# Except for CCAN, we treat everything else as dependent on external/ bitcoin/ common/ wire/ and all generated headers, and Makefile
585$(ALL_OBJS): $(BITCOIN_HEADERS) $(COMMON_HEADERS) $(CCAN_HEADERS) $(WIRE_HEADERS) $(ALL_GEN_HEADERS) $(EXTERNAL_HEADERS) Makefile
586
587# Test files can literally #include generated C files.
588$(ALL_TEST_PROGRAMS:=.o): $(ALL_GEN_SOURCES)
589
590update-ccan:
591	mv ccan ccan.old
592	DIR=$$(pwd)/ccan; cd ../ccan && ./tools/create-ccan-tree -a $$DIR `cd $$DIR.old/ccan && find * -name _info | sed s,/_info,, | $(SORT)` $(CCAN_NEW)
593	mkdir -p ccan/tools/configurator
594	cp ../ccan/tools/configurator/configurator.c ../ccan/doc/configurator.1 ccan/tools/configurator/
595	$(MAKE) ccan/config.h
596	grep -v '^CCAN version:' ccan.old/README > ccan/README
597	echo CCAN version: `git -C ../ccan describe` >> ccan/README
598	$(RM) -r ccan.old
599	$(RM) -r ccan/ccan/hash/ ccan/ccan/tal/talloc/	# Unnecessary deps
600
601# Now ALL_PROGRAMS is fully populated, we can expand it.
602all-programs: $(ALL_PROGRAMS)
603all-test-programs: $(ALL_TEST_PROGRAMS) $(ALL_FUZZ_TARGETS)
604
605distclean: clean
606	$(RM) ccan/config.h config.vars
607
608maintainer-clean: distclean
609	@echo 'This command is intended for maintainers to use; it'
610	@echo 'deletes files that may need special tools to rebuild.'
611	$(RM) $(ALL_GEN_HEADERS) $(ALL_GEN_SOURCES)
612
613# We used to have gen_ files, now we have _gen files.
614obsclean:
615	$(RM) gen_*.h */gen_*.[ch] */*/gen_*.[ch]
616
617clean: obsclean
618	$(RM) $(CCAN_OBJS) $(CDUMP_OBJS) $(ALL_OBJS)
619	$(RM) $(ALL_PROGRAMS)
620	$(RM) $(ALL_TEST_PROGRAMS)
621	$(RM) $(ALL_FUZZ_TARGETS)
622	$(RM) ccan/tools/configurator/configurator
623	$(RM) ccan/ccan/cdump/tools/cdump-enumstr.o
624	find . -name '*gcda' -delete
625	find . -name '*gcno' -delete
626	find . -name '*.nccout' -delete
627
628# These must both be enabled for update-mocks
629ifeq ($(DEVELOPER)$(EXPERIMENTAL_FEATURES),11)
630update-mocks: $(ALL_TEST_PROGRAMS:%=update-mocks/%.c)
631else
632update-mocks:
633	@echo Need DEVELOPER=1 and EXPERIMENTAL_FEATURES=1 to regenerate mocks >&2; exit 1
634endif
635
636$(ALL_TEST_PROGRAMS:%=update-mocks/%.c): $(ALL_GEN_HEADERS) $(EXTERNAL_LIBS) $(CCAN_OBJS) ccan/ccan/cdump/tools/cdump-enumstr config.vars
637
638update-mocks/%: %
639	@MAKE=$(MAKE) tools/update-mocks.sh "$*" $(SUPPRESS_OUTPUT)
640
641unittest/%: %
642	$(VG) $(VG_TEST_ARGS) $* > /dev/null
643
644# Installation directories
645exec_prefix = $(PREFIX)
646bindir = $(exec_prefix)/bin
647libexecdir = $(exec_prefix)/libexec
648pkglibexecdir = $(libexecdir)/$(PKGNAME)
649plugindir = $(pkglibexecdir)/plugins
650datadir = $(PREFIX)/share
651docdir = $(datadir)/doc/$(PKGNAME)
652mandir = $(PREFIX)/man
653man1dir = $(mandir)/man1
654man5dir = $(mandir)/man5
655man7dir = $(mandir)/man7
656man8dir = $(mandir)/man8
657
658# Commands
659MKDIR_P = mkdir -p
660INSTALL = install
661ifeq ($(DEVELOPER),1)
662INSTALL_PROGRAM = $(INSTALL)
663else
664INSTALL_PROGRAM = $(INSTALL) -s
665endif
666INSTALL_DATA = $(INSTALL) -m 644
667
668# Tags needed by some package systems.
669PRE_INSTALL = :
670NORMAL_INSTALL = :
671POST_INSTALL = :
672PRE_UNINSTALL = :
673NORMAL_UNINSTALL = :
674POST_UNINSTALL = :
675
676# Target to create directories.
677installdirs:
678	@$(NORMAL_INSTALL)
679	$(MKDIR_P) $(DESTDIR)$(bindir)
680	$(MKDIR_P) $(DESTDIR)$(pkglibexecdir)
681	$(MKDIR_P) $(DESTDIR)$(plugindir)
682	$(MKDIR_P) $(DESTDIR)$(man1dir)
683	$(MKDIR_P) $(DESTDIR)$(man5dir)
684	$(MKDIR_P) $(DESTDIR)$(man7dir)
685	$(MKDIR_P) $(DESTDIR)$(man8dir)
686	$(MKDIR_P) $(DESTDIR)$(docdir)
687
688# $(PLUGINS) is defined in plugins/Makefile.
689
690install-program: installdirs $(BIN_PROGRAMS) $(PKGLIBEXEC_PROGRAMS) $(PLUGINS)
691	@$(NORMAL_INSTALL)
692	$(INSTALL_PROGRAM) $(BIN_PROGRAMS) $(DESTDIR)$(bindir)
693	$(INSTALL_PROGRAM) $(PKGLIBEXEC_PROGRAMS) $(DESTDIR)$(pkglibexecdir)
694	[ -z "$(PLUGINS)" ] || $(INSTALL_PROGRAM) $(PLUGINS) $(DESTDIR)$(plugindir)
695
696MAN1PAGES = $(filter %.1,$(MANPAGES))
697MAN5PAGES = $(filter %.5,$(MANPAGES))
698MAN7PAGES = $(filter %.7,$(MANPAGES))
699MAN8PAGES = $(filter %.8,$(MANPAGES))
700DOC_DATA = README.md doc/INSTALL.md doc/HACKING.md LICENSE
701
702install-data: installdirs $(MAN1PAGES) $(MAN5PAGES) $(MAN7PAGES) $(MAN8PAGES) $(DOC_DATA)
703	@$(NORMAL_INSTALL)
704	$(INSTALL_DATA) $(MAN1PAGES) $(DESTDIR)$(man1dir)
705	$(INSTALL_DATA) $(MAN5PAGES) $(DESTDIR)$(man5dir)
706	$(INSTALL_DATA) $(MAN7PAGES) $(DESTDIR)$(man7dir)
707	$(INSTALL_DATA) $(MAN8PAGES) $(DESTDIR)$(man8dir)
708	$(INSTALL_DATA) $(DOC_DATA) $(DESTDIR)$(docdir)
709
710install: install-program install-data
711
712uninstall:
713	@$(NORMAL_UNINSTALL)
714	@for f in $(BIN_PROGRAMS); do \
715	  $(ECHO) rm -f $(DESTDIR)$(bindir)/`basename $$f`; \
716	  rm -f $(DESTDIR)$(bindir)/`basename $$f`; \
717	done
718	@for f in $(PLUGINS); do \
719	  $(ECHO) rm -f $(DESTDIR)$(plugindir)/`basename $$f`; \
720	  rm -f $(DESTDIR)$(plugindir)/`basename $$f`; \
721	done
722	@for f in $(PKGLIBEXEC_PROGRAMS); do \
723	  $(ECHO) rm -f $(DESTDIR)$(pkglibexecdir)/`basename $$f`; \
724	  rm -f $(DESTDIR)$(pkglibexecdir)/`basename $$f`; \
725	done
726	@for f in $(MAN1PAGES); do \
727	  $(ECHO) rm -f $(DESTDIR)$(man1dir)/`basename $$f`; \
728	  rm -f $(DESTDIR)$(man1dir)/`basename $$f`; \
729	done
730	@for f in $(MAN5PAGES); do \
731	  $(ECHO) rm -f $(DESTDIR)$(man5dir)/`basename $$f`; \
732	  rm -f $(DESTDIR)$(man5dir)/`basename $$f`; \
733	done
734	@for f in $(MAN7PAGES); do \
735	  $(ECHO) rm -f $(DESTDIR)$(man7dir)/`basename $$f`; \
736	  rm -f $(DESTDIR)$(man7dir)/`basename $$f`; \
737	done
738	@for f in $(MAN8PAGES); do \
739	  $(ECHO) rm -f $(DESTDIR)$(man8dir)/`basename $$f`; \
740	  rm -f $(DESTDIR)$(man8dir)/`basename $$f`; \
741	done
742	@for f in $(DOC_DATA); do \
743	  $(ECHO) rm -f $(DESTDIR)$(docdir)/`basename $$f`; \
744	  rm -f $(DESTDIR)$(docdir)/`basename $$f`; \
745	done
746
747installcheck: all-programs
748	@rm -rf testinstall || true
749	$(MAKE) DESTDIR=$$(pwd)/testinstall install
750	testinstall$(bindir)/lightningd --test-daemons-only --lightning-dir=testinstall
751	$(MAKE) DESTDIR=$$(pwd)/testinstall uninstall
752	@if test `find testinstall '!' -type d | wc -l` -ne 0; then \
753		echo 'make uninstall left some files in testinstall directory!'; \
754		exit 1; \
755	fi
756	@rm -rf testinstall || true
757
758.PHONY: installdirs install-program install-data install uninstall \
759	installcheck ncc bin-tarball show-flags
760
761# Make a tarball of opt/clightning/, optionally with label for distribution.
762bin-tarball: clightning-$(VERSION)-$(DISTRO).tar.xz
763clightning-$(VERSION)-$(DISTRO).tar.xz: DESTDIR=$(shell pwd)/
764clightning-$(VERSION)-$(DISTRO).tar.xz: prefix=opt/clightning
765clightning-$(VERSION)-$(DISTRO).tar.xz: install
766	trap "rm -rf opt" 0; tar cvfa $@ opt/
767
768ccan-breakpoint.o: $(CCANDIR)/ccan/breakpoint/breakpoint.c
769	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
770ccan-tal.o: $(CCANDIR)/ccan/tal/tal.c
771	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
772ccan-tal-str.o: $(CCANDIR)/ccan/tal/str/str.c
773	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
774ccan-tal-link.o: $(CCANDIR)/ccan/tal/link/link.c
775	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
776ccan-tal-path.o: $(CCANDIR)/ccan/tal/path/path.c
777	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
778ccan-tal-grab_file.o: $(CCANDIR)/ccan/tal/grab_file/grab_file.c
779	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
780ccan-take.o: $(CCANDIR)/ccan/take/take.c
781	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
782ccan-list.o: $(CCANDIR)/ccan/list/list.c
783	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
784ccan-asort.o: $(CCANDIR)/ccan/asort/asort.c
785	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
786ccan-ptr_valid.o: $(CCANDIR)/ccan/ptr_valid/ptr_valid.c
787	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
788ccan-read_write_all.o: $(CCANDIR)/ccan/read_write_all/read_write_all.c
789	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
790ccan-str.o: $(CCANDIR)/ccan/str/str.c
791	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
792ccan-opt.o: $(CCANDIR)/ccan/opt/opt.c
793	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
794ccan-opt-helpers.o: $(CCANDIR)/ccan/opt/helpers.c
795	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
796ccan-opt-parse.o: $(CCANDIR)/ccan/opt/parse.c
797	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
798ccan-opt-usage.o: $(CCANDIR)/ccan/opt/usage.c
799	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
800ccan-err.o: $(CCANDIR)/ccan/err/err.c
801	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
802ccan-noerr.o: $(CCANDIR)/ccan/noerr/noerr.c
803	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
804ccan-str-hex.o: $(CCANDIR)/ccan/str/hex/hex.c
805	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
806ccan-crc32c.o: $(CCANDIR)/ccan/crc32c/crc32c.c
807	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
808ccan-crypto-hmac.o: $(CCANDIR)/ccan/crypto/hmac_sha256/hmac_sha256.c
809	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
810ccan-crypto-hkdf.o: $(CCANDIR)/ccan/crypto/hkdf_sha256/hkdf_sha256.c
811	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
812ccan-crypto-shachain.o: $(CCANDIR)/ccan/crypto/shachain/shachain.c
813	@$(call VERBOSE, "cc $< -DSHACHAIN_BITS=48", $(CC) $(CFLAGS) -DSHACHAIN_BITS=48 -c -o $@ $<)
814ccan-crypto-sha256.o: $(CCANDIR)/ccan/crypto/sha256/sha256.c
815	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
816ccan-crypto-ripemd160.o: $(CCANDIR)/ccan/crypto/ripemd160/ripemd160.c
817	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
818ccan-cdump.o: $(CCANDIR)/ccan/cdump/cdump.c
819	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
820ccan-strmap.o: $(CCANDIR)/ccan/strmap/strmap.c
821	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
822ccan-crypto-siphash24.o: $(CCANDIR)/ccan/crypto/siphash24/siphash24.c
823	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
824ccan-htable.o: $(CCANDIR)/ccan/htable/htable.c
825	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
826ccan-ilog.o: $(CCANDIR)/ccan/ilog/ilog.c
827	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
828ccan-intmap.o: $(CCANDIR)/ccan/intmap/intmap.c
829	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
830ccan-isaac.o: $(CCANDIR)/ccan/isaac/isaac.c
831	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
832ccan-isaac64.o: $(CCANDIR)/ccan/isaac/isaac64.c
833	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
834ccan-time.o: $(CCANDIR)/ccan/time/time.c
835	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
836ccan-timer.o: $(CCANDIR)/ccan/timer/timer.c
837	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
838ccan-io-io.o: $(CCANDIR)/ccan/io/io.c
839	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
840ccan-io-poll.o: $(CCANDIR)/ccan/io/poll.c
841	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
842ccan-io-fdpass.o: $(CCANDIR)/ccan/io/fdpass/fdpass.c
843	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
844ccan-pipecmd.o: $(CCANDIR)/ccan/pipecmd/pipecmd.c
845	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
846ccan-mem.o: $(CCANDIR)/ccan/mem/mem.c
847	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
848ccan-fdpass.o: $(CCANDIR)/ccan/fdpass/fdpass.c
849	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
850ccan-bitops.o: $(CCANDIR)/ccan/bitops/bitops.c
851	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
852ccan-rbuf.o: $(CCANDIR)/ccan/rbuf/rbuf.c
853	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
854ccan-str-base32.o: $(CCANDIR)/ccan/str/base32/base32.c
855	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
856ccan-utf8.o: $(CCANDIR)/ccan/utf8/utf8.c
857	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
858ccan-bitmap.o: $(CCANDIR)/ccan/bitmap/bitmap.c
859	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
860ccan-membuf.o: $(CCANDIR)/ccan/membuf/membuf.c
861	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
862ccan-json_escape.o: $(CCANDIR)/ccan/json_escape/json_escape.c
863	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
864ccan-json_out.o: $(CCANDIR)/ccan/json_out/json_out.c
865	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
866ccan-closefrom.o: $(CCANDIR)/ccan/closefrom/closefrom.c
867	@$(call VERBOSE, "cc $<", $(CC) $(CFLAGS) -c -o $@ $<)
868