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