packagekit/wscript
2008-01-27 13:58:18 +00:00

274 lines
8.2 KiB
Python

#! /usr/bin/env python
# encoding: utf-8
#
# Copyright (C) 2007 Richard Hughes <richard@hughsie.com>
#
# Licensed under the GNU General Public License Version 2
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
import os
import Params
import Object
import misc
import shutil
import subprocess
# the following two variables are used by the target "waf dist"
VERSION='0.1.4'
APPNAME='PackageKit'
# these variables are mandatory ('/' are converted automatically)
srcdir = '.'
blddir = '_build_'
def dist_hook():
shutil.rmtree("wafadmin", True)
#TODO: why doesn't this delete?
shutil.rmtree("waf-lightc", True)
def set_options(opt):
opt.add_option('--wall', action="store_true", help="stop on compile warnings", dest="wall", default=True)
opt.add_option('--packagekit-user', type='string', help="User for running the PackageKit daemon", dest="user", default='root')
opt.add_option('--enable-tests', action="store_true", help="enable unit test code", dest="tests", default=True)
opt.add_option('--enable-gcov', action="store_true", help="compile with gcov support (gcc only)", dest="gcov", default=False)
opt.add_option('--enable-gprof', action="store_true", help="compile with gprof support (gcc only)", dest="gprof", default=False)
opt.tool_options("gcc")
opt.sub_options('backends')
def configure(conf):
conf.check_tool('gcc gnome intltool misc')
conf.check_pkg('glib-2.0', destvar='GLIB', vnum='2.14.0')
conf.check_pkg('gobject-2.0', destvar='GOBJECT', vnum='2.14.0')
conf.check_pkg('gmodule-2.0', destvar='GMODULE', vnum='2.14.0')
conf.check_pkg('gthread-2.0', destvar='GTHREAD', vnum='2.14.0')
conf.check_pkg('dbus-1', destvar='DBUS', vnum='1.1.1')
conf.check_pkg('dbus-glib-1', destvar='DBUS_GLIB', vnum='0.60')
conf.check_pkg('sqlite3', destvar='SQLITE')
#we need both of these for the server
ret = conf.check_pkg('polkit-dbus', destvar='POLKIT_DBUS', vnum='0.5')
if ret:
ret = conf.check_pkg('polkit-grant', destvar='POLKIT_GRANT', vnum='0.5')
if ret:
#we only need the validation tool if we are doing the tests
if Params.g_options.tests:
ret = conf.find_program('polkit-config-file-validate', var='POLKIT_POLICY_FILE_VALIDATE')
if ret:
conf.env['SECURITY_TYPE_POLKIT'] = True
else:
print "*******************************************************************"
print "** YOU ARE NOT USING A SECURE DAEMON. ALL USERS CAN DO ANYTHING! **"
print "*******************************************************************"
conf.env['SECURITY_TYPE_DUMMY'] = True
#optional deps
if conf.check_pkg('libnm_glib', destvar='NM_GLIB', vnum='0.6.4'):
conf.env['HAVE_NETWORKMANAGER'] = True
if conf.find_program('docbook2man', var='DOCBOOK2MAN'):
conf.env['HAVE_DOCBOOK2MAN'] = True
if conf.find_program('xmlto', var='XMLTO'):
conf.env['DOCBOOK_DOCS_ENABLED'] = True
# Check what backend to use
conf.sub_config('backends')
#do we build the self tests?
if Params.g_options.tests:
conf.define('PK_BUILD_TESTS', 1)
conf.env['HAVE_TESTS'] = True
conf.define('VERSION', VERSION)
conf.define('GETTEXT_PACKAGE', 'PackageKit')
conf.define('PACKAGE', 'PackageKit')
assert conf.env['SYSCONFDIR'], "You have too old WAF; please update to trunk"
conf.define('PK_DB_DIR', os.path.join(conf.env['DATADIR'], 'lib', 'PackageKit'))
conf.define('PK_PLUGIN_DIR', os.path.join(conf.env['LIBDIR'], 'packagekit-backend'))
conf.env['CCDEFINES'] += ['HAVE_CONFIG_H']
conf.write_config_header('config.h')
# We want these last as they might confligt with configuration checks.
if Params.g_options.wall:
conf.env.append_value('CPPFLAGS', '-Wall -Werror -Wcast-align -Wno-uninitialized')
if Params.g_options.gcov:
conf.env['HAVE_GCOV'] = True
conf.env.append_value('CCFLAGS', '-fprofile-arcs')
conf.env.append_value('CCFLAGS', '-ftest-coverage')
conf.env.append_value('CXXFLAGS', '-fprofile-arcs')
conf.env.append_value('CXXFLAGS', '-ftest-coverage')
conf.env.append_value('LINKFLAGS', '-fprofile-arcs')
if Params.g_options.gprof:
conf.env.append_value('CFLAGS', '-fprofile-arcs -ftest-coverage')
def build(bld):
# process subfolders from here
# Pending dirs:
# man python
bld.add_subdirs('libpackagekit backends client libgbus libselftest etc policy po data src docs contrib')
def shutdown():
env = Params.g_build.env()
if env['HAVE_GCOV']:
gcov_report()
def gcov_report():
env = Params.g_build.env()
variant = env.variant()
rootdir = os.getcwd()
os.chdir(blddir)
for test in ['test-libpackagekit', 'test-packagekitd']:
cleanup = []
sources = []
obj = Object.name_to_obj(test)
testdir = obj.path.bldpath(env)
if not os.path.isdir(testdir):
continue
file = os.path.join(testdir, obj.name)
if not os.path.isfile(file):
continue
# Waf currently doesn't name libraries until install. :(
#
# This should properly link all local libraries in use
# to the directory of the test.
for uselib in obj.to_list(obj.uselib_local):
lib = Object.name_to_obj(uselib)
lib_path = lib.path.bldpath(env)
lib_name = lib.name + '.so'
vnum_lst = lib.vnum.split('.')
for x in range(len(vnum_lst) + 1):
suffix = '.'.join(vnum_lst[:x])
if suffix:
suffix = '.' + suffix
tgt_name = lib_name + suffix
tgt_path = os.path.join(rootdir, blddir, testdir, tgt_name)
src_path = os.path.join(rootdir, blddir, lib_path, lib_name)
if not os.path.exists(tgt_path):
os.symlink(src_path, tgt_path)
cleanup.append(tgt_path)
# Gather sources from objects
sources += obj.to_list(obj.source)
for x in obj.to_list(obj.add_objects):
o = Object.name_to_obj(x)
sources += o.to_list(o.source)
d = obj.path.bldpath(env)
command = 'LD_LIBRARY_PATH=%s %s/%s' % (testdir, testdir, test)
proc = subprocess.Popen(command, shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
if proc.wait():
print 'Unable to run %s/%s!' % (testdir, test)
print proc.stderr.read()
continue
print proc.stdout.read()
# Ignore these
ignore = """
pk-main.c
pk-marshal.c
pk-security-dummy.c
pk-backend-python.c
""".split()
sources = [x for x in sources if x not in ignore]
total_loc = 0
total_covered = 0
total_stmts = 0
print '================================================================================'
print ' Test coverage for module packagekit:'
print '================================================================================'
srcdir = obj.path.srcpath(env)
for src in sources:
srcpath = os.path.join(srcdir, src)
command = 'gcov -o %s %s' % (testdir, srcpath)
proc = subprocess.Popen(command, shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
if proc.wait():
print 'gcov failed when processing %s' % srcpath
raise SystemExit(1)
covpath = src + '.gcov'
if not os.path.exists(covpath):
continue
cleanup.append(covpath)
basename, _ = os.path.splitext(src)
gcdaname = os.path.join(testdir, basename + '.gcda')
if os.path.exists(gcdaname):
cleanup.append(gcdaname)
not_covered = 0
covered = 0
loc = 0
f = open(covpath, 'rb')
for line in f.readlines():
if line.startswith(' #####:'):
not_covered += 1
elif not line.startswith(' -:'):
covered += 1
loc += 1
f.close()
if (covered + not_covered) > 0:
percent = 100.0 * covered / (covered + not_covered)
else:
percent = 0
print '%30s: %7.2f%% (%d of %d)' % (src, percent, covered, not_covered+covered)
total_loc += loc
total_covered += covered
total_stmts += covered + not_covered
if (total_stmts) > 0:
percent = 100.0 * total_covered / (total_stmts)
else:
percent = 0
print '================================================================================'
print ' Source lines : %d' % total_loc
print ' Actual statements : %d' % total_stmts
print ' Executed statements : %d' % total_covered
print ' Test coverage : %3.2f%%' % percent
print '================================================================================'
for item in cleanup:
os.unlink(item)
os.chdir(rootdir)