[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