SCons 輕鬆建造程式

2021-06-01 11:28:02 字數 4808 閱讀 5328

前言

make 這個工具自上個世紀 70 年代 stuart feldman 在貝爾實驗室開發出以來,就一直是類 unix 程式設計師的最愛之一。通過檢查檔案的修改時間,make 工具可以知道編譯目標檔案所要依賴的其他檔案。在複雜的專案中,如果只有少數幾個檔案修改過,make 工具知道僅僅需要對哪些檔案重新編譯就可以確保目標程式被正確的編譯鏈結。這樣做的好處就是在編譯中,不僅可以節省大量的重複輸入,還可以確保程式可以被正確的鏈結,縮短編譯的時間。雖然如此,但是為 make 工具編寫建造規則卻不是一件容易的事。它複雜的配置規則,即使是有經驗的開發者也望而生畏。make 工具的許多替代品便因此而誕生,scons 就是是其中之一。scons 是乙個用 python 語言編寫的類似於 make 工具的程式。與 make 工具相比較,scons 的配置檔案更加簡單清晰明了,除此之外,它還有許多的優點。

scons 簡介

scons 是乙個開放源**、以 python 語言編寫的下一代的程式建造工具。它最初的名字是 sccons, 基於由 perl 語言編寫的 cons 軟體開發而成,它在 2000 年 8 月獲得了由 software carpentry 舉辦的 sc 建造比賽的大獎。現在 sccons 已經被改名為 scons,目的是為了表示不再與 software carpentry 有聯絡,當然,還有乙個目的,就是為了更方便的輸入。

安裝 scons

$ tar -zxf scons-2.0.1.tar.gz

然後切換進入解壓後的目錄進行安裝,如

$ cd scons-2.0.1 

$ sudo python setup.py install

命令執行如果沒有錯誤,那麼 scons 就被安裝到系統上了。對於 linux 來說,scons 會預設安裝到 /usr/loca/bin 目錄下,而在 windows 平台上,則會被安裝到 c:\python25\scripts 下。

使用 scons

在 scons 安裝完成後,我們就可以使用 scons 來建造我們的程式或者專案了。像很多程式設計書籍那樣,在這裡我們也通過乙個簡單的 helloscons 例子來說明如何使用 scons。例子 helloscons 包含兩個檔案 :

$ ls helloscons 

helloscons.c sconstruct

其中 helloscons.c 是程式的原始檔,sconstruct 是 scons 的配置檔案,類似使用 make 工具時的 makefile 檔案,因此,為了編譯你的專案,需要手工建立乙個 sconstruct 檔案(注意:檔名是大小寫敏感的)。不過,在編譯的時候不需要指定它。要編譯這個例子,切換到 helloscons 的目錄下,執行 scons 命令,如下:

$ cd helloscons/ 

$ scons

scons: reading sconscript files ...

scons: done reading sconscript files.

scons: building targets ...

gcc -o helloscons.o -c helloscons.c

gcc -o helloscons helloscons.o

scons: done building targets.

來檢視一下執行 scons 命令後得到的結果 :

$ ls 

helloscons helloscons.c helloscons.o sconstruct

建造結束後,得到了二進位制檔案 helloscons 以及編譯的過程中產生的一些以 .o 結尾的目標檔案。試執行 helloscons 一下 , 會得到 :

$ ./helloscons 

hello, scons!

現在讓我們回過頭來解析一下 helloscons 這個例子 . helloscons.c 是這個例子裡的唯一乙個源**檔案,它所做的事就是在控制台上輸出一行簡單的"hello,scons", 它的源**如下:

清單 1. helloscons.c

#include #include int main(int argc, char* argv) 

作為專案建造規則的配置檔案 sconstruct 的內容如下 :

清單 2. sconstruct 檔案

program('helloscons.c')

你可能很驚訝 sconstruct 的內容只有一行,然而事實確實如此,它比傳統的 makefile 簡單很多。sconstruct 以 python 指令碼的語法編寫,你可以像編寫 python 指令碼一樣來編寫它。其中的 program 是編譯的型別,說明你準備想要建造乙個可執行的二進位制程式,它由 helloscons.c 檔案來生成。在這裡,沒有指定生成的可執行程式的名字。不過不用擔心,scons 會把源**檔案名字的字尾去掉,用來作為可執行檔案的名字。在這裡,我們甚至不需要像 makefile 那樣指定清理的動作,就可以執行清理任務。在 scons 中,執行清理任務由引數 -c 指定,如下 :

$ scons -c 

scons: reading sconscript files ...

scons: done reading sconscript files.

scons: cleaning targets ...

removed helloscons.o

removed helloscons

scons: done cleaning targets.

$ ls

helloscons.c sconstruct

如果你不想直接編譯可執行的二進位制檔案,那也沒有關係。scons 支援多種編譯型別,你可以根據自己的需要,任意選用其中的一種。scons 支援的編譯型別有:

program('myscons, 'helloscons.c')

其中 myscons 就是你想要的可執行檔案的名字,你可以把它換成任意你喜歡的名字,不過有點注意的是,這個名字必須放在第一位。然後在 helloscons 目錄下執行 scons 命令,就會得到 myscons 這個可執行檔案,如下:

$ scons -q 

gcc -o helloscons.o -c helloscons.c

gcc -o myscons helloscons.o

其中的 -q 引數是減少編譯時的由 scons 產生的冗餘資訊。如果你的專案由多個原始檔組成,而且你想指定一些編譯的巨集定義,以及顯式的指定使用某些庫,這些對於 scons 來說,都是非常簡單的事情。我們的另外乙個例子 helloscons2 很好的說明這種情況。 helloscons2 由 3 個原始檔組成 , 它們是 helloscon2.c, file1.c, file2.c,另外指定了編譯的選項,同時還指定了使用哪些具體的庫。讓我們來看一下 helloscons2 的 sconstruct 檔案 :

program('helloscons2', ['helloscons2.c', 'file1.c', 'file2.c'], 

libs = 'm',

libpath = ['/usr/lib', '/usr/local/lib'],

ccflags = '-dhelloscons')

正如你想像的那樣,這樣乙個配置檔案並不複雜 . 該 sconstruct 檔案指出,它將生成乙個名叫 helloscons2 的可執行程式,該可執行程式由 helloscons2.c, file1.c 和 file2.c 組成。注意,多個原始檔需要放在乙個 python 列表中。如果你的源程式**檔案很多,有十幾個甚至上百個,那不要乙個個的將他們都列出來,你可以使用 glob('*.c') 來代替源**列表。如下 :

program('helloscons2', glob('*.c')

配置檔案中 libs,libapth 和 ccflags 是 scons 內建的關鍵字,它們的作用如下:

ccflags: 編譯選項,可以指定需要的任意編譯選項,如果有多個選項,應該放在乙個列表中。這個例子裡,編譯選項是通過 -d 這個 gcc 的選項定義了乙個巨集 helloscons。

執行 scons 命令的時候,可以看到這些變數如何被使用的,讓我們執行一下 scons 命令 :

$ scons -q 

gcc -o file1.o -c -dhelloscons file1.c

gcc -o file2.o -c -dhelloscons file2.c

gcc -o helloscons2.o -c -dhelloscons helloscons2.c

gcc -o helloscons2 helloscons2.o file1.o file2.o -l/usr/lib -l/usr/local/lib -lm

scons 命令的輸出顯示了可執行程式 helloscons2 如何由多個原始檔而生成,以及在 sconstruct 中定義的 libs,libpath 和 ccflags 如何被使用。可見,即使對於複雜的專案,scons 的編譯配置檔案也很簡單。除此之外,scons 也提供了很多功能以適應不同的需要,如果讀者想更深入的了解如何使用 scons,可以參考 scons 的幫助手冊。 總結

本文簡單介紹了 scons 的特點,如何安裝 scons,以及通過例子來說明如何在專案中使用 scons。作為下一代的軟體建造工具,scons 使用 python 語言作為配置檔案,不但功能強大,而且簡單易用,對於跨平台的專案,非常適合。如果你厭煩了 make 工具的那種複雜的編寫規則,嘗試一下新鮮的 scons 吧。

使用 SCons 輕鬆建造程式

make 這個工具自上個世紀 70 年代 stuart feldman 在貝爾實驗室開發出以來,就一直是類 unix 程式設計師的最愛之一。通過檢查檔案的修改時間,make 工具可以知道編譯目標檔案所要依賴的其他檔案。在複雜的專案中,如果只有少數幾個檔案修改過,make 工具知道僅僅需要對哪些檔案重...

Release下輕鬆除錯程式。

在開發過程中經常會碰到一寫莫名其妙的情況發生,比如明明在debug下編譯執行一切正常,但是在release下編譯執行總是會出錯。這個時候多希望release下可以除錯程式啊。之前我一直以為這是不可能,後來才發現,微軟的vs工具為我們提供了這樣乙個功能,平時大家可能沒有注意到。我們只需要做一些簡單的設...

輕鬆掌握小程式開發技巧 微信小程式奈米學位課程上線

techweb報道 3月28日訊息,在今年1月的微信公開課pro上,微信曬出了小程式上線一年以來的成績單。從官方給出的資料來看,目前小程式數量已超過58萬,後台開發工具的使用人數超100萬,接入第三方企業數量2300余家,使用者數達1.7億,三四線城市使用者規模達50 小程式的出現帶來了zeiqqc...