![]() |
假設您正在編寫一個產生 C++ 程式碼的應用程式。如果您曾經這樣做過,您就會知道這並不容易。將大量的 C++ 程式碼嵌入字串字面值中非常笨拙。一個更好的解決方案是
這很容易實現。您可以編寫特殊的逐字檔案,這些檔案就是 C++ 程式碼,除了檔案的第一行包含要產生的變數名稱。建立一個簡單的工具,它接受一個逐字檔案,並建立一個 cpp 檔案,其中包含一個 char*
變數,其名稱取自逐字檔案的第一行,其值是檔案的正確引用內容。
讓我們看看 Boost.Build 可以做些什麼。
首先,Boost.Build 並不知道「逐字檔案」是什麼。因此,您必須註冊一個新的目標類型。以下程式碼可以做到這一點
import type ; type.register VERBATIM : verbatim ;
type.register 的第一個參數指定了聲明類型的名稱。按照慣例,它是大寫的。第二個參數是此類型檔案的後綴。因此,如果 Boost.Build 在來源列表中看到 code.verbatim
,它就知道它是 VERBATIM
類型。
接下來,您告訴 Boost.Build 可以在一個建置步驟中將逐字檔案轉換為 C++ 檔案。《產生器》是一個建置步驟的範本,它將一種類型(或一組類型)的目標轉換為另一種類型。我們的產生器將被稱為 verbatim.inline-file
;它將 VERBATIM
檔案轉換為 CPP
檔案。
import generators ; generators.register-standard verbatim.inline-file : VERBATIM : CPP ;
最後,您必須告知 Boost.Build 進行此轉換所使用的 shell 命令。這是通過 actions
聲明完成的。
actions inline-file { "./inline-file.py" $(<) $(>) }
現在,我們準備好將所有內容整合在一起。將以上所有程式碼放入檔案 verbatim.jam
中,將 import verbatim ;
新增到 Jamroot.jam
中,就可以在您的 Jamfile 中編寫以下內容
exe codegen : codegen.cpp class_template.verbatim usage.verbatim ;
列出的逐字檔案將自動轉換為 C++ 原始碼檔案,編譯後再連結到 codegen 可執行檔。
在後續章節中,我們將擴展此範例,並詳細回顧所有機制。完整的程式碼可在 example/customization
目錄中找到。