2015-09-23 53 views
0

我一直有看在PHP-SRC項目,我在讀了簡短的開發指南:http://php.net/build-setup.php測試你在大型的C代碼項目

不過是相對較新的C(但對於編程來說並不陌生),我覺得每次需要測試更改時都需要重新編譯纔會感到吃驚。

使用PHP編寫代碼時,我可以通過一個小代碼段來查看x == y是否在某個執行點,並幾乎立即進行測試。但在我開始像PHP這樣大的項目中開始潛水之前,我想知道是否我錯了,因爲我需要構建整個源代碼以測試小的更改。

在構建過程中是否存在一個階段,即可以將小的更改編譯到現有的二進制文件中而無需每次等待10-20分鐘?

+0

這真的取決於你在做什麼。如果您正在使用PHP擴展,您可以通過運行'phpize && ./configure --enable-extname && make && make install'來構建擴展(通常不會超過1〜2分鐘)。此外,'make'確實記錄了它應該重新編譯的對象,以及自編譯完代碼後哪些對象保持不變。另外:檢查'x == y'是不是通過在C中添加代碼來做的事情,你可以通過使用調試器(如gdb)來實現這一點 –

+0

@EliasVanOotegem我已經給它一個嘗試,它的核心php- src我正在調查。按照說明,構建過程相對簡單。即使在'zend.h'中添加了一些任意代碼,儘管運行'make'沒有做任何事情,運行'./configure;做'確實,而且非常快。這是編譯增量更改的正確過程嗎? – Flosculus

+0

運行'./configure; make'看起來有點奇怪(當然,它不是'./configure && make'?),請檢查'./configure --help',並且實際檢查所有需要傳遞給'configure'的參數(比如編譯的擴展和你想要啓用哪些功能等)。然後再次運行'make' –

回答

1

我認爲make就是你需要的。
https://www.gnu.org/software/make/
和文件建立在
http://www.gnu.org/software/make/manual/make.html
所以你有很多大的源文件,你在其中只是一個做了小改動,令只會重新編譯源文件,因爲其他的都是最新的。
早在我建了一個迷你「殼」的時候,這裏是生成文件:

CFLAGS=-g -O2 -Werror -Wfatal-errors 
OBJECTS=parser.o analyser.o processing.o prompt.o 
LINK=-lfl 
shell: $(OBJECTS) 
     gcc $(CFLAGS) $(OBJECTS) $(LINK) -o shell 
parser.o: shell.y 
     bison -d shell.y 
     gcc $(CFLAGS) -c shell.tab.c -o parser.o 
analyser.o: shell.l 
     flex shell.l 
     gcc $(CFLAGS) -c lex.yy.c -o analyser.o 
processing.o:processing.c processing.h 
     gcc $(CFLAGS) -c processing.c -o processing.o 
prompt.o: prompt.c prompt.h 
     gcc $(CFLAGS) -c prompt.c -o prompt.o 
clean: 
     rm -f $(OBJECTS) shell.tab.c lex.yy.c shell.tab.h 

所以如果我在processing.c的改變,使只有重建processing.o,然後再重新鏈接項目。
所以make文件包含的規則:

 
> target : prerequisite
recipe

使需求前提使用的配方來構建目標。
最後,如果你想刪除目標文件,你可以添加一個「乾淨」的規則,然後運行:

make clean 
+0

這並不回答_at all_。 PHP已經使用make作爲其構建過程的一部分,[檢查src](https://github.com/php/php-src)。 OP想知道是否有一種替代方案可以在他改變某個東西時重建整個項目,並且想知道它是否按預期工作。此外:OP鏈接到構建設置頁面,***明確指出你需要autotools(其中包括automake + autoconf)來構建PHP –

+0

它看起來不錯,我知道php-src已經有了「make」但很高興知道它執行部分編譯。如果我要求php-src的典型構建過程,我認爲這不是一個太具體的問題,因爲它是一個非常常見的域。如果可以修改這個答案來詳細說明開發和測試該項目的步驟,我將不勝感激,它不需要過於膨脹,我總是可以填補空白。 – Flosculus