summaryrefslogtreecommitdiffstats
path: root/tests/auto/scion/CMakeLists.txt
blob: 56231af063f69faef00ab5e7f3f62e7c713cbbd9 (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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause

#####################################################################
## tst_scion Test:
#####################################################################

qt_internal_add_test(tst_scion
    SOURCES
        tst_scion.cpp
    DEFINES
        QT_NO_CAST_FROM_ASCII
        QT_NO_CAST_TO_ASCII
    LIBRARIES
        Qt::Gui
        Qt::Qml
        Qt::Scxml
)
#### Ignored generated resource: ${CMAKE_CURRENT_BINARY_DIR}/scion.qrc
#### Keys ignored in scope 1:.:.:scion.pro:<TRUE>:
# ALLFILES = "$$SCXMLS_DIR/*.*,"
# ALLSCXMLS = "$$SCXMLS_DIR/*.scxml,"
# BLACKLISTED = "test216sub1.scxml" "test226sub1.txml" "test239sub1.scxml" "test242sub1.scxml" "test276sub1.scxml" "test530.txml.scxml" "test301.txml.scxml" "test441a.txml.scxml" "test441b.txml.scxml" "test557.txml.scxml"
# QMAKE_EXTRA_COMPILERS = "myscxml" "myscxml_hdr"
# SCXMLS_DIR = "$$absolute_path($$PWD/../../3rdparty/scion-tests/scxml-test-framework/test)"
# TEMPLATE = "app"
# contents = "'<!DOCTYPE" "RCC><RCC" "version=\"1.0\">'" "'<qresource>'" "$$qrc" "'</qresource></RCC>'"
# myscxml.commands = "$$QMAKE_QSCXMLC" "--header" "scxml/${QMAKE_FUNC_nameTheNamespace}_${QMAKE_FILE_IN_BASE}.h" "--impl" "${QMAKE_FILE_OUT}" "--namespace" "${QMAKE_FUNC_nameTheNamespace}" "--classname" "${QMAKE_FUNC_nameTheClass}" "${QMAKE_FILE_IN}"
# myscxml.depends = "$$QMAKE_QSCXMLC_EXE"
# myscxml.input = "SCXMLS"
# myscxml.output = "scxml/${QMAKE_FUNC_nameTheNamespace}_${QMAKE_FILE_IN_BASE}.cpp"
# myscxml.variable_out = "SOURCES"
# myscxml_hdr.commands = "$$escape_expand(\\n)"
# myscxml_hdr.depends = "scxml/${QMAKE_FUNC_nameTheNamespace}_${QMAKE_FILE_IN_BASE}.cpp"
# myscxml_hdr.input = "SCXMLS"
# myscxml_hdr.output = "scxml/${QMAKE_FUNC_nameTheNamespace}_${QMAKE_FILE_IN_BASE}.h"
# myscxml_hdr.variable_out = "SCXML_HEADERS"

## Scopes:
#####################################################################

#### Keys ignored in scope 2:.:.:scion.pro:defineReplace(nameTheNamespace):
# sn = "__relative_path___absolute_path___dirname_1_____OUT_PWD____SCXMLS_DIR_"

#### Keys ignored in scope 3:.:.:scion.pro:defineReplace(nameTheClass):
# cn = "1"

qt_internal_extend_target(tst_scion CONDITION MSVC AND WIN32
    COMPILE_OPTIONS
        /bigobj
)

# For a better explanation about the "blacklisted" tests, see tst_scion.cpp
# <invoke>. The files with sub in their file name are loaded from other
# tests, they are not to be run alone.

set(blacklisted
    test216sub1.scxml
    test226sub1.txml
    test239sub1.scxml
    test242sub1.scxml
    test276sub1.scxml
    # 530: Scxml children element and expr attribute in content, not supported
    # at the moment by the scxml compiler.
    test530.txml.scxml)

# other
list(APPEND blacklisted
    # 301: The scxml is trying to use a nonexistent file as a script souce,
    # script compilation fails.
    test301.txml.scxml
    # 441a and b tests the exmode scxml element attribute that is not
    # supported by the scxml compiler. This attribute was also removed
    # from the latest scxml specification.
    test441a.txml.scxml
    test441b.txml.scxml
    # 557: Compilation fails at parsing books as data element content and loading
    # data content from external file.
    test557.txml.scxml)

set(scxmls_dir ../../3rdparty/scion-tests/scxml-test-framework/test)
get_filename_component(scxmls_dir ${scxmls_dir} ABSOLUTE)
file(GLOB_RECURSE allscxmls ${scxmls_dir}/*.scxml)

_qt_internal_get_tool_wrapper_script_path(tool_wrapper)
set(qscxmlc_bin "${tool_wrapper}" "$<TARGET_FILE:${QT_CMAKE_EXPORT_NAMESPACE}::qscxmlc>")

set(scxmls)
set(inc_list)
set(func_list)
set(test_bases)
foreach(f ${allscxmls})
    get_filename_component(cn ${f} NAME)
    if(NOT cn IN_LIST blacklisted)
        list(APPEND scxmls ${f})

        string(REGEX REPLACE "\\.scxml$" "" cn ${cn})
        set(hn ${cn})
        string(REGEX REPLACE "\\.txml$" "" cn ${cn})
        get_filename_component(sn ${f} DIRECTORY)
        file(RELATIVE_PATH sn ${scxmls_dir} ${sn})
        string(REGEX REPLACE "[^a-zA-Z_0-9]" "_" sn ${sn})

        set(out_h scxml/${sn}_${hn}.h)
        set(out_cpp scxml/${sn}_${hn}.cpp)
        string(APPEND inc_list "#include \"${out_h}\"\n")
        string(APPEND func_list "    []()->QScxmlStateMachine*{return new ${sn}::${cn};},\n")

        file(RELATIVE_PATH tn ${scxmls_dir} ${f})
        string(REGEX REPLACE "\\.scxml$" "" tn ${tn})
        string(APPEND test_bases "    \"${tn}\",\n")

        file(TO_NATIVE_PATH ${out_h} native_out_h)
        file(TO_NATIVE_PATH ${out_cpp} native_out_cpp)
        add_custom_command(
            OUTPUT ${out_cpp} ${out_h}
            COMMAND
                ${qscxmlc_bin} --header ${native_out_h} --impl ${native_out_cpp}
                --namespace ${sn} --classname ${cn} ${f}
            DEPENDS ${QT_CMAKE_EXPORT_NAMESPACE}::qscxmlc
            VERBATIM
        )
        set_source_files_properties(${out_h} ${out_cpp} PROPERTIES SKIP_AUTOMOC TRUE)
        qt_internal_extend_target(tst_scion SOURCES ${out_h} ${out_cpp})
    endif()
endforeach()

file(GLOB_RECURSE allfiles ${scxmls_dir}/*.*)
foreach(f ${allfiles})
    file(RELATIVE_PATH base ${scxmls_dir} ${f})
    set_source_files_properties(${f}
        PROPERTIES
            QT_SKIP_QUICKCOMPILER ON
            QT_RESOURCE_ALIAS ${base}
    )
endforeach()

qt_internal_add_resource(tst_scion "scion"
    PREFIX "/"
    FILES ${allfiles}
)

file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/scxml/compiled_tests.h
    "${inc_list}\nstd::function<QScxmlStateMachine *()> creators[] = {\n${func_list}};")
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/scxml/scion.h
    "const char *testBases[] = {\n${test_bases}};")
qt_internal_extend_target(tst_scion SOURCES
    ${CMAKE_CURRENT_BINARY_DIR}/scxml/compiled_tests.h
    ${CMAKE_CURRENT_BINARY_DIR}/scxml/scion.h)