ExtUtils::MM_VMS - ExtUtils::MakeMaker 中用於覆寫 UN*X 行為的方法
Do not use this directly.
Instead, use ExtUtils::MM and it will figure out which MM_*
class to use for you.
請參閱 ExtUtils::MM_Unix 以取得對此處所提供方法的文件說明。此套件覆寫這些方法的實作,而非語意。
將清單轉換為大約 80 個欄位寬的字串。
覆寫預設 MM_Unix 方法的方法標示為「(覆寫)」,而 MM_VMS 獨有的方法標示為「(特定)」。對於覆寫的方法,文件說明僅限於解釋此方法為何覆寫 MM_Unix 方法;請參閱 ExtUtils::MM_Unix 文件以取得更多詳細資料。
嘗試判斷正在建立的擴充功能名稱。我們從目前目錄的名稱開始。然而,由於 VMS 檔名不分大小寫,因此我們尋找一個其名稱與目前目錄相符的 .pm 檔(可能是這個擴充功能的「主要」.pm 檔),並嘗試尋找一個 package
陳述式,以取得 Mixed::Case 套件名稱。
使用 VMS 檔案規格語法和 CLI 指令來尋找和呼叫 Perl 映像。
用於 MM->fixin() 的輔助常式,覆寫是因為沒有實際的 shebang 行會由 shell 解釋,所以我們只預先加上 $Config{startperl} 並保留 shebang 行引數,以包含它可能有的任何開關。
遵循 VMS 可執行檔案的命名慣例。如果傳入的名稱與可執行檔案不完全相符,則附加 .Exe(或等效名稱)以檢查可執行映像,並附加 .Com 以檢查 DCL 程序。如果這失敗了,則會在 DCL$PATH 中檢查目錄,最後在 Sys$System: 中檢查一個具有指定名稱的可執行檔案,無論是否具有 .Exe 等效字尾。
必須使用 /MACRO 限定詞指定要傳遞的巨集定義清單,且不得再新增另一個 /DEFINE 限定詞。我們在此將自己的逗號預先加上 $(PASTHRU_DEFINE) 的內容,因為它通常是空的,而 CCFLAGS 中總是存在的逗號會產生遺失限定詞值錯誤。
VMS 希望每個檔案都有點,所以我們不能有一個稱為「pm_to_blib」的檔案,它會變成「pm_to_blib.」而且 MMS/K 不夠聰明,無法知道當您有一個稱為「pm_to_blib」的目標時,它應該尋找「pm_to_blib.」。
因此在 VMS 中,它是 pm_to_blib.ts。
如果傳入的名稱未指定可讀取的檔案,則附加 .com 或 .pl 並重試,因為 VMS 下的所有檔案通常都有檔案類型。
使用 VMS 語法檔案名稱中合法的字元作為分隔符號。
(覆寫) 由於串接 VMS 檔案路徑的困難,我們必須預先展開 DEST* 變數。
VMS 上目錄路徑與檔案名稱之間沒有分隔符號。
提供各種實用程式指令的 VMS 特定形式。
將 DEV_NULL 設為空值,因為我不知道如何在 VMS 上執行此操作。
變更 EQUALIZE_TIMESTAMP,將目標檔案的修訂日期設為比來源檔案晚一秒,因為 MMK 會將來源檔案和目標檔案的修訂日期完全相等,視為目標需要更新的標誌。
新增 PERL_VMS、MM_VMS_REVISION 和 MM_VMS_VERSION。
MM_VMS_REVISION 用於在 MM_VMS 具有 $VERSION 之前的向後相容性。
使用 VMS 語意覆寫 *DEFINE_VERSION 巨集。將 MAKEMAKER 檔案路徑轉換為 VMS 樣式。
修正許多檔案和目錄巨集,以確保 VMS 語法,無論輸入語法為何。還會將檔案清單以逗號分隔。
清除預設的 .SUFFIXES 並放入我們自己的清單。
繞過 shell 腳本並直接為 CC 產生限定詞 (但如果此副檔名有 shell 腳本,則會警告使用者)。將多個 /Defines 折疊成一個,因為某些 C 編譯器只會注意命令列上此限定詞的一個執行個體。
在處理 #include <sys/foo.h> 指令時,新增指令將 C 預處理器指向正確的位置。此外,建構 CC 命令列的方式也與 MM_Unix 方法略有不同。
為 Makefile 引數加入一些可疑的額外巨集。
此外,保留舊的 $(SAY) 巨集,以防有人使用它。
某些值的 VMSish 預設值。
macro description default
ZIPFLAGS flags to pass to ZIP -Vu
COMPRESS compression command to gzip
use for tarfiles
SUFFIX suffix to put on -gz
compressed files
SHAR shar command to use vms_share
DIST_DEFAULT default target to use to tardist
create a distribution
DISTVNAME Use VERSION_SYM instead of $(DISTNAME)-$(VERSION_SYM)
VERSION for the name
在命令列上使用 VMS 語法。特別是,$(DEFINE) 和 $(PERL_INC) 已拉入 $(CCCMD)。此外,使用 MM[SK] 巨集。
使用 MM[SK] 巨集。
使用 MM[SK] 巨集,以及 C 編譯器的 VMS 命令列。
由於必須同時考量一個限定詞及其所有子限定詞,因此沒有簡單的替換方式,所以我們使用自己的公用程式例程進行替換。
將擴充功能規格轉換為 Unix 格式,因為這會與 XSBUILD 資料結構中的內容相符。
建立 VMS 連結器選項檔案,指定此擴充功能的可分享映像的通用符號,並列出其他應連結的可分享映像或函式庫。
覆寫以修正 -o 旗標。
使用 VMS 連結指令。
使用 VMS 指令操作物件函式庫。
使用 VMS 指令操作物件函式庫。
清除一些特定於作業系統的檔案。加上用於縮短許多指令的暫存檔。以及名稱混淆資料庫。
呼叫 shar、tar 和 zip 的語法與 Unix 不同。
多次解決 DCL 的 255 字元限制,並在一些情況下使用 VMS 風格的命令列引號。
使用 VMS 風格的語法表示檔案;直接在此執行比讓 MM_Unix 方法重複呼叫 catfile
更省事。此外,如果我們必須重建 Config.pm,請使用 MM[SK] 執行。
承諾使用 VMS 指令建立一組新的 Perl 映像。由於 VMS 進行動態載入,因此不需要將每個擴充功能靜態連結到 Perl 映像,所以這不是正常的建置路徑。因此,它尚未經過實際測試,而且很可能不完整。
確保標記目標的冒號前面有空格,以區分目標分隔符號和作為檔案規格一部分出現的冒號。
在 VMS 上加上字首很簡單。每個都應該是
perl_root:[some.dir]
可以轉換成
volume:[your.prefix.some.dir]
否則,您會得到預設配置。
實際上,您的搜尋字首會被忽略,而使用 $Config{vms_prefix} 取代。
perl 會在 "<foo>" 上出錯,認為它是輸入重新導向。因此,我們改用本機 Write 指令。此外,它的速度更快。
加上引號,不要跳脫。
加上引號,不要跳脫。
256 個字元。
消除 MMS/MMK 檔案輸出的巨集。
(File::Spec::VMS 過去會為我們執行此動作,但它已移除)
使用 %$self
的相同命名元素的內容,在文字字串中擴充 MM[KS]/Make 巨集,並以 Unix 語法傳回結果作為檔案規格。
注意:這是此方法的正規版本。File::Spec::VMS 中的版本已棄用。
my $path = $mm->fixpath($path);
my $path = $mm->fixpath($path, $is_dir);
萬用例程,用於清除問題 MM[SK]/Make 巨集。擴充任何目錄規格中的巨集,以避免在執行 MM[SK] 時並置兩個 VMS 語法目錄。同時擴充所有巨集的表達式,以便我們可以知道擴充的長度,並避免在執行 MM[KS] 時超出 DCL 的命令緩衝區。
fixpath() 檢查結果是否符合目前預設目錄中的目錄名稱,並相應傳回目錄或檔案規格。$is_dir
可設定為 true 強制 fixpath() 將路徑視為目錄,或設定為 false 強制視為檔案。
注意:這是此方法的正規版本。File::Spec::VMS 中的版本已棄用。
VMS 是 VMS。
VMS 上沒有任何正在檢查的 make 類型可行,加上我們的 $self->{MAKE} 是未展開(且無法展開)的巨集,其值只有 make 工具程式本身知道。
傳回描述正在編寫的 makefile 類型的合適字串。
原始作者 Charles Bailey bailey@newman.upenn.edu
由 Michael G Schwern 維護 schwern@pobox.com
有關修補程式和聯絡資訊,請參閱 ExtUtils::MakeMaker。