【问题标题】:Adding SIP as a compiler for qmake添加 SIP 作为 qmake 的编译器
【发布时间】:2014-08-15 02:22:30
【问题描述】:

我正在尝试将 PyQt5 绑定创建集成到我的 qmake 构建过程中,我已经准备好我的 SIP 文件并且我已经为它设置了一个编译器:

SIP_FILES += global/sip/Sy_version.sip

sipSourceBuilder.input = SIP_FILES
sipSourceBuilder.output_function = sipSourceHandler
sipSourceBuilder.variable_out = SOURCES
sipSourceBuilder.dependency_type = TYPE_C
sipSourceBuilder.CONFIG += target_predeps
sipSourceBuilder.commands = $$PYTHON $${PWD}/sipConfigure.py \
                                       $$QT_SIP_PATH \
                                       $${_PRO_FILE_PWD_} \
                                       $${_PRO_FILE_PWD_}/${QMAKE_FILE_IN}

QMAKE_CLEAN += $${_PRO_FILE_PWD_}/sipOutput/sip${QMAKE_TARGET}cmodule.cpp
SOURCES += $${_PRO_FILE_PWD_}/sipOutput/sip${QMAKE_TARGET}cmodule.cpp

QMAKE_EXTRA_COMPILERS += sipSourceBuilder

defineReplace 函数 sipSourceHandler 工作正常。当我开始构建时,sipConfigure.py 脚本未运行并发生错误:

make: * 没有制定目标的规则 ../../Syren2/core/sipOutput/sipcoreSy_version.cpp', needed by /home/cmannett85/Programs/Syren2/libs/libcore.so.1.0.0'。停下来。

如果脚本没有运行,这有什么意义 - 但为什么没有运行呢? Makefile 显示规则存在:

/home/cmannett85/workspace/Syren2/source/Syren2/core/sipOutput/sip${QMAKE_TARGET}Sy_version.cpp: ../../Syren2/core/global/Sy_version.h \
        /home/cmannett85/Qt/5.3/gcc_64/include/QtCore/QtGlobal \
        // ...Lots of includes....
        ../../Syren2/core/global/sip/Sy_version.sip
    python3 /home/cmannett85/workspace/Syren2/source/Syren2/sipConfigure.py /usr/share/sip/PyQt5 /home/cmannett85/workspace/Syren2/source/Syren2/core /home/cmannett85/workspace/Syren2/source/Syren2/core/../../Syren2/core/global/sip/Sy_version.sip

(对不起,巨大的侧卷轴)。 ${QMAKE_TARGET}core,它在 Makefile 中被声明为变量。我尝试将sipSourceBuilder.commands 设置为一些随机的字符,并且在构建过程中没有任何抱怨,所以似乎make 甚至没有尝试使用sipSourceBuilder。有什么建议吗?

我还知道 SIP 编译器还会生成一个头文件,应该让 qmake 意识到这一点,但在我尝试执行此步骤时,我已经注释掉了该代码。

【问题讨论】:

    标签: qt makefile pyqt qmake python-sip


    【解决方案1】:

    由于使用字符串匹配将依赖项链接到目标,而不是检测目标/依赖项是否是路径并进行任何相关转换,因此出现此问题。就我而言,这是因为我生成的源文件的库依赖项被列为相对路径 (../../Syren2/core/sipOutput/sipcoreSy_version.cpp),但关联的目标被列为绝对路径 (/home/cmannett85/workspace/Syren2/source/Syren2/core/sipOutput/sip${QMAKE_TARGET}Sy_version.cpp)。

    解决方案是修改sipSourceHandler 输出文件名生成器以从 Makefile 的位置返回相对路径:

    // SIP_SOURCE_ABS was previously returned, now SIP_SOURCE is.
    SIP_SOURCE_ABS = $${_PRO_FILE_PWD_}/sipOutput/sip${QMAKE_TARGET}$${NO_PREFIX}.cpp
    SIP_SOURCE = $$relative_path( $$SIP_SOURCE_ABS, $${OUT_PWD} )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多