bmake的優點
回答
我不使用它,但我的理解是,BSD作是一款make程序+的模板的標準庫(即或多或少GNU相當於使+ automake和可能autoconf的)。
無論何時將GNU工具與BSD實用程序進行比較時,請記住,大多數進行比較的人將許可視爲一種功能或本身的錯誤 - 而且比較一半的開發人員贊成寬鬆許可,一半贊成類似GPL的病毒許可證。這並不是說沒有真正的差異(有時候有,但通常是洗滌)。 bmake不像GNU make那樣臃腫,並且都與大多數手寫makefile兼容(如果使用autotools生成makefile,autotools能夠生成兼容其中一個或兩個兼容的makefile)。
對於bmake來說,唯一明顯的好處就是我可以告訴的是,使用它會讓那些對病毒感到害怕GPL的人們歡呼。但是,bmake的作者聲稱這是嘗試修補pmake(正常的BSD make)接受autotools輸出的結果。鑑於我試圖讓它理解autotools生成的makefile的麻煩,我懷疑這是多麼成功。其他人提出其他要求,其中一些沒有意義。最後,如果你堅持使用makefiles的標準元素,並且不要偏離POSIX太遠,那麼使用哪個應該不會太重要。
BSD make可以基於條件或循環內部生成目標。這有時非常方便。
BSD make和GNU make都是原版AT & T的免費替換品。主要區別在於高級功能的語法不同。下面是如何把一個shell命令的輸出變量在BSD化妝:
# BSD make
TODAY != date +%Y-%m-%d
而且在GNU做:
# GNU make
TODAY = $(shell date +%Y-%m-%d)
只要有人在Makefile中寫道:$(shell ...)
,它requries GNU使。由於語法不同,一些軟件包需要GNU make來構建,有些需要BSD make。
BSD製作開始其作爲PMake,簡稱爲並行製作。其作者Adam de Boor在文中描述了PMake PMake -- A Tutorial。它的優點是能夠並行運行作業的新功能,如make -j 3
。這種並行模式通過在單個shell中爲每個目標運行所有命令而不是在每行中的一個shell中打破了兼容性。 GNU make有一個並行模式,也是-j
,每行保留一個shell。 NetBSD make(1)現在有make -B -j 3
以每行一個外殼執行並行模式。 OpenBSD make(1)現在總是以每行一個外殼進行並行模式。
4.3BSD-Reno包含PMake爲make
和bsd。*。mk包含文件。這些包含文件是BSD製作的最佳功能。src/bin/sed/Makefile in 4.3BSD-Tahoe(4.3BSD-Reno之前的版本)定義了幾個目標,比如clean,depend,install等等。 src/usr.bin/sed/Makefile in 4.3BSD-Reno只有四個非空行:
# @(#)Makefile 4.6 (Berkeley) 5/11/90
PROG= sed
SRCS= sed0.c sed1.c
.include <bsd.prog.mk>
這裏bsd.prog.mk自動設置OBJS
到sed0.o sed1.o
,定義了一個sed目標鏈路從這些對象的sed,定義一樣乾淨的其他目標,取決於安裝,並導致make install
安裝sed及其手冊頁sed.1。建築圖書館也有bsd.lib.mk。
當使用bsd。*。mk時,每個Makefile只能構建一個程序或庫。要構建另一個,在另一個目錄中必須有第二個Makefile。所以src/usr.sbin/smtpd/ in OpenBSD有六個子目錄,其中每個子目錄只包含一個Makefile,因爲smtpd構建了六個程序。
使用bsd。*。mk構建除BSD本身之外的任何東西也很少見。許多來自BSD開發人員的可移植包,如OpenSSH(來自OpenBSD)或mksh(來自MirBSD),不需要BSD make,也不使用bsd。*。mk文件。
文件bsd.port.mk位於爲FreeBSD構建軟件包的系統FreeBSD Ports的中心。 (NetBSD pkgsrc稱此文件爲bsd.pkg.mk。)該系統在其他腳本語言中有競爭對手。家釀使用Ruby。 MacPorts使用Tcl。
在過去,GNU make比BSD make更具可移植性。因爲BSD是BSD的一部分,所以很難在其他系統上找到BSD。其他系統現在有portable bmake。這是NetBSD的可移植版本。便攜式bmake最常見的用途是在非NetBSD系統上運行pkgsrc。我在OS X上運行pkgsrc,bmake由pkgsrc引導。
我正在寫BSD Owl,一個基於BSD Make的可移植構建系統。我在2000年開始使用GNU Make編寫Makefiles,並迅速切換到BSD Make。讓我概述指導我選擇的原因。
文檔和可用文獻
這是主要觀點,真的。儘管GNU項目爲自由軟件世界提供了一個非常棒的重要軟件,但文檔並沒有清楚區分user manual and reference manual,這是GNU文檔的一貫特徵。因此,GNU Make文檔是一個huge(超過200頁)的文檔,用玩具實例交織了系統各個方面的細節描述。當我使用它時,我從未發現這些示例有用,因爲它們遠不及實際使用情況,並且總是需要幾分鐘來查找或重新定位我必須查找的信息。可用於GNU Make的文獻語料庫非常龐大,但是很難找到有趣的例子來指導自己編寫一個全面的便攜式構建系統,如BSD Owl。也許是因爲項目依賴automake而不是直接編寫Makefiles。也許是因爲我沒有足夠努力。
在FreeBSD方面,事情的狀態是好得多。的確,
- 有一個規範教程或用戶手冊Adam de Boor。
- manual page可作爲參考手冊,遠低於30頁。
- FreeBSD構建系統和FreeBSD ports系統是一個手寫makefile文件。
當然,BSD Make的手冊頁並不像GNU Make的手冊那樣詳細,但它更密集且更易於使用。 FreeBSD構建系統同時(a)BSD Make可以編排大型複雜項目的構建,以及(b)Makefile編寫藝術中的高級技術展示。
編程功能
一個非常有趣的是,GNU的編程功能使似乎比什麼的BSDmake提供更強大。儘管如此,我發現它們非常難以使用,主要是因爲擴展順序,以及缺乏有用的例子。 BSD Make具有更少的構造和功能,但它們非常穩固且易於使用:我需要編寫的大部分代碼都是條件語句和for循環來定義目標列表,而BSD Make可以非常輕鬆可靠地進行操作。
高級功能
BSD製作具有先進的功能,GNU讓沒有 - 因爲據我所知 - 這就是所謂的元模式。編寫Makefiles最困難的部分是在包中正確指定先決條件列表。某些軟件如mkdep(1)
會嘗試通過分析源自動執行該過程。 BSD Make採取了一種不同的方法:我們編寫一個Makefile文件,其中可能包含錯誤(不完整)的依賴關係,但足夠精確,可以成功構建包。在此過程中,BSD Make使用filemon(4)
監視I/O來確定實際的先決條件列表。
- 1. bmake上的警告
- 2. Axis2優於WCF的優點和缺點
- 3. MVC3優於MVC2的優點
- 4. sqlcipher的優點
- 5. PAE的優點
- 6. Thread.ResetAbort的優點
- 7. Spring的優點
- 8. 優點
- 9. Three20的優點和缺點
- 10. smartGWT的缺點和優點
- 11. N2CMS的優點和缺點
- 12. SOAP Pooling的優點/缺點
- 13. Telnet和SSH優點和去優點
- 14. StyleCop,優點/缺點
- 15. Haskell desugaring的優點?
- 16. CouchDB的優缺點
- 17. 優點?ActionScript 3的
- 18. XCODE4的優缺點?
- 19. CodeSmith的優缺點
- 20. Altova MapForce的優點
- 21. Phonegap的優缺點
- 22. cakePHP CLI的優點?
- 23. BPMN的優缺點?
- 24. 綁定的優點?
- 25. x64的優點CLR
- 26. READ_COMMITTED_SNAPSHOT的優缺點
- 27. MongoDB的優缺點?
- 28. Sitecore:Sitecore.Web.WebUtil.Redirect優於Response.Redirect的優點是什麼?
- 29. 格式優於連接的優點
- 30. 可編程序優於JSON的優點
gmake 4.x增加了對'!='語法的支持。 – 2016-05-31 23:41:50