歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux服務器

使用scons軟件構建工具

scons 是一個比較有意思的軟件構建工具,其本意是想替代著名的autotools系列,我沒有用過autotools,不過看到網上的 autotools使用教程就頭暈,後來聽說了scons,就仔細下載了它的文檔看了一下,覺得很符合我的口味。scons與autotools和 cmake等工具不同的是,它並不是從一個類似工程配置的文件中生成Makefile,再調用make進行編譯,而是直接控制編譯器,從這個意義上來說, 它其實並不是替代autotools,而是make!下面是一個簡單的例子,如果你想編譯著名的hello.c文件:

    #include <stdio.h>
 
int main(){
    printf("hello,world\n");
    return 0;
}


    只需在hello.c的當前目錄下建立一個叫SConstruct的文件:

     Program('hello,'hello.c')


    然後運行scons就可以了,scons會自動調用gcc(不是make)來編譯生成可執行程序hello。如果hello.c中引用了foo.h這個頭文件,而foo.h聲明的函數定義在foo.c,則SConstrut可以寫成:

     Program('hello',['hello.c','foo.c'])


    Program的第一個參數是目標,後面可以是單個源文件名或源文件名數組。注意,scons是很智能的,它知道hello.c依賴於 foo.h,所以當foo.h發生改變時,就會重新編譯hello.c。這個依賴關系不需要我們額外寫代碼。如果源文件太多了,全寫在那個數組裡太長了, 而源文件都是在同一個目錄以.c為後辍時,我們可以簡寫如下:

     Program('hello',Glob("*.c"))


    如果程序引入了其它的庫,庫名為libbar.a,庫的目錄為/usr/local/lib:

     Program('hello',Glob("*.c"),LIBS='bar',LIBPATH='/usr/local/lib')


    如果使用了pkg-config來管理庫,可以用環境(Enviroment)如下,例如我使用了GTK+ 2.0:

     env=Enviroment()

env.ParseConfig("pkg-config --libs --cflags gtk+-2.0")

env.Program('hello',Glob("*.c"))
 


    scons除了可以編譯C/C++程序以外,它還可以編譯LaTeX,如

   DVI('paper.dvi','paper.tex')


    就可以用latex命令來編譯paper.dvi文件,scons還可以編譯Java等其它類型的程序,具體內容見scons的官方文檔。
    scons本身有一些設計得很好的地方,SConstruct的本身是一個合法的Python程序,它並沒有像c,make那樣使用自有的配置文件格式, 可以使用所有Python的實用庫來完成更高級的運用。還有它判斷文件更改是默認情況下不是根據時間戳,而是MD5碼!所以上面foo.h被touch 了,並不會導致重新編譯。scons的缺點是其效率太低,速度太慢

Copyright © Linux教程網 All Rights Reserved