mirror of
https://github.com/zeux/pugixml.git
synced 2024-12-27 13:33:17 +08:00
Merge branch 'master' into compact
This commit is contained in:
commit
ed2c822643
169
Jamfile.jam
169
Jamfile.jam
@ -1,169 +0,0 @@
|
||||
# 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 ;
|
1032
Jamrules.jam
1032
Jamrules.jam
File diff suppressed because it is too large
Load Diff
4
appveyor.yml
Normal file
4
appveyor.yml
Normal file
@ -0,0 +1,4 @@
|
||||
version: "{build}"
|
||||
|
||||
build_script:
|
||||
- ps: .\tests\autotest-appveyor.ps1
|
@ -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()
|
71
tests/autotest-appveyor.ps1
Normal file
71
tests/autotest-appveyor.ps1
Normal file
@ -0,0 +1,71 @@
|
||||
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"
|
@ -1,10 +0,0 @@
|
||||
#!/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
|
@ -1,14 +0,0 @@
|
||||
#!/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
|
@ -1,150 +0,0 @@
|
||||
#!/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";
|
@ -1,12 +0,0 @@
|
||||
#!/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
|
@ -1,37 +0,0 @@
|
||||
#!/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);
|
@ -1,33 +0,0 @@
|
||||
#!/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);
|
||||
}
|
@ -1,229 +0,0 @@
|
||||
#!/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 ? "+" : " ") . "</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'> </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
|
@ -1,10 +0,0 @@
|
||||
#!/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
|
@ -1,36 +0,0 @@
|
||||
#!/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";
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user