[ccan] embedding ccan in other projects redux
    Rusty Russell 
    rusty at rustcorp.com.au
       
    Wed Aug 19 11:55:29 AEST 2015
    
    
  
Naveen Nathan <naveen at lastninja.net> writes:
> Earlier I had started a discussion about how to approach embedding
> specific ccan modules into a Python C extension project. I discussed
> the options available with David Gibson over IRC. This email
> serves to bring the conversation back to this mailing list.
>
> Two distinct issues were discussed:
>
> (1) ccan modules shouldn't implicitly include a "config.h" for their config.
>
> Another way to say this is each ccan module should stand alone with no shared
> dependencies. Instead a top-level build/configurator system will generate the
> needed config.h files and glue. In the case of ccan this is done by
> specifying the -include compiler directive in the Makefiles.
I really hate magic includes; I'd rather see ccan_config.h than
config.h.  We could do:
        #ifdef CCAN_CONFIG_HEADER
        #include CCAN_CONFIG_HEADER
        #endif
Though it seems pretty ugly...
> (2) creating a pathway to make ccan modules embeddable
>
> Instead of an overhaul of the existing build system we can make incremental
> progress to allow flexible embedding of ccan into other projects. A few
> steps were discussed:
>
>  * Adapt the ccan makefile for easier embedding, so it will just attempt
>    to build those modules that are present
My current Makefile method is to build ccan like so:
CCAN_OBJS :=					\
	ccan-crypto-ripemd160.o			\
	ccan-crypto-sha256.o			\
	ccan-crypto-shachain.o			\
	ccan-err.o                              \
	ccan-opt.o                              \
	ccan-opt-helpers.o                      \
	ccan-opt-parse.o                        \
	ccan-opt-usage.o
ccan-crypto-shachain.o: $(CCANDIR)/ccan/crypto/shachain/shachain.c
	$(CC) $(CFLAGS) -c -o $@ $<
ccan-crypto-sha256.o: $(CCANDIR)/ccan/crypto/sha256/sha256.c
	$(CC) $(CFLAGS) -c -o $@ $<
ccan-crypto-ripemd160.o: $(CCANDIR)/ccan/crypto/ripemd160/ripemd160.c
	$(CC) $(CFLAGS) -c -o $@ $<
ccan-err.o: $(CCANDIR)/ccan/err/err.c
	$(CC) $(CFLAGS) -c -o $@ $<
ccan-opt.o: $(CCANDIR)/ccan/opt/opt.c
	$(CC) $(CFLAGS) -c -o $@ $<
ccan-opt-helpers.o: $(CCANDIR)/ccan/opt/helpers.c
	$(CC) $(CFLAGS) -c -o $@ $<
ccan-opt-parse.o: $(CCANDIR)/ccan/opt/parse.c
	$(CC) $(CFLAGS) -c -o $@ $<
ccan-opt-usage.o: $(CCANDIR)/ccan/opt/usage.c
	$(CC) $(CFLAGS) -c -o $@ $<
A tool which automated this would be useful.
>  * Implement (1) for ccan using -include directives
>  * Make a ccan tool to spit out all config variables used by a module
>    (and its dependencies?)
Yes, this would be a win.  
>  * Document the existing ccan config options
>  * [possible] generate files to help autoconf systems (such as aclocal defs)
Yep.
> I can potentially see create-ccan-tree used as a way to create a
> separate ccan tree with a skeleton build environment and specified modules
> and dependencies.
I currently (ab)use create-ccan-tree like so in my Makefile:
# Set CCAN_NEW if you want to add a new module.
update-ccan:
	mv ccan ccan.old
	DIR=$$(pwd)/ccan; cd ../ccan && ./tools/create-ccan-tree -a $$DIR `cd $$DIR.old/ccan && find * -name _info | sed s,/_info,, | sort` $(CCAN_NEW)
	mkdir -p ccan/tools/configurator
	cp ../ccan/tools/configurator/configurator.c ccan/tools/configurator/
	$(MAKE) ccan/config.h
	grep -v '^CCAN version:' ccan.old/README > ccan/README
	echo CCAN version: `git -C ../ccan describe` >> ccan/README
	$(RM) -r ccan.old
It's pretty horrible, so any improvements welcome!
Cheers,
Rusty.
    
    
More information about the ccan
mailing list