[ccan] Integration with clib (#17)
Rusty Russell
rusty at rustcorp.com.au
Thu May 22 14:03:29 EST 2014
Stephen Mathieson <notifications at github.com> writes:
> I've been working on a similar concept, called [clib](https://github.com/clibs/clib). Thoughts on working together and possibly allowing ccan modules to be installed with clib(1)?
So, I really like the clib concept.
In many ways, CCAN modules are a subset of what clib allows (eg. we
insist on certain filenames), so clib-izing should be quite automatable.
Having a way to pull part of a git tree would help (a-la git subtree?).
Writing a ccantool --clib which spits out the package.json would be
pretty straightforward, with caveats: in particular, _info is a full C
program so it can detect dependencies based on preprocessor defs,
runtime tests, etc. Since most _info don't do this, we can ignore it
for the first cut at least.
Here's a horrible shell script which demonstrates the idea (is there a
JSON grammar for the package.json file somewhere?):
#! /bin/sh -e
# eg /home/rusty/devel/cvs/ccan/ccan/foo/bar => /home/rusty/devel/cvs/ccan
find_ccandir()
{
if [ x"$(basename "$1")" != xccan ]; then
if [ $1 = '/' ]; then
echo "Could not determine ccan directory" >&2
exit 1
fi
find_ccandir "$(dirname "$1")"
else
dirname "$1"
fi
}
# Simplistic...
json_escape()
{
# dash's echo respects escape sequences... Boo!
/bin/echo "$@" | sed -e 's/"/\\"/g' -e 's/\\/\\\\/g'
}
# Eg:
# {
# "name": "mon",
# "version": "1.1.1",
# "repo": "visionmedia/mon",
# "description": "Simple process monitoring",
# "keywords": ["process", "monitoring", "monitor", "availability"],
# "license": "MIT",
# "install": "make install"
#}
if [ $# = 1 ]; then
cd $1
elif [ $# != 0 ]; then
echo "Usage: $0 [moduledir]">&2
exit 1
fi
MODDIR="$(pwd)"
CCANDIR="${CCANDIR:-$(find_ccandir "$MODDIR")}"
# To get doc_extract
PATH="$CCANDIR/tools:$PATH"
export PATH
if [ ! -f _info ]; then
echo "$MODDIR does not have _info: not a ccan module?" >&2
exit 1
fi
# CCAN modules can be nested.
FULLNAME=$(json_escape "${MODDIR##*ccan/}")
NAME=$(json_escape "$(basename "$FULLNAME")")
VERSION=$(json_escape "$(doc_extract version _info)")
DESCRIPTION=$(json_escape "$(doc_extract summary _info)")
KEYWORDS=$(json_escape "$(doc_extract keywords _info)")
LICENSE=$(json_escape "$(doc_extract license _info)")
echo '{'
echo ' "name": "'"$NAME"'",'
echo ' "repo": "ccan/'"$FULLNAME"'",'
echo ' "description": "'"$DESCRIPTION"'",'
[ -z "$VERSION" ] || echo ' "version": "'"$VERSION"'",'
[ -z "$KEYWORDS" ] || echo ' "keywords": "'"$KEYWORDS"'",'
[ -z "$LICENSE" ] || echo ' "license": "'"$LICENSE"'",'
echo '}'
More information about the ccan
mailing list