FreeCAD

Форк
0
/
SetupShibokenAndPyside.cmake 
240 строк · 11.5 Кб
1
macro(SetupShibokenAndPyside)
2
# -------------------------------- Shiboken/PySide ------------------------
3

4
    option(FREECAD_USE_SHIBOKEN "Links to the shiboken library at build time. If OFF its Python module is imported at runtime" ON)
5
    option(FREECAD_USE_PYSIDE "Links to the PySide libraries at build time." ON)
6

7
    if(DEFINED MACPORTS_PREFIX)
8
        find_package(Shiboken REQUIRED HINTS "${PYTHON_LIBRARY_DIR}/cmake")
9
        find_package(PySide REQUIRED HINTS "${PYTHON_LIBRARY_DIR}/cmake")
10
    endif(DEFINED MACPORTS_PREFIX)
11

12
    if(FREECAD_QT_MAJOR_VERSION EQUAL 5)
13
        set(SHIBOKEN_MAJOR_VERSION 2)
14
        set(PYSIDE_MAJOR_VERSION 2)
15
    else()
16
        set(SHIBOKEN_MAJOR_VERSION ${FREECAD_QT_MAJOR_VERSION})
17
        set(PYSIDE_MAJOR_VERSION ${FREECAD_QT_MAJOR_VERSION})
18
    endif()
19

20

21
    # Shiboken2Config.cmake may explicitly set CMAKE_BUILD_TYPE to Release which causes
22
    # CMake to fail to create Makefiles for a debug build.
23
    # So as a workaround we save and restore the value after checking for Shiboken2.
24
    set (SAVE_BUILD_TYPE ${CMAKE_BUILD_TYPE})
25
    find_package(Shiboken${SHIBOKEN_MAJOR_VERSION} QUIET)
26
    set (CMAKE_BUILD_TYPE ${SAVE_BUILD_TYPE})
27
    if (Shiboken${SHIBOKEN_MAJOR_VERSION}_FOUND)
28
        # Shiboken config file was found but it may use the wrong Python version
29
        # Try to get the matching config suffix and repeat finding the package
30
        set(SHIBOKEN_PATTERN .cpython-${Python3_VERSION_MAJOR}${Python3_VERSION_MINOR})
31

32
        file(GLOB SHIBOKEN_CONFIG "${Shiboken${SHIBOKEN_MAJOR_VERSION}_DIR}/Shiboken${SHIBOKEN_MAJOR_VERSION}Config${SHIBOKEN_PATTERN}*.cmake")
33
        if (SHIBOKEN_CONFIG)
34
            get_filename_component(SHIBOKEN_CONFIG_SUFFIX ${SHIBOKEN_CONFIG} NAME)
35
            string(SUBSTRING ${SHIBOKEN_CONFIG_SUFFIX} 15 -1 SHIBOKEN_CONFIG_SUFFIX)
36
            string(REPLACE ".cmake" "" PYTHON_CONFIG_SUFFIX ${SHIBOKEN_CONFIG_SUFFIX})
37
            message(STATUS "PYTHON_CONFIG_SUFFIX: ${PYTHON_CONFIG_SUFFIX}")
38
            find_package(Shiboken${SHIBOKEN_MAJOR_VERSION} QUIET)
39
        endif()
40

41
        if(TARGET Shiboken6::libshiboken AND SHIBOKEN_MAJOR_VERSION EQUAL 6)
42
            set_target_properties(Shiboken6::libshiboken PROPERTIES INTERFACE_COMPILE_DEFINITIONS "NDEBUG")
43
        endif()
44
    endif()
45

46
    # pyside2 changed its cmake files, this is the dance we have
47
    # to dance to be compatible with the old (<5.12) and the new versions (>=5.12)
48
    if(NOT SHIBOKEN_INCLUDE_DIR AND TARGET Shiboken${SHIBOKEN_MAJOR_VERSION}::libshiboken)
49
        get_property(SHIBOKEN_INCLUDE_DIR TARGET Shiboken${SHIBOKEN_MAJOR_VERSION}::libshiboken PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
50
    endif(NOT SHIBOKEN_INCLUDE_DIR AND TARGET Shiboken${SHIBOKEN_MAJOR_VERSION}::libshiboken)
51

52
    if(NOT SHIBOKEN_INCLUDE_DIR)
53
        find_pip_package(Shiboken${SHIBOKEN_MAJOR_VERSION})
54
        if (Shiboken${SHIBOKEN_MAJOR_VERSION}_FOUND)
55
            set(SHIBOKEN_INCLUDE_DIR ${Shiboken${SHIBOKEN_MAJOR_VERSION}_INCLUDE_DIRS})
56
            set(SHIBOKEN_LIBRARY ${Shiboken${SHIBOKEN_MAJOR_VERSION}_LIBRARIES})
57
        endif()
58
    endif()
59

60
    find_package(PySide${PYSIDE_MAJOR_VERSION} QUIET)
61

62
    if(NOT PYSIDE_INCLUDE_DIR AND TARGET PySide${PYSIDE_MAJOR_VERSION}::pyside${PYSIDE_MAJOR_VERSION})
63
        get_property(PYSIDE_INCLUDE_DIR TARGET PySide${PYSIDE_MAJOR_VERSION}::pyside${PYSIDE_MAJOR_VERSION} PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
64
    endif(NOT PYSIDE_INCLUDE_DIR AND TARGET PySide${PYSIDE_MAJOR_VERSION}::pyside${PYSIDE_MAJOR_VERSION})
65

66
    if(NOT PYSIDE_INCLUDE_DIR)
67
        find_pip_package(PySide${PYSIDE_MAJOR_VERSION})
68
        if (PySide${PYSIDE_MAJOR_VERSION}_FOUND)
69
            set(PYSIDE_INCLUDE_DIR ${PySide${PYSIDE_MAJOR_VERSION}_INCLUDE_DIRS})
70
            set(PYSIDE_LIBRARY ${PySide${PYSIDE_MAJOR_VERSION}_LIBRARIES})
71
        endif()
72
    endif()
73

74
    find_package(PySide${PYSIDE_MAJOR_VERSION}Tools QUIET) # PySide utilities (uic & rcc executables)
75
    if(NOT PYSIDE_TOOLS_FOUND)
76
        message("=======================\n"
77
                "PySide${PYSIDE_MAJOR_VERSION}Tools not found.\n"
78
                "=======================\n")
79
    endif()
80

81
    file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/Ext/PySide)
82
    file(WRITE ${CMAKE_BINARY_DIR}/Ext/PySide/__init__.py "# PySide wrapper\n"
83
                                "from PySide${PYSIDE_MAJOR_VERSION} import __version__\n"
84
                                "from PySide${PYSIDE_MAJOR_VERSION} import __version_info__\n")
85
    file(WRITE ${CMAKE_BINARY_DIR}/Ext/PySide/QtCore.py "from PySide${PYSIDE_MAJOR_VERSION}.QtCore import *\n\n"
86
                                "#QCoreApplication.CodecForTr=0\n"
87
                                "#QCoreApplication.UnicodeUTF8=1\n")
88
    file(WRITE ${CMAKE_BINARY_DIR}/Ext/PySide/QtNetwork.py  "from PySide${PYSIDE_MAJOR_VERSION}.QtNetwork import *\n")
89
    if(BUILD_GUI)
90
        file(WRITE ${CMAKE_BINARY_DIR}/Ext/PySide/QtGui.py  "from PySide${PYSIDE_MAJOR_VERSION}.QtGui import *\n"
91
                                    "from PySide${PYSIDE_MAJOR_VERSION}.QtWidgets import *\n"
92
                                    "QHeaderView.setResizeMode = QHeaderView.setSectionResizeMode\n")
93
        file(WRITE ${CMAKE_BINARY_DIR}/Ext/PySide/QtSvg.py  "from PySide${PYSIDE_MAJOR_VERSION}.QtSvg import *\n")
94
        file(WRITE ${CMAKE_BINARY_DIR}/Ext/PySide/QtUiTools.py  "from PySide${PYSIDE_MAJOR_VERSION}.QtUiTools import *\n")
95
        file(WRITE ${CMAKE_BINARY_DIR}/Ext/PySide/QtWidgets.py  "from PySide${PYSIDE_MAJOR_VERSION}.QtWidgets import *\n")
96
        if(PYSIDE_MAJOR_VERSION LESS 6)
97
            file(WRITE ${CMAKE_BINARY_DIR}/Ext/PySide/QtSvgWidgets.py  "from PySide${PYSIDE_MAJOR_VERSION}.QtSvg import QGraphicsSvgItem\n"
98
                                                                       "from PySide${PYSIDE_MAJOR_VERSION}.QtSvg import QSvgWidget\n")
99
            file(WRITE ${CMAKE_BINARY_DIR}/Ext/PySide/QtWebEngineWidgets.py  "from PySide${PYSIDE_MAJOR_VERSION}.QtWebEngineWidgets import *\n")
100
        else()
101
            file(WRITE ${CMAKE_BINARY_DIR}/Ext/PySide/QtSvgWidgets.py  "from PySide${PYSIDE_MAJOR_VERSION}.QtSvgWidgets import *\n")
102
            file(WRITE ${CMAKE_BINARY_DIR}/Ext/PySide/QtWebEngineWidgets.py  "from PySide${PYSIDE_MAJOR_VERSION}.QtWebEngineWidgets import *\n"
103
                                                                              "from PySide${PYSIDE_MAJOR_VERSION}.QtWebEngineCore import QWebEnginePage\n")
104
        endif()
105
    endif()
106

107
    if(APPLE AND NOT BUILD_WITH_CONDA)
108
        install(
109
        DIRECTORY
110
            ${CMAKE_BINARY_DIR}/Ext/PySide
111
        DESTINATION
112
            MacOS
113
        )
114
    else()
115
        install(
116
        DIRECTORY
117
            ${CMAKE_BINARY_DIR}/Ext/PySide
118
        DESTINATION
119
            Ext
120
        )
121
    endif()
122

123
    # If shiboken cannot be found the build option will be set to OFF
124
    if(NOT SHIBOKEN_INCLUDE_DIR)
125
        message(WARNING "Shiboken${PYSIDE_MAJOR_VERSION} include files not found, FREECAD_USE_SHIBOKEN automatically set to OFF")
126
        set(FREECAD_USE_SHIBOKEN OFF)
127
    endif()
128

129
    # Now try to import the shiboken Python module and print a warning if it can't be loaded
130
    execute_process(
131
        COMMAND ${PYTHON_EXECUTABLE} -c "import shiboken${SHIBOKEN_MAJOR_VERSION}"
132
        RESULT_VARIABLE FAILURE
133
        OUTPUT_VARIABLE PRINT_OUTPUT
134
    )
135

136
    if(FAILURE)
137
        message(WARNING
138
                "==================================\n"
139
                "Shiboken${SHIBOKEN_MAJOR_VERSION} Python module not found.\n"
140
                "==================================\n")
141
    else()
142
        execute_process(
143
            COMMAND ${PYTHON_EXECUTABLE} -c "import shiboken${SHIBOKEN_MAJOR_VERSION};print(shiboken${SHIBOKEN_MAJOR_VERSION}.__version__, end='')"
144
            RESULT_VARIABLE FAILURE
145
            OUTPUT_VARIABLE Shiboken_VERSION
146
        )
147
    endif()
148

149
    # If PySide cannot be found the build option will be set to OFF
150
    if(NOT PYSIDE_INCLUDE_DIR)
151
        message(WARNING "PySide${PYSIDE_MAJOR_VERSION} include files not found, FREECAD_USE_PYSIDE automatically set to OFF")
152
        set(FREECAD_USE_PYSIDE OFF)
153
    endif()
154

155
    # Independent of the build option PySide modules must be loaded at runtime. Print a warning if it fails.
156
    execute_process(
157
        COMMAND ${PYTHON_EXECUTABLE} -c "import PySide${PYSIDE_MAJOR_VERSION};import os;print(os.path.dirname(PySide${PYSIDE_MAJOR_VERSION}.__file__), end='')"
158
        RESULT_VARIABLE FAILURE
159
        OUTPUT_VARIABLE PRINT_OUTPUT
160
    )
161
    if(FAILURE)
162
        message(WARNING
163
                "================================\n"
164
                "PySide${PYSIDE_MAJOR_VERSION} Python module not found.\n"
165
                "================================\n")
166
    else()
167
        execute_process(
168
            COMMAND ${PYTHON_EXECUTABLE} -c "import PySide${PYSIDE_MAJOR_VERSION};print(PySide${PYSIDE_MAJOR_VERSION}.__version__, end='')"
169
            RESULT_VARIABLE FAILURE
170
            OUTPUT_VARIABLE PySide_VERSION
171
        )
172
        message(STATUS "PySide ${PySide_VERSION} Python module found at ${PRINT_OUTPUT}.\n")
173
    endif()
174

175
endmacro(SetupShibokenAndPyside)
176

177

178
# Macros similar to FindQt4.cmake's WRAP_UI and WRAP_RC, for the automatic generation of Python
179
# code from Qt4's user interface ('.ui') and resource ('.qrc') files. These macros are called:
180
# - PYSIDE_WRAP_UI
181
# - PYSIDE_WRAP_RC
182

183
MACRO(PYSIDE_WRAP_UI outfiles)
184
  if (NOT PYSIDE_UIC_EXECUTABLE)
185
    message(FATAL_ERROR "Qt uic is required for generating ${ARGN}")
186
  endif()
187
  FOREACH(it ${ARGN})
188
    GET_FILENAME_COMPONENT(outfile ${it} NAME_WE)
189
    GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE)
190
    SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/ui_${outfile}.py)
191
    if(WIN32 OR APPLE)
192
        ADD_CUSTOM_COMMAND(OUTPUT ${outfile}
193
          COMMAND ${PYSIDE_UIC_EXECUTABLE} ${UICOPTIONS} ${infile} -o ${outfile}
194
          MAIN_DEPENDENCY ${infile}
195
        )
196
    else()
197
        # Especially on Open Build Service we don't want changing date like
198
        # pyside2-uic generates in comments at beginning., which is why
199
        # we follow the tool command with a POSIX-friendly sed.
200
        ADD_CUSTOM_COMMAND(OUTPUT ${outfile}
201
          COMMAND "${PYSIDE_UIC_EXECUTABLE}" ${UICOPTIONS} "${infile}" -o "${outfile}"
202
          COMMAND sed "/^# /d" "${outfile}" >"${outfile}.tmp" && mv "${outfile}.tmp" "${outfile}"
203
          MAIN_DEPENDENCY "${infile}"
204
        )
205
    endif()
206
    list(APPEND ${outfiles} ${outfile})
207
  ENDFOREACH(it)
208
ENDMACRO (PYSIDE_WRAP_UI)
209

210
MACRO(PYSIDE_WRAP_RC outfiles)
211
  if (NOT PYSIDE_RCC_EXECUTABLE)
212
    message(FATAL_ERROR "Qt rcc is required for generating ${ARGN}")
213
  endif()
214
  FOREACH(it ${ARGN})
215
    GET_FILENAME_COMPONENT(outfile ${it} NAME_WE)
216
    GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE)
217
    SET(outfile "${CMAKE_CURRENT_BINARY_DIR}/${outfile}_rc.py")
218
    #ADD_CUSTOM_TARGET(${it} ALL
219
    #  DEPENDS ${outfile}
220
    #)
221
    if(WIN32 OR APPLE)
222
        ADD_CUSTOM_COMMAND(OUTPUT ${outfile}
223
          COMMAND ${PYSIDE_RCC_EXECUTABLE} ${RCCOPTIONS} ${infile} -o ${outfile}
224
          MAIN_DEPENDENCY ${infile}
225
        )
226
    else()
227
        # Especially on Open Build Service we don't want changing date like
228
        # pyside-rcc generates in comments at beginning, which is why
229
        # we follow the tool command with in-place sed.
230
        ADD_CUSTOM_COMMAND(OUTPUT "${outfile}"
231
          COMMAND "${PYSIDE_RCC_EXECUTABLE}" ${RCCOPTIONS} "${infile}" ${PY_ATTRIBUTE} -o "${outfile}"
232
          # The line below sometimes catches unwanted lines too - but there is no date in the file
233
          # anymore with Qt5 RCC, so commenting it out for now...
234
          #COMMAND sed "/^# /d" "${outfile}" >"${outfile}.tmp" && mv "${outfile}.tmp" "${outfile}"
235
          MAIN_DEPENDENCY "${infile}"
236
        )
237
    endif()
238
    list(APPEND ${outfiles} ${outfile})
239
  ENDFOREACH(it)
240
ENDMACRO (PYSIDE_WRAP_RC)
241

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.