Skip to content
Snippets Groups Projects
Commit ed2c8226 authored by Arseny Kapoulkine's avatar Arseny Kapoulkine
Browse files

Merge branch 'master' into compact

parents 054b0b44 1c4098a7
No related branches found
No related tags found
No related merge requests found
# Latest jamplus is needed to use this
# Targets:
# pugixml - build pugixml library
# tests - build pugixml test suite
# run_tests - run pugixml test suite
# coverage - get test suite coverage
# Options:
# toolset=name - select toolset
# supported toolsets: mingw*, msvc*
# default toolset/configuration
if ( ! $(toolset) )
{
if ( $(OS) = SOLARIS )
{
toolset = suncc ;
}
else if ( $(UNIX) )
{
local GCCVERSION = [ Subst [ Shell "gcc -dumpversion" ] : $(NEWLINE) ] ;
toolset = "gcc"$(GCCVERSION) ;
}
else
{
toolset = msvc ;
}
}
if ( ! $(configuration) )
{
configuration = "debug" ;
}
if ( ! $(defines) )
{
defines = "PUGIXML_STANDARD" ;
}
# coverage options
if ( $(toolset:I=^mingw) || $(toolset:I=^gcc) )
{
CCFLAGS = -fprofile-arcs -ftest-coverage ;
LDFLAGS = -fprofile-arcs ;
if $(fullcoverage)
{
GCOVFLAGS = --branch-probabilities --function-summaries ;
}
else
{
GCOVFLAGS = --no-output ;
}
}
# build folder
BUILD = build ;
# enable dependency cache
DEPCACHE.standard = $(BUILD)/.depcache ;
# rules
include "Jamrules.jam" ;
# split define sets into list
local DEFINESETS = [ Split $(defines) : ':' ] ;
# split configurations into list
local CONFIGURATIONS = [ Split $(configuration) : ',' ] ;
for CONFIG in $(CONFIGURATIONS)
{
for DEFINESET in $(DEFINESETS)
{
local DEFINES = [ Split $(DEFINESET) : ',' ] ;
# build folder
local CFGBUILD = $(BUILD)/$(toolset)/$(DEFINES:J=_)/$(CONFIG) ;
# compilation options
local CFGFLAGS = $(CCFLAGS) [ GetCFlags $(CONFIG) : $(DEFINES) ] ;
# build library
local PUGIXML = $(CFGBUILD)/pugixml.lib ;
Library $(PUGIXML) : src/pugixml.cpp : $(CFGFLAGS) ;
Alias pugixml : $(PUGIXML) ;
# build tests
local TESTS = $(CFGBUILD)/tests.exe ;
local TEST_SOURCES = [ Glob tests : *.cpp ] ;
TEST_SOURCES -= [ Glob tests : fuzz_*.cpp ] ;
Application $(TESTS) : $(TEST_SOURCES) : $(CFGFLAGS) : $(PUGIXML) ;
Alias tests : $(TESTS) ;
# run tests
Test $(TESTS)_run : $(TESTS) ;
Alias run_tests : $(TESTS)_run ;
# gather coverage
Coverage $(TESTS)_coverage : $(PUGIXML) ;
Alias coverage : $(TESTS)_coverage ;
GCOVFLAGS on $(TESTS)_coverage = $(GCOVFLAGS) -o $(CFGBUILD)/src ; # because stupid gcov can't find files via relative paths
# add special autotest markers to build log
if $(autotest)
{
COVPREFIX on $(TESTS)_coverage = "... autotest $(CONFIG) [$(DEFINESET)]" ;
}
# gather coverage after tests run
Depends $(TESTS)_coverage : $(TESTS)_run ;
}
}
# documentation
Documentation docs/manual.html : docs/manual.qbk : docs/manual.xsl ;
Documentation docs/quickstart.html : docs/quickstart.qbk : docs/quickstart.xsl ;
Alias docs : docs/manual.html docs/quickstart.html ;
# samples
for SAMPLE in [ Glob docs/samples : *.cpp ]
{
local CONFIG = "debug" ;
local DEFINES = "PUGIXML_STANDARD" ;
# build folder
local CFGBUILD = $(BUILD)/$(toolset)/$(DEFINES:J=_)/$(CONFIG) ;
# compilation options
local CFGFLAGS = $(CCFLAGS) [ GetCFlags $(CONFIG) : $(DEFINES) ] ;
CFGFLAGS += -I src ;
# build and run sample
local EXECUTABLE = $(CFGBUILD)/samples/$(SAMPLE:B).exe ;
local PUGIXML = $(CFGBUILD)/pugixml.lib ;
Application $(EXECUTABLE) : $(SAMPLE) : $(CFGFLAGS) : $(PUGIXML) ;
RunSampleAction $(EXECUTABLE)_run : $(EXECUTABLE) ;
Depends $(EXECUTABLE)_run : $(EXECUTABLE) ;
Depends samples : $(EXECUTABLE)_run ;
}
# release
VERSION = 1.6 ;
RELEASE_FILES =
[ Glob contrib : *.cpp *.hpp ]
[ Glob src : *.cpp *.hpp ]
[ Glob docs : *.html *.css ]
[ Glob docs/samples : *.cpp *.hpp *.xml ]
[ Glob docs/images : *.png ]
[ Glob docs/manual : *.html ]
@("scripts/**":W=:X=svn)
readme.txt
;
actions ArchiveAction
{
perl tests/archive.pl $(<) $(>)
}
ArchiveAction pugixml-$(VERSION).zip : $(RELEASE_FILES) ;
ArchiveAction pugixml-$(VERSION).tar.gz : $(RELEASE_FILES) ;
Depends release : pugixml-$(VERSION).zip pugixml-$(VERSION).tar.gz : $(RELEASE_FILES) ;
NotFile release ;
This diff is collapsed.
version: "{build}"
build_script:
- ps: .\tests\autotest-appveyor.ps1
\ No newline at end of file
......@@ -3,6 +3,7 @@ project(pugixml)
cmake_minimum_required(VERSION 2.6)
option(BUILD_SHARED_LIBS "Build shared instead of static library" OFF)
option(BUILD_TESTS "Build tests" OFF)
set(BUILD_DEFINES "" CACHE STRING "Build defines")
# Pre-defines standard install locations on *nix systems.
......@@ -13,13 +14,15 @@ set(HEADERS ../src/pugixml.hpp ../src/pugiconfig.hpp)
set(SOURCES ${HEADERS} ../src/pugixml.cpp)
if(DEFINED BUILD_DEFINES)
add_definitions(${BUILD_DEFINES})
foreach(DEFINE ${BUILD_DEFINES})
add_definitions("-D" ${DEFINE})
endforeach()
endif()
if(BUILD_SHARED_LIBS)
add_library(pugixml SHARED ${SOURCES})
add_library(pugixml SHARED ${SOURCES})
else()
add_library(pugixml STATIC ${SOURCES})
add_library(pugixml STATIC ${SOURCES})
endif()
set_target_properties(pugixml PROPERTIES VERSION 1.6 SOVERSION 1)
......@@ -32,3 +35,13 @@ install(TARGETS pugixml EXPORT pugixml-config
install(FILES ${HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(EXPORT pugixml-config DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/pugixml)
if(BUILD_TESTS)
file(GLOB TEST_SOURCES ../tests/*.cpp)
file(GLOB FUZZ_SOURCES ../tests/fuzz_*.cpp)
list(REMOVE_ITEM TEST_SOURCES ${FUZZ_SOURCES})
add_executable(check ${TEST_SOURCES})
target_link_libraries(check pugixml)
add_custom_command(TARGET check POST_BUILD COMMAND check WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/..)
endif()
\ No newline at end of file
function Invoke-CmdScript($scriptName)
{
$cmdLine = """$scriptName"" $args & set"
& $Env:SystemRoot\system32\cmd.exe /c $cmdLine |
select-string '^([^=]*)=(.*)$' | foreach-object {
$varName = $_.Matches[0].Groups[1].Value
$varValue = $_.Matches[0].Groups[2].Value
set-item Env:$varName $varValue
}
}
$sources = @("src/pugixml.cpp") + (Get-ChildItem -Path "tests/*.cpp" -Exclude "fuzz_*.cpp")
$failed = $FALSE
foreach ($vs in 9,10,11,12)
{
foreach ($arch in "x86","x64")
{
Write-Output "# Setting up VS$vs $arch"
Invoke-CmdScript "C:\Program Files (x86)\Microsoft Visual Studio $vs.0\VC\vcvarsall.bat" $arch
if (! $?) { throw "Error setting up VS$vs $arch" }
foreach ($defines in "standard", "PUGIXML_WCHAR_MODE")
{
$target = "tests_vs${vs}_${arch}_${defines}"
$deflist = if ($defines -eq "standard") { "" } else { "/D$defines" }
Add-AppveyorTest $target -Outcome Running
Write-Output "# Building $target.exe"
& cmd /c "cl.exe /Fe$target.exe /EHsc /W4 /WX $deflist $sources 2>&1" | Tee-Object -Variable buildOutput
if ($?)
{
Write-Output "# Running $target.exe"
$sw = [Diagnostics.Stopwatch]::StartNew()
& .\$target | Tee-Object -Variable testOutput
if ($?)
{
Write-Output "# Passed"
Update-AppveyorTest $target -Outcome Passed -StdOut ($testOutput | out-string) -Duration $sw.ElapsedMilliseconds
}
else
{
Write-Output "# Failed"
Update-AppveyorTest $target -Outcome Failed -StdOut ($testOutput | out-string) -ErrorMessage "Running failed"
$failed = $TRUE
}
}
else
{
Write-Output "# Failed to build"
Update-AppveyorTest $target -Outcome Failed -StdOut ($buildOutput | out-string) -ErrorMessage "Compilation failed"
$failed = $TRUE
}
}
}
}
if ($failed) { throw "One or more build steps failed" }
Write-Output "# End"
#!/bin/sh
# put this to /etc/rc.d/pugixml-autotest
# don't forget to chmod +x pugixml-autotest and to replace /home/USERNAME with actual path
if [ "$1" = "start" -o "$1" = "faststart" ]
then
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin
cd /home/USERNAME/pugixml
perl tests/autotest-remote-host.pl "shutdown -p now" &
fi
#!/bin/sh
# chkconfig: 2345 20 80
# description: pugixml autotest script
# put this to /etc/init.d/pugixml-autotest.sh, then launch
# Debian/Ubuntu: sudo update-rc.d pugixml-autotest.sh defaults 80
# Fedora/RedHat: sudo chkconfig --add pugixml-autotest.sh
# don't forget to chmod +x pugixml-autotest.sh and to replace /home/USERNAME with actual path
if [ "$1" = "start" ]
then
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin
cd /home/USERNAME/pugixml
perl tests/autotest-remote-host.pl "shutdown -P now" &
fi
#!/usr/bin/perl
use Config;
sub permute
{
my @defines = @_;
my @result = ('');
foreach $define (@defines)
{
push @result, map { length($_) == 0 ? $define : "$_,$define" } @result;
}
@result;
}
sub gcctoolset
{
my $gccversion = `gcc -dumpversion`;
chomp($gccversion);
my $gcc = "gcc$gccversion";
return ($^O =~ /darwin/) ? ($gcc, "${gcc}_x64", "${gcc}_ppc") : (`uname -m` =~ /64/) ? ("${gcc}_x64") : ($gcc);
}
sub getcpucount
{
return $1 if ($^O =~ /linux/ && `cat /proc/cpuinfo` =~ /cpu cores\s*:\s*(\d+)/);
return $1 if ($^O =~ /freebsd|darwin/ && `sysctl -a` =~ /hw\.ncpu\s*:\s*(\d+)/);
return $1 - 1 if ($^O =~ /solaris/ && `mpstat | wc -l` =~ /(\d+)/);
undef;
}
@alltoolsets = ($^O =~ /MSWin/)
? (bcc, cw, dmc,
ic8, ic9, ic9_x64, ic10, ic10_x64, ic11, ic11_x64,
mingw34, mingw44, mingw45, mingw45_0x, mingw46_x64,
msvc6, msvc7, msvc71, msvc8, msvc8_x64, msvc9, msvc9_x64,
msvc10, msvc10_x64, msvc10_clr, msvc10_clr_x64,
msvc11, msvc11_x64, msvc11_clr, msvc11_clr_x64, msvc11_arm,
msvc12, msvc12_x64, msvc12_clr, msvc12_clr_x64, msvc12_arm,
xbox360, ps3_gcc, ps3_snc, msvc8_wince, bada, blackberry, android, android_stlport)
: ($^O =~ /solaris/)
? (suncc, suncc_x64)
: &gcctoolset();
$fast = scalar grep(/^fast$/, @ARGV);
@toolsets = map { /^fast$/ ? () : ($_) } @ARGV;
@toolsets = @toolsets ? @toolsets : @alltoolsets;
@configurations = (debug, release);
@defines = (PUGIXML_NO_XPATH, PUGIXML_NO_EXCEPTIONS, PUGIXML_NO_STL, PUGIXML_WCHAR_MODE);
$stddefine = 'PUGIXML_STANDARD';
if ($fast)
{
@defines = (PUGIXML_WCHAR_MODE);
@configurations = (debug);
}
@definesets = permute(@defines);
print "### autotest begin " . scalar localtime() . "\n";
# print Git revision info
print "### autotest revision $1\n" if (`git rev-parse HEAD` =~ /(.+)/);
# get CPU info
$cpucount = &getcpucount();
# build all configurations
%results = ();
foreach $toolset (@toolsets)
{
my $cmdline = "jam";
# parallel build on non-windows platforms (since jam can't detect processor count)
$cmdline .= " -j$cpucount" if (defined $cpucount);
# add toolset
$cmdline .= " toolset=$toolset";
# add configurations
$cmdline .= " configuration=" . join(',', @configurations);
# add definesets
$cmdline .= " defines=$stddefine";
foreach $defineset (@definesets)
{
# STLport lacks bad_alloc on Android so skip configurations without PUGIXML_NO_EXCEPTIONS
next if ($toolset eq 'android_stlport' && $defineset !~ /PUGIXML_NO_EXCEPTIONS/);
$cmdline .= ":$defineset" if ($defineset ne '');
# any configuration with prepare but without result is treated as failed
foreach $configuration (@configurations)
{
print "### autotest $Config{archname} $toolset $configuration [$defineset] prepare\n";
}
}
print STDERR "*** testing $toolset... ***\n";
# launch command
print "### autotest launch $cmdline\n";
open PIPE, "$cmdline autotest=on coverage |" || die "$cmdline failed: $!\n";
# parse build output
while (<PIPE>)
{
# ... autotest release [wchar] success
if (/^\.\.\. autotest (\S+) \[(.*?)\] (success|skiprun)/)
{
my $configuration = $1;
my $defineset = ($2 eq $stddefine) ? '' : $2;
my $result = $3;
print "### autotest $Config{archname} $toolset $configuration [$defineset] $result\n";
}
# ... autotest release [wchar] gcov
elsif (/^\.\.\. autotest (\S+) \[(.*?)\] gcov/)
{
my $configuration = $1;
my $defineset = ($2 eq $stddefine) ? '' : $2;
if (/pugixml\.cpp' executed:([^%]+)%/)
{
print "### autotest $Config{archname} $toolset $configuration [$defineset] coverage $1\n";
}
else
{
print;
}
}
else
{
print;
}
}
close PIPE;
}
print "### autotest end " . scalar localtime() . "\n";
#!/bin/sh
# put this to /Library/StartupItems/pugixml-autotest/pugixml-autotest, then create
# file StartupParameters.plist in the same folder with the following contents:
# <plist><dict><key>Provides</key><array><string>pugixml-autotest</string></array></dict></plist>
# don't forget to chmod +x pugixml-autotest and to replace /Users/USERNAME with actual path
if [ "$1" = "start" ]
then
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin
cd /Users/USERNAME/pugixml
perl tests/autotest-remote-host.pl "shutdown -h now" &
fi
#!/usr/bin/perl
sub execprint
{
my $cmd = shift;
open PIPE, "$cmd |" || die "$cmd failed: $!\n";
print while (<PIPE>);
close PIPE;
return $?;
}
use IO::Socket;
use Net::Ping;
$exitcmd = shift;
$host = "10.0.2.2";
# wait while network is up
$ping = Net::Ping->new("icmp");
while (!$ping->ping($host))
{
print "### autotest $host is down, retrying...\n";
}
print "### autotest $host is up, connecting...\n";
my $client = new IO::Socket::INET(PeerAddr => "$host:7183");
exit unless $client;
select $client;
&execprint('git pull') == 0 || die "error updating from repo\n";
&execprint('perl tests/autotest-local.pl') == 0 || die "error launching tests\n";
system($exitcmd);
#!/usr/bin/perl
use IO::Socket;
$vm = shift;
$log = shift;
# start virtualbox gui in minimized mode - this should be the first thing we do since this process
# inherits all handles and we want our sockets/log file closed
system("start /min virtualbox --startvm $vm");
# start a server; vm will connect to the server via autotest-remote-host.pl
my $server = new IO::Socket::INET(LocalPort => 7183, Listen => 1);
die "Could not create socket: $!\n" unless $server;
open LOG, ">> $log" || die "Could not open log file: $!\n";
print LOG "Listening for connection...\n";
my $client = $server->accept();
# echo all input to log file
print LOG $_ while (<$client>);
close LOG;
$client->close();
$server->close();
# wait for vm shutdown to decrease peak memory consumption
while (`vboxmanage showvminfo $vm` !~ /State:\s+powered off/)
{
sleep(1);
}
#!/usr/bin/perl
# pretty-printing
sub prettysuffix
{
my $suffix = shift;
return " C++0x" if ($suffix eq '_0x');
return " x64" if ($suffix eq '_x64');
return " CLR" if ($suffix eq '_clr');
return " CLR x64" if ($suffix eq '_clr_x64');
return " PPC" if ($suffix eq '_ppc');
return " WinCE" if ($suffix eq '_wince');
return " ARM" if ($suffix eq '_arm');
return "";
}
sub prettytoolset
{
my $toolset = shift;
return "Borland C++ 5.82" if ($toolset eq 'bcc');
return "Metrowerks CodeWarrior 8" if ($toolset eq 'cw');
return "Digital Mars C++ 8.51" if ($toolset eq 'dmc');
return "Sun C++ 5.10" . prettysuffix($1) if ($toolset =~ /^suncc(.*)$/);
return "Intel C++ Compiler $1.0" . prettysuffix($2) if ($toolset =~ /^ic(\d+)(.*)$/);
return "MinGW (GCC $1.$2)" . prettysuffix($3) if ($toolset =~ /^mingw(\d)(\d)(.*)$/);
return "Microsoft Visual C++ 7.1" if ($toolset eq 'msvc71');
return "Microsoft Visual C++ $1.0" . prettysuffix($2) if ($toolset =~ /^msvc(\d+)(.*)$/);
return "GNU C++ Compiler $1" . prettysuffix($2) if ($toolset =~ /^gcc([\d.]*)(.*)$/);
return "Microsoft Xbox360 Compiler" if ($toolset =~ /^xbox360/);
return "Sony PlayStation3 GCC" if ($toolset =~ /^ps3_gcc/);
return "Sony PlayStation3 SNC" if ($toolset =~ /^ps3_snc/);
return "Android NDK (GCC)" . ($1 eq '_stlport' ? " STLport" : "") if ($toolset =~ /^android(.*)$/);
return "bada SDK (GCC)" if ($toolset =~ /^bada$/);
return "BlackBerry NDK (GCC)" if ($toolset =~ /^blackberry$/);
$toolset;
}
sub prettyplatform
{
my ($platform, $toolset) = @_;
return "solaris" if ($platform =~ /solaris/);
return "macos" if ($platform =~ /darwin/);
return "linux64" if ($platform =~ /64-linux/);
return "linux32" if ($platform =~ /86-linux/);
return "fbsd64" if ($platform =~ /64-freebsd/);
return "fbsd32" if ($platform =~ /86-freebsd/);
return "x360" if ($toolset =~ /^xbox360/);
return "ps3" if ($toolset =~ /^ps3/);
return "arm" if ($toolset =~ /_arm$/);
return "arm" if ($toolset =~ /_wince$/);
return "arm" if ($toolset =~ /^android/);
return "arm" if ($toolset =~ /^bada/);
return "arm" if ($toolset =~ /^blackberry/);
return "win64" if ($platform =~ /MSWin32-x64/);
return "win32" if ($platform =~ /MSWin32/);
$platform;
}
sub prettybox
{
my $enabled = shift;
my $color = $enabled ? "#cccccc" : "#ffffff";
"<td bgcolor='$color' align='center'>" . ($enabled ? "+" : "&nbsp;") . "</td>";
}
# parse build log
%results = ();
%toolsets = ();
%defines = ();
%configurations = ();
sub insertindex
{
my ($hash, $key) = @_;
$$hash{$key} = scalar(keys %$hash) unless defined $$hash{$key};
}
while (<>)
{
### autotest i386-freebsd-64int gcc release [wchar] result 0 97.78 98.85
if (/^### autotest (\S+) (\S+) (\S+) \[(.*?)\] (.*)/)
{
my ($platform, $toolset, $configuration, $defineset, $info) = ($1, $2, $3, $4, $5);
my $fulltool = &prettyplatform($platform, $toolset) . ' ' . &prettytoolset($toolset);
my $fullconf = "$configuration $defineset";
if ($info =~ /^prepare/)
{
$results{$fulltool}{$fullconf}{result} = "";
}
elsif ($info =~ /^success/)
{
$results{$fulltool}{$fullconf}{result} = "success";
}
elsif ($info =~ /^skiprun/)
{
$results{$fulltool}{$fullconf}{result} = "skiprun";
}
elsif ($info =~ /^coverage (\S+)/)
{
$results{$fulltool}{$fullconf}{coverage} = $1;
}
else
{
print STDERR "Unrecognized autotest infoline $_";
}
&insertindex(\%toolsets, $fulltool);
$defines{$_} = 1 foreach (split /,/, $defineset);
&insertindex(\%configurations, $fullconf);
}
elsif (/^### autotest revision (.+)/)
{
if (defined $revision && $revision != $1)
{
print STDERR "Autotest build report contains several revisions: $revision, $1\n";
}
else
{
$revision = $1;
}
}
}
# make arrays of toolsets and configurations
@toolsetarray = ();
@configurationarray = ();
$toolsetarray[$toolsets{$_}] = $_ foreach (keys %toolsets);
$configurationarray[$configurations{$_}] = $_ foreach (keys %configurations);
# print header
$stylesheet = <<END;
table.autotest { border: 1px solid black; border-left: none; border-top: none; }
table.autotest td { border: 1px solid black; border-right: none; border-bottom: none; }
END
print <<END;
<html><head><title>pugixml autotest report</title><style type="text/css"><!-- $stylesheet --></style></head><body>
<h3>pugixml autotest report</h3>
<table border=1 cellspacing=0 cellpadding=4 class="autotest">
END
# print configuration header (release/debug)
print "<tr><td align='right' colspan=2>optimization</td>";
print &prettybox((split /\s+/)[0] eq 'release') foreach (@configurationarray);
print "</tr>\n";
# print defines header (one row for each define)
foreach $define (sort {$a cmp $b} keys %defines)
{
print "<tr><td align='right' colspan=2><small>$define</small></td>";
foreach (@configurationarray)
{
my $present = ($_ =~ /\b$define\b/);
print &prettybox($present);
}
print "</tr>\n";
}
# print data (one row for each toolset)
foreach $tool (@toolsetarray)
{
my ($platform, $toolset) = split(/\s+/, $tool, 2);
print "<tr><td style='border-right: none' align='center'><small>$platform</small></td><td style='border-left: none'><nobr>$toolset</nobr></td>";
foreach (@configurationarray)
{
my $info = $results{$tool}{$_};
if (!defined $$info{result})
{
print "<td bgcolor='#cccccc'>&nbsp;</td>";
}
elsif ($$info{result} eq "success")
{
my $coverage = $$info{coverage};
print "<td bgcolor='#00ff00' align='center'>pass";
if ($coverage > 0)
{
print "<br><font size='-2'>" . ($coverage + 0) . "%</font>";
}
print "</td>";
}
elsif ($$info{result} eq "skiprun")
{
print "<td bgcolor='#ffff80' align='center'>pass</td>"
}
else
{
print "<td bgcolor='#ff0000' align='center'>fail</td>"
}
}
print "</tr>\n";
}
# print footer
$date = localtime;
print <<END;
</table><br>
Generated on $date from Git $revision
</body></html>
END
#!/bin/sh
# put this to /etc/init.d/pugixml-autotest.sh, then launch
# ln -s /etc/init.d/pugixml-autotest.sh /etc/rc3.d/S80pugixml-autotest
# don't forget to chmod +x pugixml-autotest.sh and to replace /export/home/USERNAME with actual path
if [ "$1" = "start" ]
then
cd /export/home/USERNAME/pugixml
perl tests/autotest-remote-host.pl "shutdown -g 0 -i 5 -y" &
fi
#!/usr/bin/perl
sub funcinfo
{
my ($name, $info) = @_;
return if ($info =~ /No executable lines/);
my $lines = ($info =~ /Lines executed:([^%]+)%/) ? $1 : 100;
my $calls = ($info =~ /Calls executed:([^%]+)%/) ? $1 : 100;
my $branches = ($info =~ /Branches executed:([^%]+)%/) ? $1 : 100;
my $taken = ($info =~ /Taken at least once:([^%]+)%/) ? $1 : 100;
return if ($lines == 100 && $calls == 100 && $branches == 100 && $taken == 100);
return "Function $name: L $lines, C $calls, B $branches, BT $taken\n";
}
$prefix = join(' ', @ARGV);
$prefix .= ' ' if ($prefix ne '');
$lines = join('', <STDIN>);
# merge file information
$lines =~ s/File (.+)\nLines (.+)\n(.+\n)*\n/$1 $2\n/g;
# merge function information
$lines =~ s/Function (.+)\n((.+\n)*)\n/funcinfo($1, $2)/eg;
# remove include information
$lines =~ s/.+include\/c\+\+.+\n//g;
foreach $line (split /\n/, $lines)
{
print "$prefix$line\n";
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment