aboutsummaryrefslogtreecommitdiff
path: root/buildtools/build-freebsd-ca-port.py
diff options
context:
space:
mode:
Diffstat (limited to 'buildtools/build-freebsd-ca-port.py')
-rw-r--r--buildtools/build-freebsd-ca-port.py185
1 files changed, 185 insertions, 0 deletions
diff --git a/buildtools/build-freebsd-ca-port.py b/buildtools/build-freebsd-ca-port.py
new file mode 100644
index 00000000..033bcc9b
--- /dev/null
+++ b/buildtools/build-freebsd-ca-port.py
@@ -0,0 +1,185 @@
+"""
+Construct a FreeBSD port template given the URL of a source tarball.
+
+$Id$
+
+Copyright (C) 2012 Internet Systems Consortium ("ISC")
+
+Permission to use, copy, modify, and distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+"""
+
+import sys
+import os
+import subprocess
+import urlparse
+import errno
+import glob
+
+try:
+ url = sys.argv[1]
+except IndexError:
+ sys.exit("Usage: %s URL-of-source-tarball" % sys.argv[0])
+
+def stripext(fn, *exts):
+ fn1, fn2 = os.path.splitext(fn)
+ return fn1 if fn2 in exts else fn
+
+def mkdir_maybe(*args):
+ try:
+ print "Creating", args[0]
+ os.makedirs(*args)
+ except OSError, e:
+ if e.errno != errno.EEXIST:
+ raise
+
+name = os.path.basename(urlparse.urlparse(url).path)
+name = stripext(name, ".gz", ".bz2", ".xz")
+name = stripext(name, ".tar", ".tgz", ".tbz", ".txz")
+
+# Up until this point this is fairly generic, but we reach the point
+# of diminishing returns when we have to parse the port name and
+# version number out of the filename. This will need to be changed
+# when we start doing this with something other than snapshot
+# tarballs.
+
+try:
+ base, trunk, vers = name.split("-")
+except:
+ base, trunk, vers = None
+
+if trunk != "trunk" or not vers.isdigit():
+ sys.exit("Unexpected tarball URL name format")
+
+mkdir_maybe(base)
+
+fn = os.path.join(base, "Makefile")
+
+print "Writing", fn
+
+with open(fn, "w") as f:
+ f.write('''\
+PORTNAME= %(portname)s
+PORTVERSION= 0.%(snapshot)s
+CATEGORIES= net
+MASTER_SITES= %(master_sites)s
+DISTFILES= %(distfiles)s
+WRKSRC= ${WRKDIR}/%(tarname)s
+
+MAINTAINER= sra@hactrn.net
+COMMENT= rpki.net RPKI tools package
+
+GNU_CONFIGURE= yes
+USE_PYTHON= 2.7+
+USE_MYSQL= server
+USE_APACHE_RUN= 22+
+USE_GNOME= libxml2 libxslt
+
+# For OpenSSL, not needed otherwise
+USE_PERL5_BUILD=yes
+
+# Split between dependency targets is somewhat arbitrary here, much of what is
+# listed as BUILD_DEPENDS might be better as RUN_DEPENDS.
+
+BUILD_DEPENDS+= ${PYTHON_PKGNAMEPREFIX}lxml>0:${PORTSDIR}/devel/py-lxml \\
+ ${PYTHON_PKGNAMEPREFIX}MySQLdb>0:${PORTSDIR}/databases/py-MySQLdb \\
+ ${PYTHON_PKGNAMEPREFIX}django>=1.3:${PORTSDIR}/www/py-django \\
+ ${PYTHON_PKGNAMEPREFIX}vobject>0:${PORTSDIR}/deskutils/py-vobject \\
+ ${PYTHON_PKGNAMEPREFIX}yaml>0:${PORTSDIR}/devel/py-yaml \\
+ ${PYTHON_PKGNAMEPREFIX}south>=0.7.6:${PORTSDIR}/databases/py-south \\
+ makedepend>0:${PORTSDIR}/devel/makedepend
+
+RUN_DEPENDS+= rrdtool>0:${PORTSDIR}/databases/rrdtool \\
+ ${APACHE_PKGNAMEPREFIX}mod_wsgi>3:${PORTSDIR}/www/mod_wsgi3
+
+.include <bsd.port.mk>
+''' % { "portname" : base,
+ "snapshot" : vers,
+ "tarname" : name,
+ "master_sites" : os.path.dirname(url) + "/",
+ "distfiles" : os.path.basename(url) })
+
+fn = os.path.join(base, "pkg-descr")
+
+print "Writing", fn
+
+with open(fn, "w") as f:
+ f.write('''\
+This is a port of the rpki.net RPKI toolkit.
+
+WWW: http://rpki.net/
+''')
+
+print "Generating checksum"
+
+subprocess.check_call(("make", "makesum", "DISTDIR=" + os.getcwd()), cwd = base)
+
+fn = os.path.join(base, "pkg-plist")
+print "Creating empty", fn
+open(fn, "w").close()
+
+print "Running make configure"
+
+# The "USE_GNOME=" setting is to silence a mess of grep errors we'd get otherwise.
+# Not sure what this is about, seems to trigger on empty pkg-plist, so just disable
+# this while generating pkg-plist so we can leave proper USE_GNOME setting in Makefile.
+
+subprocess.check_call(("make", "configure", "DISTDIR=" + os.getcwd(),
+ "USE_GNOME=", "NO_DEPENDS=yes"),
+ cwd = base)
+
+print "Running make installation-manifest"
+
+subprocess.check_call(("make", "installation-manifest"),
+ cwd = os.path.join(base, "work", name))
+
+files = []
+dirs = []
+
+dirmap = {
+ "%%BINDIR%%" : "bin",
+ "%%DATAROOTDIR%%" : "share",
+ "%%PYTHON_SITELIBDIR%%" : "%%PYTHON_SITELIBDIR%%",
+ "%%RCDIR%%" : "etc/rc.d",
+ "%%RCYNICJAILDIR%%" : "/var/rcynic",
+ "%%SBINDIR%%" : "sbin",
+ "%%SYSCONFDIR%%" : "etc" }
+
+fn = os.path.join(base, "work", name, "installation-manifest")
+
+print "Parsing", fn
+
+with open(fn, "r") as f:
+ for line in f:
+ kind, fn = line.rstrip("/").split()
+ dir, sep, tail = fn.partition("/")
+ if dir in dirmap:
+ fn = dirmap[dir] + sep + tail
+ else:
+ print "Warning: No mapping for %r in %r, blundering onwards" % (dir, fn)
+ if kind == "F":
+ files.append(fn)
+ elif kind == "D":
+ dirs.append(fn)
+ else:
+ sys.exit("Don't know what to do with %r" % line)
+
+files.sort()
+dirs.sort(reverse = True)
+
+fn = os.path.join(base, "pkg-plist")
+print "Writing", fn
+with open(fn, "w") as f:
+ for fn in files:
+ f.write("%s\n" % fn)
+ for fn in dirs:
+ f.write("@dirrm %s\n" % fn)