summaryrefslogtreecommitdiffstats
path: root/src/boost/tools/build/test/tag.py
blob: adf2fce6f170639808ebd3b8faa03752b815fafb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#!/usr/bin/python

# Copyright (C) 2003. Pedro Ferreira
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)

import BoostBuild


###############################################################################
#
# test_folder_with_dot_in_name()
# ------------------------------
#
###############################################################################

def test_folder_with_dot_in_name(t):
    """
      Regression test: the 'tag' feature did not work in directories that had a
    dot in their name.

    """
    t.write("version-1.32.0/jamroot.jam", """\
project test : requirements <tag>@$(__name__).tag ;

rule tag ( name : type ? : property-set )
{
   # Do nothing, just make sure the rule is invoked OK.
   ECHO The tag rule has been invoked. ;
}
exe a : a.cpp ;
""")
    t.write("version-1.32.0/a.cpp", "int main() {}\n")

    t.run_build_system(subdir="version-1.32.0")
    t.expect_addition("version-1.32.0/bin/$toolset/debug*/a.exe")
    t.expect_output_lines("The tag rule has been invoked.")


###############################################################################
#
# test_tag_property()
# -------------------
#
###############################################################################

def test_tag_property(t):
    """Basic tag property test."""

    t.write("jamroot.jam", """\
import virtual-target ;

rule tag ( name : type ? : property-set )
{
    local tags ;
    switch [ $(property-set).get <variant> ]
    {
        case debug   : tags += d ;
        case release : tags += r ;
    }
    switch [ $(property-set).get <link> ]
    {
        case shared : tags += s ;
        case static : tags += t ;
    }
    if $(tags)
    {
        return [ virtual-target.add-prefix-and-suffix $(name)_$(tags:J="")
            : $(type) : $(property-set) ] ;
    }
}

# Test both fully-qualified and local name of the rule
exe a : a.cpp : <tag>@$(__name__).tag ;
lib b : a.cpp : <tag>@tag ;
stage c : a ;
""")

    t.write("a.cpp", """\
int main() {}
#ifdef _MSC_VER
__declspec (dllexport) void x () {}
#endif
""")

    file_list = (
        BoostBuild.List("bin/$toolset/debug*/a_ds.exe") +
        BoostBuild.List("bin/$toolset/debug*/b_ds.dll") +
        BoostBuild.List("c/a_ds.exe") +
        BoostBuild.List("bin/$toolset/release*/a_rs.exe") +
        BoostBuild.List("bin/$toolset/release*/b_rs.dll") +
        BoostBuild.List("c/a_rs.exe") +
        BoostBuild.List("bin/$toolset/debug*/a_dt.exe") +
        BoostBuild.List("bin/$toolset/debug*/b_dt.lib") +
        BoostBuild.List("c/a_dt.exe") +
        BoostBuild.List("bin/$toolset/release*/a_rt.exe") +
        BoostBuild.List("bin/$toolset/release*/b_rt.lib") +
        BoostBuild.List("c/a_rt.exe"))

    variants = ["debug", "release", "link=static,shared"]

    t.run_build_system(variants)
    t.expect_addition(file_list)

    t.run_build_system(variants + ["clean"])
    t.expect_removal(file_list)


###############################################################################
#
# main()
# ------
#
###############################################################################

t = BoostBuild.Tester(use_test_config=False)

test_tag_property(t)
test_folder_with_dot_in_name(t)

t.cleanup()