我正试图将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} )