aboutsummaryrefslogtreecommitdiff
path: root/ports/qt5-modularscripts/qt_modular_library.cmake
blob: cdffc58fa933449455b6ade8d4c2e9a0b8e239fe (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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
set(_qt5base_port_dir "${CMAKE_CURRENT_LIST_DIR}")

function(qt_modular_library NAME HASH)
    string(LENGTH "${CURRENT_BUILDTREES_DIR}" BUILDTREES_PATH_LENGTH)
    if(BUILDTREES_PATH_LENGTH GREATER 45)
        message(WARNING "Qt5's buildsystem uses very long paths and may fail on your system.\n"
            "We recommend moving vcpkg to a short path such as 'C:\\src\\vcpkg' or using the subst command."
        )
    endif()

    if(VCPKG_LIBRARY_LINKAGE STREQUAL static)
        message(FATAL_ERROR "Qt5 doesn't currently support static builds. Please use a dynamic triplet instead.")
    endif()

    set(SRCDIR_NAME "${NAME}-5.9.2")
    set(ARCHIVE_NAME "${NAME}-opensource-src-5.9.2")
    set(ARCHIVE_EXTENSION ".tar.xz")

    set(SOURCE_PATH ${CURRENT_BUILDTREES_DIR}/src/${SRCDIR_NAME})
    vcpkg_download_distfile(ARCHIVE_FILE
        URLS "http://download.qt.io/official_releases/qt/5.9/5.9.2/submodules/${ARCHIVE_NAME}${ARCHIVE_EXTENSION}"
        FILENAME ${SRCDIR_NAME}${ARCHIVE_EXTENSION}
        SHA512 ${HASH}
    )
    vcpkg_extract_source_archive(${ARCHIVE_FILE})
    if (EXISTS ${CURRENT_BUILDTREES_DIR}/src/${ARCHIVE_NAME})
        file(RENAME ${CURRENT_BUILDTREES_DIR}/src/${ARCHIVE_NAME} ${CURRENT_BUILDTREES_DIR}/src/${SRCDIR_NAME})
    endif()

    # This fixes issues on machines with default codepages that are not ASCII compatible, such as some CJK encodings
    set(ENV{_CL_} "/utf-8")

    #Store build paths
    set(DEBUG_DIR "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg")
    set(RELEASE_DIR "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel")

    file(REMOVE_RECURSE "${DEBUG_DIR}" "${RELEASE_DIR}")

    #Find Python and add it to the path
    vcpkg_find_acquire_program(PYTHON2)
    get_filename_component(PYTHON2_EXE_PATH ${PYTHON2} DIRECTORY)
    set(ENV{PATH} "${PYTHON2_EXE_PATH};$ENV{PATH}")

    file(TO_NATIVE_PATH "${CURRENT_INSTALLED_DIR}" NATIVE_INSTALLED_DIR)
    file(TO_NATIVE_PATH "${CURRENT_PACKAGES_DIR}" NATIVE_PACKAGES_DIR)
    
    string(SUBSTRING "${NATIVE_INSTALLED_DIR}" 2 -1 INSTALLED_DIR_WITHOUT_DRIVE)
    string(SUBSTRING "${NATIVE_PACKAGES_DIR}" 2 -1 PACKAGES_DIR_WITHOUT_DRIVE)
    
    #Configure debug
    vcpkg_configure_qmake_debug(
        SOURCE_PATH ${CURRENT_BUILDTREES_DIR}/src/${SRCDIR_NAME}
    )

    #First generate the makefiles so we can modify them
    vcpkg_build_qmake_debug(TARGETS qmake_all)

    #Store debug makefiles path
    file(GLOB_RECURSE DEBUG_MAKEFILES ${DEBUG_DIR}/*Makefile*)

    foreach(DEBUG_MAKEFILE ${DEBUG_MAKEFILES})
        file(READ "${DEBUG_MAKEFILE}" _contents)
        string(REPLACE "zlib.lib" "zlibd.lib" _contents "${_contents}")
        string(REPLACE "installed\\${TARGET_TRIPLET}\\lib" "installed\\${TARGET_TRIPLET}\\debug\\lib" _contents "${_contents}")
        string(REPLACE "/LIBPATH:${NATIVE_INSTALLED_DIR}\\debug\\lib qtmaind.lib" "shell32.lib /LIBPATH:${NATIVE_INSTALLED_DIR}\\debug\\lib\\manual-link qtmaind.lib /LIBPATH:${NATIVE_INSTALLED_DIR}\\debug\\lib" _contents "${_contents}")
        file(WRITE "${DEBUG_MAKEFILE}" "${_contents}")
    endforeach()

    #Build debug
    vcpkg_build_qmake_debug()

    #Configure release
    vcpkg_configure_qmake_release(
        SOURCE_PATH ${CURRENT_BUILDTREES_DIR}/src/${SRCDIR_NAME}
    )

    #First generate the makefiles so we can modify them
    vcpkg_build_qmake_release(TARGETS qmake_all)

    #Store release makefile path
    file(GLOB_RECURSE RELEASE_MAKEFILES ${RELEASE_DIR}/*Makefile*)

    foreach(RELEASE_MAKEFILE ${RELEASE_MAKEFILES})
        file(READ "${RELEASE_MAKEFILE}" _contents)
        string(REPLACE "/LIBPATH:${NATIVE_INSTALLED_DIR}\\lib qtmain.lib" "shell32.lib /LIBPATH:${NATIVE_INSTALLED_DIR}\\lib\\manual-link qtmain.lib /LIBPATH:${NATIVE_INSTALLED_DIR}\\lib" _contents "${_contents}")
        file(WRITE "${RELEASE_MAKEFILE}" "${_contents}")
    endforeach()
    
    #Build release
    vcpkg_build_qmake_release()

    #Fix the cmake files if they exist
    if(EXISTS ${RELEASE_DIR}/lib/cmake)
        vcpkg_execute_required_process(
            COMMAND ${PYTHON2} ${_qt5base_port_dir}/fixcmake.py
            WORKING_DIRECTORY ${RELEASE_DIR}/lib/cmake
            LOGNAME fix-cmake
        )
    endif()
    
    #Set the correct install directory to packages
    foreach(MAKEFILE ${RELEASE_MAKEFILES} ${DEBUG_MAKEFILES})
        vcpkg_replace_string(${MAKEFILE} "(INSTALL_ROOT)${INSTALLED_DIR_WITHOUT_DRIVE}" "(INSTALL_ROOT)${PACKAGES_DIR_WITHOUT_DRIVE}")
    endforeach()

    #Install the module files
    vcpkg_build_qmake_debug(TARGETS install)
    vcpkg_build_qmake_release(TARGETS install)

    #Remove extra cmake files
    if(EXISTS ${CURRENT_PACKAGES_DIR}/lib/cmake)
        file(MAKE_DIRECTORY ${CURRENT_PACKAGES_DIR}/share)
        file(RENAME ${CURRENT_PACKAGES_DIR}/lib/cmake ${CURRENT_PACKAGES_DIR}/share/cmake)
    endif()
    if(EXISTS ${CURRENT_PACKAGES_DIR}/debug/lib/cmake)
        file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/lib/cmake)
    endif()

    file(GLOB RELEASE_LIBS "${CURRENT_PACKAGES_DIR}/lib/*")
    if(NOT RELEASE_LIBS)
        file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/lib)
    endif()
    file(GLOB DEBUG_FILES "${CURRENT_PACKAGES_DIR}/debug/lib/*")
    if(NOT DEBUG_FILES)
        file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/lib)
    endif()

    #Move release and debug dlls to the correct directory
    if(EXISTS ${CURRENT_PACKAGES_DIR}/tools/qt5)
        file(RENAME ${CURRENT_PACKAGES_DIR}/tools/qt5 ${CURRENT_PACKAGES_DIR}/tools/${PORT})
        file(RENAME ${CURRENT_PACKAGES_DIR}/debug/tools/qt5 ${CURRENT_PACKAGES_DIR}/debug/tools/${PORT})
    endif()

    file(GLOB RELEASE_DLLS ${CURRENT_PACKAGES_DIR}/tools/${PORT}/*.dll)
    file(GLOB DEBUG_DLLS ${CURRENT_PACKAGES_DIR}/debug/tools/${PORT}/*.dll)
    if (RELEASE_DLLS)
        file(INSTALL ${RELEASE_DLLS} DESTINATION ${CURRENT_PACKAGES_DIR}/bin)
        file(REMOVE ${RELEASE_DLLS})
        #Check if there are any binaries left over; if not - delete the directory
        file(GLOB RELEASE_BINS ${CURRENT_PACKAGES_DIR}/tools/${PORT}/*)
        if(NOT RELEASE_BINS)
            file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/tools)
        endif()
    endif()
    if(DEBUG_DLLS)
        file(INSTALL ${DEBUG_DLLS} DESTINATION ${CURRENT_PACKAGES_DIR}/debug/bin)
        file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/tools)
    endif()

    file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/share/qt5/debug/include)

    vcpkg_copy_tool_dependencies(${CURRENT_PACKAGES_DIR}/tools/${PORT})

    #Find the relevant license file and install it
    if(EXISTS "${SOURCE_PATH}/LICENSE.LGPLv3")
        set(LICENSE_PATH "${SOURCE_PATH}/LICENSE.LGPLv3")
    elseif(EXISTS "${SOURCE_PATH}/LICENSE.LGPL3")
        set(LICENSE_PATH "${SOURCE_PATH}/LICENSE.LGPL3")
    elseif(EXISTS "${SOURCE_PATH}/LICENSE.GPLv3")
        set(LICENSE_PATH "${SOURCE_PATH}/LICENSE.GPLv3")
    elseif(EXISTS "${SOURCE_PATH}/LICENSE.GPL3")
        set(LICENSE_PATH "${SOURCE_PATH}/LICENSE.GPL3")
    endif()
    file(INSTALL ${LICENSE_PATH} DESTINATION ${CURRENT_PACKAGES_DIR}/share/${PORT} RENAME copyright)

endfunction()