Add support for requires() statements in top-level .pro files

For example qtserialport has

    requires(!winrt)

and with this patch it gets translated to

    project(...)

    if(WINRT)
        return()
    endif()

    find_package(...)
    qt_build_repo(...)

Change-Id: Ic38b803b464037a42adc55930947f57c5efa7b45
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
This commit is contained in:
Simon Hausmann 2019-09-20 13:43:26 +02:00
parent 9ef4ffb1a4
commit 9fe82283c6

View File

@ -865,6 +865,10 @@ class Scope(object):
scope._append_operation("_INCLUDED", UniqueAddOperation(included)) scope._append_operation("_INCLUDED", UniqueAddOperation(included))
continue continue
project_required_condition = statement.get("project_required_condition")
if project_required_condition:
scope._append_operation("_REQUIREMENTS", AddOperation(project_required_condition))
scope.settle_condition() scope.settle_condition()
if scope.scope_debug: if scope.scope_debug:
@ -1239,6 +1243,7 @@ class QmakeParser:
Load = add_element("Load", pp.Keyword("load") + CallArgs("loaded")) Load = add_element("Load", pp.Keyword("load") + CallArgs("loaded"))
Include = add_element("Include", pp.Keyword("include") + CallArgs("included")) Include = add_element("Include", pp.Keyword("include") + CallArgs("included"))
Option = add_element("Option", pp.Keyword("option") + CallArgs("option")) Option = add_element("Option", pp.Keyword("option") + CallArgs("option"))
Requires = add_element("Requires", pp.Keyword("requires") + CallArgs("project_required_condition"))
# ignore the whole thing... # ignore the whole thing...
DefineTestDefinition = add_element( DefineTestDefinition = add_element(
@ -1277,6 +1282,7 @@ class QmakeParser:
Load Load
| Include | Include
| Option | Option
| Requires
| ForLoop | ForLoop
| ForLoopSingleLine | ForLoopSingleLine
| DefineTestDefinition | DefineTestDefinition
@ -2287,6 +2293,21 @@ def write_statecharts(cm_fh: IO[str], target: str, scope: Scope, indent: int = 0
cm_fh.write(f"{spaces(indent)}{f}\n") cm_fh.write(f"{spaces(indent)}{f}\n")
cm_fh.write(")\n") cm_fh.write(")\n")
def expand_project_requirements(scope: Scope) -> str:
requirements = ""
for requirement in scope.get("_REQUIREMENTS"):
original_condition = simplify_condition(map_condition(requirement))
inverted_requirement = simplify_condition(f"NOT {map_condition(requirement)}")
requirements += dedent(f"""\
if({inverted_requirement})
message(NOTICE "Skipping the build as the condition \\"{original_condition}\\" is not met.")
return()
endif()
""")
return requirements
def write_extend_target(cm_fh: IO[str], target: str, scope: Scope, indent: int = 0): def write_extend_target(cm_fh: IO[str], target: str, scope: Scope, indent: int = 0):
ind = spaces(indent) ind = spaces(indent)
extend_qt_io_string = io.StringIO() extend_qt_io_string = io.StringIO()
@ -2996,7 +3017,7 @@ def handle_top_level_repo_project(scope: Scope, cm_fh: IO[str]):
qt_lib += "_FIXME" qt_lib += "_FIXME"
qt_lib_no_prefix = qt_lib qt_lib_no_prefix = qt_lib
content = dedent( header = dedent(
f"""\ f"""\
cmake_minimum_required(VERSION {cmake_version_string}) cmake_minimum_required(VERSION {cmake_version_string})
@ -3009,11 +3030,17 @@ def handle_top_level_repo_project(scope: Scope, cm_fh: IO[str]):
find_package(Qt6 ${{PROJECT_VERSION}} CONFIG REQUIRED COMPONENTS BuildInternals Core SET_ME_TO_SOMETHING_USEFUL) find_package(Qt6 ${{PROJECT_VERSION}} CONFIG REQUIRED COMPONENTS BuildInternals Core SET_ME_TO_SOMETHING_USEFUL)
find_package(Qt6 ${{PROJECT_VERSION}} CONFIG OPTIONAL_COMPONENTS SET_ME_TO_SOMETHING_USEFUL) find_package(Qt6 ${{PROJECT_VERSION}} CONFIG OPTIONAL_COMPONENTS SET_ME_TO_SOMETHING_USEFUL)
"""
)
build_repo = dedent(
f"""\
qt_build_repo() qt_build_repo()
""" """
) )
cm_fh.write(f"{content}") cm_fh.write(f"{header}{expand_project_requirements(scope)}{build_repo}")
def find_top_level_repo_project_file(project_file_path: str = "") -> Optional[str]: def find_top_level_repo_project_file(project_file_path: str = "") -> Optional[str]: