aboutsummaryrefslogtreecommitdiffstats
path: root/cmake/QtDeclarativeSetup.cmake
blob: 3513fdad0b78837aea075c560a38f8f31ed456ad (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
# Create a header containing a hash that describes this library.  For a
# released version of Qt, we'll use the .tag file that is updated by git
# archive with the tree hash. For unreleased versions, we'll ask git
# rev-parse. If none of this works, we use CMake to hash all the files
# in the src/qml/ directory.
# Skip recreation of the hash when doing a developer build.
function(qt_declarative_write_tag_header target_name)
    set(out_file "${CMAKE_CURRENT_BINARY_DIR}/qml_compile_hash_p.h")
    if(FEATURE_developer_build AND EXISTS "${out_file}")
        return()
    endif()

    set(tag_file "${CMAKE_CURRENT_SOURCE_DIR}/../../.tag")
    set(tag_contents "")
    if(EXISTS "${tag_file}")
        file(READ "${tag_file}" tag_contents)
        string(STRIP "${tag_contents}" tag_contents)
    endif()
    find_program(git_path git)

    if(tag_contents AND NOT tag_contents STREQUAL "$Format:%T$")
        set(QML_COMPILE_HASH "${tag_contents}")
    elseif(git_path AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../../.git")
        execute_process(
            COMMAND ${git_path} rev-parse HEAD
            OUTPUT_VARIABLE QML_COMPILE_HASH
            OUTPUT_STRIP_TRAILING_WHITESPACE
            WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
    endif()
    string(LENGTH "${QML_COMPILE_HASH}" QML_COMPILE_HASH_LENGTH)
    if(QML_COMPILE_HASH_LENGTH EQUAL 0)
        set(sources_hash "")
        file(GLOB_RECURSE qtqml_source_files "${CMAKE_CURRENT_SOURCE_DIR}/*")
        foreach(file IN LISTS qtqml_source_files)
            file(SHA1 ${file} file_hash)
            string(APPEND sources_hash ${file_hash})
        endforeach()
        string(SHA1 QML_COMPILE_HASH "${sources_hash}")
    endif()

    string(LENGTH "${QML_COMPILE_HASH}" QML_COMPILE_HASH_LENGTH)
    if(QML_COMPILE_HASH_LENGTH GREATER 0)
        configure_file("qml_compile_hash_p.h.in" "${out_file}")
    else()
        message(FATAL_ERROR "QML compile hash is empty! "
                            "You need either a valid git repository or a non-empty .tag file.")
    endif()
endfunction()

# Generate a header file containing a regular expression jit table.
function(qt_declarative_generate_reg_exp_jit_tables consuming_target)
    set(generate_dir "${CMAKE_CURRENT_BINARY_DIR}/.generated")
    if(CMAKE_BUILD_TYPE STREQUAL "Debug")
        string(APPEND generate_dir "/debug")
    elseif(CMAKE_BUILD_TYPE STREQUAL "Release")
        string(APPEND generate_dir "/release")
    endif()

    set(output_file "${generate_dir}/RegExpJitTables.h")
    set(retgen_script_file "${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/masm/yarr/create_regex_tables")

    add_custom_command(
        OUTPUT "${output_file}"
        COMMAND "${QT_INTERNAL_DECLARATIVE_PYTHON}" ${retgen_script_file} ${output_file}
        MAIN_DEPENDENCY ${retgen_script_file}
    )
    target_sources(${consuming_target} PRIVATE ${output_file})
    target_include_directories(${consuming_target} PRIVATE $<BUILD_INTERFACE:${generate_dir}>)
endfunction()