2
0
mirror of https://github.com/boostorg/build.git synced 2026-02-14 12:42:11 +00:00
Files
build/test/builtin_glob_archive.py
Rene Rivera 8f96882110 Fix glob archive test to work with mingw.
Makes glob archive test not depend on result order. Also change to make
appveyor tests work with gcc testing.
2019-03-24 13:23:59 -05:00

215 lines
7.2 KiB
Python

#!/usr/bin/python
# Copyright 2014 Steven Watanabe
# Copyright 2015 Artur Shepilko
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
# This tests the GLOB_ARCHIVE rule.
import os
import sys
import StringIO
import BoostBuild
vms = ( os.name == 'posix' and sys.platform == 'OpenVMS')
t = BoostBuild.Tester()
## Setup test archive sources and symbols they contain.
sources = {
"a.cpp" : ["a"],
"b.cpp" : ["b"],
"b_match.cpp" : ["b_match"],
"c/nopath_check.cpp" : ["nopath_check"],
"CaseCheck.cpp" : ["CaseCheck"],
"seq_check1.cpp" : ["seq_check1"],
"seq_check2.cpp" : ["seq_check2"],
"seq_check3.cpp" : ["seq_check3"],
"symbols_check.c" : ["symbol", "symbol_match"],
"members_and_symbols_check.c" : ["member_and_symbol_match"],
"symbol_case_check.c" : ["SymbolCaseCheck"],
"main_check.cpp" : ["main"]
}
def create_sources(path, sources):
for s in sources :
f = os.path.join(path, s)
t.write(f, "")
output = StringIO.StringIO()
for sym in sources[s] :
output.write("int %s() { return 0; }\n" % sym)
t.write(f, output.getvalue())
def setup_archive(name, sources):
global archive
global obj_suffix
archive = t.adjust_names(name)[0]
obj_suffix = t.adjust_names(".obj")[0]
output = StringIO.StringIO()
t.write("jamroot.jam","")
output.write("""\
static-lib %s :
""" % name.split(".")[0])
## sort the sources, so we can test order of the globbed members
for s in sorted(sources) :
output.write("""\
%s
""" % s)
output.write("""\
;
""")
t.write("lib/jamfile.jam", output.getvalue())
create_sources("lib", sources)
t.run_build_system(subdir="lib")
built_archive = "lib/bin/$toolset/debug*/%s" % name
t.expect_addition(built_archive)
t.copy(built_archive, name)
t.rm("lib")
def test_glob_archive(archives, glob, expected, sort_results = False):
output = StringIO.StringIO()
## replace placeholders
glob = glob.replace("$archive1", archives[0]).replace("$obj", obj_suffix)
expected = [ m.replace("$archive1",
archives[0]).replace("$obj", obj_suffix) for m in expected ]
if len(archives) > 1 :
glob = glob.replace("$archive2", archives[1]).replace("$obj", obj_suffix)
expected = [ m.replace("$archive2",
archives[1]).replace("$obj", obj_suffix) for m in expected ]
## create test jamfile
if sort_results : glob = "[ SORT %s ]" % glob
output.write("""\
for local p in %s
{
ECHO $(p) ;
}
UPDATE ;
""" % glob)
t.write("file.jam", output.getvalue())
## run test jamfile and match against expected results
if sort_results : expected.sort()
t.run_build_system(["-ffile.jam"], stdout="\n".join(expected + [""]))
t.rm("file.jam")
## RUN TESTS
setup_archive("auxilliary1.lib", sources)
archive1 = archive
setup_archive("auxilliary2.lib", sources)
archive2 = archive
## all arguments empty
test_glob_archive([archive1], "[ GLOB_ARCHIVE ]", [])
## empty query
test_glob_archive([archive1], "[ GLOB_ARCHIVE $archive1 : ]", [])
## no-match
test_glob_archive([archive1], "[ GLOB_ARCHIVE $archive1 : a ]", [])
## match exact
test_glob_archive([archive1], "[ GLOB_ARCHIVE $archive1 : a$obj ]",
["$archive1(a$obj)"])
## glob wildcards:1
test_glob_archive([archive1], "[ GLOB_ARCHIVE $archive1 : b.* ]",
["$archive1(b$obj)"])
## glob wildcards:2
test_glob_archive([archive1], '[ GLOB_ARCHIVE $archive1 : "\\b?match[\.]*" ]',
["$archive1(b_match$obj)"])
## glob wildcards:3
test_glob_archive([archive1], "[ SORT [ GLOB_ARCHIVE $archive1 : b* ] ]",
["$archive1(b$obj)", "$archive1(b_match$obj)"])
## glob multiple patterns with multiple results.
test_glob_archive([archive1], "[ SORT [ GLOB_ARCHIVE $archive1 : b.* b_* ] ]",
["$archive1(b$obj)", "$archive1(b_match$obj)"])
## glob multiple archives and patterns.
test_glob_archive([archive1, archive2],
"[ SORT [ GLOB_ARCHIVE $archive1 $archive2 : b.* b_* ] ]",
["$archive1(b$obj)", "$archive1(b_match$obj)",
"$archive2(b$obj)", "$archive2(b_match$obj)"])
## glob same archive multiple times.
test_glob_archive([archive1, archive1],
"[ GLOB_ARCHIVE $archive1 $archive2 $archive1 : b.* ]",
["$archive1(b$obj)", "$archive2(b$obj)", "$archive1(b$obj)"])
## returned archive member has no path, even though its source object-file did.
## this is rather NT-specific, where members also store their object-file's path.
test_glob_archive([archive1], "[ GLOB_ARCHIVE $archive1 : nopath_check$obj ]",
["$archive1(nopath_check$obj)"])
## case insensitive matching, when archives support case sensitive member names.
## VMS implementation forces case-insensitive matching and downcased member names.
case_sensitive_members = ( not vms )
if case_sensitive_members:
test_glob_archive([archive1],
"[ GLOB_ARCHIVE $archive1 : casecheck$obj : true ]",
["$archive1(CaseCheck$obj)"])
elif vms:
test_glob_archive([archive1],
"[ GLOB_ARCHIVE $archive1 : CaseCheck$obj : false ]",
["$archive1(casecheck$obj)"])
## test the order of matched members, in general it should match the
## insertion sequence.
test_glob_archive([archive1], "[ SORT [ GLOB_ARCHIVE $archive1 : seq_check*$obj ] ]",
["$archive1(seq_check1$obj)", "$archive1(seq_check2$obj)",
"$archive1(seq_check3$obj)"])
## glob members by symbols they contain.
## Currently supported only on VMS.
symbol_glob_supported = ( vms )
if symbol_glob_supported :
## NOTE: generated symbols are compiler-dependent and may be specifically
## mangled (as in C++ case), so globbing by exact symbol is non-trivial.
## However, C-generated symbols are likely to have more portable names,
## so for the glob-by-symbol tests we glob C-generated archive members.
## glob members by exact symbol.
test_glob_archive([archive1],
"[ GLOB_ARCHIVE $archive1 : : : symbol ]",
["$archive1(symbols_check$obj)"])
## glob members by symbol wildcard.
test_glob_archive([archive1],
"[ GLOB_ARCHIVE $archive1 : : : symbol_* ]",
["$archive1(symbols_check$obj)"])
## glob members by member pattern AND symbol pattern.
test_glob_archive([archive1],
"[ GLOB_ARCHIVE $archive1 : *symbol* : : *member* ]",
["$archive1(members_and_symbols_check$obj)"])
## case insensitive symbol glob.
test_glob_archive([archive1],
"[ GLOB_ARCHIVE $archive1 : : true : symbolcasecheck ]",
["$archive1(symbol_case_check$obj)"])
## glob member that contains main symbol.
test_glob_archive([archive1],
"[ GLOB_ARCHIVE $archive1 : : : main _main ]",
["$archive1(main_check$obj)"])
else:
test_glob_archive([archive1],
"[ GLOB_ARCHIVE $archive1 : : : symbol ]",
[])
t.cleanup()