0

我正在尝试将 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脚本没有运行并且发生错误:

制作:*没有规则制作目标 ../../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 知道,但是我在尝试执行此步骤时已经注释掉了该代码。

4

1 回答 1

0

由于使用字符串匹配将依赖项链接到目标,而不是检测目标/依赖项是否是路径并进行任何相关转换,因此出现此问题。就我而言,这是因为我生成的源文件的库依赖项被列为相对路径 ( ../../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} )
于 2014-06-25T12:40:18.070 回答