Python SWIG文件更改后如何重建项目?
给定以下生成文件:Python SWIG文件更改后如何重建项目?,python,c++,makefile,visual-studio-2015,swig,Python,C++,Makefile,Visual Studio 2015,Swig,给定以下生成文件: TARGET = _example.pyd OFILES = example.obj example_wrap.obj HFILES = CC = cl CXX = cl LINK = link CPPFLAGS = -DNDEBUG -DUNICODE -DWIN32 -I. -Id:\virtual_envs\py351\include CFLAGS = -nologo -Zm200 -Zc:wchar_t- -FS -Zc:strictStrings -O2 -MD
TARGET = _example.pyd
OFILES = example.obj example_wrap.obj
HFILES =
CC = cl
CXX = cl
LINK = link
CPPFLAGS = -DNDEBUG -DUNICODE -DWIN32 -I. -Id:\virtual_envs\py351\include
CFLAGS = -nologo -Zm200 -Zc:wchar_t- -FS -Zc:strictStrings -O2 -MD -W3 -w44456 -w44457 -w44458
CXXFLAGS = -nologo -Zm200 -Zc:wchar_t- -FS -Zc:strictStrings -D_HAS_EXCEPTIONS=0 -O2 -MD -W3 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 -wd4577
LFLAGS = /LIBPATH:. /NOLOGO /DYNAMICBASE /NXCOMPAT /DLL /MANIFEST /MANIFESTFILE:$(TARGET).manifest /SUBSYSTEM:WINDOWS /INCREMENTAL:NO
LIBS = /LIBPATH:d:\virtual_envs\py351\libs python35.lib
.SUFFIXES: .c .cpp .cc .cxx .C
{.}.cpp{}.obj::
$(CXX) -c $(CXXFLAGS) $(CPPFLAGS) -Fo @<<
$<
<<
{.}.cc{}.obj::
$(CXX) -c $(CXXFLAGS) $(CPPFLAGS) -Fo @<<
$<
<<
{.}.cxx{}.obj::
$(CXX) -c $(CXXFLAGS) $(CPPFLAGS) -Fo @<<
$<
<<
{.}.C{}.obj::
$(CXX) -c $(CXXFLAGS) $(CPPFLAGS) -Fo @<<
$<
<<
{.}.c{}.obj::
$(CC) -c $(CFLAGS) $(CPPFLAGS) -Fo @<<
$<
<<
all: $(TARGET)
$(OFILES): $(HFILES)
$(TARGET): $(OFILES)
$(LINK) $(LFLAGS) /OUT:$(TARGET) @<<
$(OFILES) $(LIBS)
<<
mt -nologo -manifest $(TARGET).manifest -outputresource:$(TARGET);2
install: $(TARGET)
@if not exist d:\virtual_envs\py351\Lib\site-packages mkdir d:\virtual_envs\py351\Lib\site-packages
copy /y $(TARGET) d:\virtual_envs\py351\Lib\site-packages\$(TARGET)
clean:
-del $(TARGET)
-del *.obj
-del *.exp
-del *.lib
-del $(TARGET).manifest
test:
python runme.py
.i.cpp:
swig -python -c++ $<
TARGET=\u example.pyd
OFILES=example.obj example\u wrap.obj
HFILES=
CC=cl
CXX=cl
链接=链接
CPPFLAGS=-DNDEBUG-DUNICODE-DWIN32-I.-Id:\virtual\u envs\py351\include
CFLAGS=-nologo-Zm200-Zc:wchar_t--FS-Zc:strictStrings-O2-MD-W3-w44456-w44457-w44458
CXXFLAGS=-nologo-Zm200-Zc:wchar_t--FS-Zc:strictStrings-D_有异常=0-O2-MD-W3-w34100-w34189-w44996-w44456-w44457-w44458-wd4577
LFLAGS=/LIBPATH:/NOLOGO/DYNAMICBASE/NXCOMPAT/DLL/MANIFEST/MANIFESTFILE:$(目标)。MANIFEST/SUBSYSTEM:WINDOWS/INCREMENTAL:NO
LIBS=/LIBPATH:d:\virtual\u envs\py351\LIBS python35.lib
.后缀:.c.cpp.cc.cxx.c
{.}.cpp{}.obj::
$(CXX)-c$(cxflags)$(CPPFLAGS)-Fo@我已经使用CMake解决了这个问题,这直接转化为使用autoconf
和automake
来生成文件
我们的想法是引入以下变量
DEPENDENCIES = `swig -M -python -c++ -I. example.i | sed 's/\//g'`
让你的目标依赖于此。上面生成了SWIG接口文件可能包含的所有标题和.i
文件的依赖项列表。从任何类型的源生成任何类型的目标,这是生成文件的本质:
TARGET = _example.pyd
OFILES = example.obj example_wrap.obj
HFILES =
CC = cl
CXX = cl
LINK = link
CPPFLAGS = -DNDEBUG -DUNICODE -DWIN32 -I. -Id:\virtual_envs\py351\include
CFLAGS = -nologo -Zm200 -Zc:wchar_t- -FS -Zc:strictStrings -O2 -MD -W3 -w44456 -w44457 -w44458
CXXFLAGS = -nologo -Zm200 -Zc:wchar_t- -FS -Zc:strictStrings -D_HAS_EXCEPTIONS=0 -O2 -MD -W3 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 -wd4577
LFLAGS = /LIBPATH:. /NOLOGO /DYNAMICBASE /NXCOMPAT /DLL /MANIFEST /MANIFESTFILE:$(TARGET).manifest /SUBSYSTEM:WINDOWS /INCREMENTAL:NO
LIBS = /LIBPATH:d:\virtual_envs\py351\libs python35.lib
.SUFFIXES: .c .cpp .cc .cxx .C
{.}.cpp{}.obj::
$(CXX) -c $(CXXFLAGS) $(CPPFLAGS) -Fo @<<
$<
<<
{.}.cc{}.obj::
$(CXX) -c $(CXXFLAGS) $(CPPFLAGS) -Fo @<<
$<
<<
{.}.cxx{}.obj::
$(CXX) -c $(CXXFLAGS) $(CPPFLAGS) -Fo @<<
$<
<<
{.}.C{}.obj::
$(CXX) -c $(CXXFLAGS) $(CPPFLAGS) -Fo @<<
$<
<<
{.}.c{}.obj::
$(CC) -c $(CFLAGS) $(CPPFLAGS) -Fo @<<
$<
<<
all: $(TARGET)
$(OFILES): $(HFILES)
$(TARGET): $(OFILES)
$(LINK) $(LFLAGS) /OUT:$(TARGET) @<<
$(OFILES) $(LIBS)
<<
mt -nologo -manifest $(TARGET).manifest -outputresource:$(TARGET);2
install: $(TARGET)
@if not exist d:\virtual_envs\py351\Lib\site-packages mkdir d:\virtual_envs\py351\Lib\site-packages
copy /y $(TARGET) d:\virtual_envs\py351\Lib\site-packages\$(TARGET)
clean:
-del $(TARGET)
-del *.obj
-del *.exp
-del *.lib
-del $(TARGET).manifest
test:
python runme.py
.i.cpp:
swig -python -c++ $<
不要仅仅依赖推理规则,而是为要生成的每个.cpp
都有一个明确的规则(顺便说一句,CMake就是这样做的)
- 这要求自动生成Makefile的相关部分。那部分可以是
!INCLUDE
'd,但是在nmake
开始处理结果之前,仍然需要外部代码来进行生成。示例代码(同样,在Python中):
导入操作系统、操作系统路径、子流程
对于os.listdir('.')中的f,如果os.path.isfile(f)和f.endswith('.i'):
打印“%s”:“%s”%%(os.path.splitext(f)[0]+'.cxx',f)
#引号允许使用特殊字符,
#看https://msdn.microsoft.com/en-us/library/956d3677.aspx
#命令是不需要的,它将从我给出的推断规则中添加
#开始时,请参见http://www.darkblue.ch/programming/Namke.pdf,第41页(567)
您的语法是一个批处理规则:在该规则中,命令只会被调用一次并提供给所有源。而我的将分别为每个源调用('cuz I dunno ifswig
可以在一次调用中处理多个文件)。请参阅以获取说明。@BPL我设法为nmake
的缺陷制定了解决办法。他们需要通过外部逻辑来运行它,但是,根据我们的判断,这正是它的设计者的想法。