添加SIP作为qmake的编译器



我正试图将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: *没有make target的规则../../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应该意识到,但我已经注释了代码,而我试图得到这一步。

问题是由于使用字符串匹配来链接依赖项到目标,而不是检测目标/依赖项是否为路径并进行任何相关转换而发生的。在我的例子中,这是因为我生成的源文件的库依赖被列为相对路径(../../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} )

最新更新