2016-10-03 53 views
4

鑑於下面生成文件: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 -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 

我想在這裏提高一兩件事情:

  • 我想考慮痛飲文件(*。我)在makefile。例如,每次更改一個swig文件時都應該生成一個新的wrap文件(即:swig -python -C++ file_has_changed.cpp),然後重建項目
  • 我想避免使用硬編碼的目標文件。舉例來說,我想使用通配符莫名其妙

我讀過的文檔的談論Makefiles一點點,但我仍然非常困惑使用所有cpp文件。我怎麼能做到這一點?

現在我使用的是哈克解決方案一樣swig -python -c++ whatever_file.i && nmake,這當然是不理想,在所有

參考

實現這裏面的Visual Studio IDE是很容易以下these steps但我喜歡在SublimeText中使用這個makefile,這就是爲什麼我對知道如何擁有一個合適的Makefile非常感興趣

回答

3

生產任何種類源的任何類型的目標,這是一個生成文件的本質:

.i.cpp: 
    swig -python -c++ $< 

這高貴的氣質,然而,中斷與nmakeas opposed to GNU make)如果.cpp文件丟失,因爲nmake doesn't try to chain inference rules through a missing link
此外,它會默默地打破,並從構建鏈(其中包括生成的可執行文件)的後續文件的陳舊版本(如果它們存在)「構建」。

可能這裏組裝機變通方法(除開溝nmake,當然)是:

  • 調用nmake多次時,首先,以產生是之間的中間步驟中的所有文件的兩個inference rules(可如果它們彼此產生,則又需要多個調用),然後用於最終目標

    • 這需要一個外部al腳本很可能是另一個makefile。例如。: 當前Makefile用命令移動到main_makefile並創建一個新Makefile像這樣的主要目標:

      python -c "import os,os.path,subprocess; 
            subprocess.check_call(['nmake', '/F', 'main_makefile'] 
             +[os.path.splitext(f)[0]+'.cpp' 
             for f in os.listdir('.') if os.path.isfile(f) 
                    and f.endswith('.i')])" 
      nmake /F main_makefile 
      
  • 不完全依賴於推理規則,但有一個明確的規則對每個.cpp是(這就是CMake做的btw)

    • 這要求Makefile的相關部分被自動生成。該部分可以是!INCLUDE'd,但仍然需要外部代碼才能在nmake開始處理結果之前進行生成。示例代碼(再次,在Python):

      import os,os.path,subprocess 
      for f in os.listdir('.') if os.path.isfile(f) and f.endswith('.i'): 
          print '"%s": "%s"'%(os.path.splitext(f)[0]+'.cxx',f) 
          #quotes are to allow for special characters, 
          # see https://msdn.microsoft.com/en-us/library/956d3677.aspx 
          #command is not needed, it will be added from the inferred rule I gave 
          # in the beginning, see http://www.darkblue.ch/programming/Namke.pdf, p.41 (567) 
      
+0

你的語法是一個批次的規則:在裏面,一個命令將只調用一次並供給所有的源。雖然我會分別爲每個源調用('cuz我不​​知道如果'swig'可以在一次調用中處理多個文件)。有關說明,請參見[批處理模式規則 - MSDN](https://msdn.microsoft.com/zh-cn/library/f2x0zs74.aspx)。 –

+0

@BPL我設法爲'nmake'的缺陷制定瞭解決方法。他們需要通過外部邏輯來運行它,但是,根據http://stackoverflow.com/questions/4808674/nmake-inference-rules-limited-to-depth-of-1/5048633#5048633來判斷,它正是它的設計者所擁有的心裏。 –

1

我已經使用CMake解決了這個問題,這直接轉化爲使用autoconfautomake,從而makefile。

的想法是下面要介紹的變量

DEPENDENCIES = `swig -M -python -c++ -I. example.i | sed 's/\//g'` 

,讓你的目標取決於此。以上生成了您的SWIG接口文件可能包含的所有標題和.i文件的依賴關係列表。