ExtUtils::MM_Unix - ExtUtils::MakeMaker 使用的方法
require ExtUtils::MM_Unix;
此套件提供的方法設計為與 ExtUtils::MakeMaker 結合使用。當 MakeMaker 寫入 Makefile 時,它會建立一個或多個物件,這些物件會繼承 MM 套件的方法。MM 本身不提供任何方法,但它繼承 ExtUtils::MM_Unix 類別。MM 的繼承樹讓特定作業系統的套件可以負責 MM_Unix 提供的所有方法。我們試著透過在 ExtUtils::MM_Unix 中定義相當原始的操作來減少必要的覆寫數量。
如果您要撰寫特定於平台的 MM 套件,請嘗試將必要的覆寫限制為原始方法,如果無法這麼做,讓我們找出如何達成此目標。
如果您在 Makefile.PL(在 MY 類別中)中覆寫任何這些方法,請向 makemaker 郵件清單報告。我們正嘗試將必要的覆寫方法減至最少,並在可能的情況下切換到資料驅動的 Makefile.PL。從長遠來看,較少的方法將可透過 MY 類別覆寫。
以下方法說明仍處於開發階段。請參閱未適當記錄部分的程式碼,並向 makemaker@perl.org 郵件清單大聲抱怨。更好的是,提供一個修補程式。
以下並非所有方法都可以在 Makefile.PL 中覆寫。可覆寫的方法標示為 (o)。所有方法都可由特定於平台的 MM_*.pm 檔案覆寫。
跨平台方法正在移至 MM_Any。如果您找不到以前在此處的內容,請在 MM_Any 中尋找。
僅表示我們是 Unix。
定義將不同風味的 C 檔案編譯為物件檔案的附檔字規則。
將物件檔案作為引數,並傳回將輸出至指定物件檔案的編譯命令列部分。
傳回一個 CC 旗標,指示 CC 在編譯物件檔案時發出一個獨立的偵錯符號檔案。
與 perl 發行版中的 cflags 腳本執行非常相似的操作。它不會傳回整個編譯器命令列,但會初始化其所有部分。const_cccmd 方法接著實際傳回使用這些部分的 CCCMD 巨集定義。
傳回 C 程式完整的編譯呼叫,並將定義儲存在 CONST_CCCMD 中。
如果需要,設定 SHELL,然後在 Makefile 中定義幾個從 %Config 匯入的常數。
定義 EXTRALIBS、LDLOADLIBS、BSLOADLIBS、LD_RUN_PATH。有關詳細資訊,請參閱 ExtUtils::Liblist。
my $make_frag = $mm->constants;
印出許多常數的巨集。
與 depend 屬性的巨集相同。
$mm->init_DEST
定義 DESTDIR 和 DEST* 變數,與 INSTALL* 平行。
$mm->init_dist;
定義許多用於發行支援的巨集。
macro description default
TAR tar command to use tar
TARFLAGS flags to pass to TAR cvf
ZIP zip command to use zip
ZIPFLAGS flags to pass to ZIP -r
COMPRESS compression command to gzip --best
use for tarfiles
SUFFIX suffix to put on .gz
compressed files
SHAR shar command to use shar
PREOP extra commands to run before
making the archive
POSTOP extra commands to run after
making the archive
TO_UNIX a command to convert linefeeds
to Unix style in your archive
CI command to checkin your ci -u
sources to version control
RCS_LABEL command to label your sources rcs -Nv$(VERSION_SYM): -q
just after CI is run
DIST_CP $how argument to manicopy() best
when the distdir is created
DIST_DEFAULT default target to use to tardist
create a distribution
DISTVNAME name of the resulting archive $(DISTNAME)-$(VERSION)
(minus suffixes)
my $dist_macros = $mm->dist(%overrides);
產生一個 make 片段,定義 init_dist 中初始化的所有巨集。
%overrides 可用於覆寫上述任何項目。
定義目標 distclean、distcheck、skipcheck、manifest、veryclean。
定義 RCS 的目標檢查。
my $dist_make_fragment = $MM->dist_core;
將「make dist」所需的目標放入一個 make 片段中。
my $make_frag = $MM->dist_target;
傳回「dist」目標,以建立發行用的封存檔案。此目標只檢查 Makefile 是否是最新的,並取決於 $(DIST_DEFAULT)。
my $make_frag = $MM->tardist_target;
傳回「tardist」目標,這個目標只是讓「make tardist」可以運作。實際的工作是由動態命名的 tardistfile_target() 方法完成,tardist 應該將其設為相依性。
my $make_frag = $MM->zipdist_target;
傳回「zipdist」目標,這只是為了讓「make zipdist」運作。實際的工作由動態命名的方法 zipdistfile_target() 執行,zipdist 應該將其設定為相依性。
my $make_frag = $MM->tarfile_target;
此目標的名稱是 tardist 所產生的 tarball 名稱。此目標執行將 distdir 轉換為 tarball 的實際工作。
my $make_frag = $MM->zipfile_target;
此目標的名稱是 zipdist 所產生的 zip 檔名稱。此目標執行將 distdir 轉換為 zip 檔的實際工作。
my $make_frag = $MM->uutardist_target;
將 tarfile 轉換為 uuencoded 檔
my $make_frag = $MM->shdist_target;
將 distdir 轉換為 shell 檔案。
某些作業系統用來定義 DL_FUNCS 和 DL_VARS,並撰寫 *.exp 檔。
通常只會傳回一個空字串。
定義 bootstrap 檔的目標。
定義如何產生 *.so (或等效) 檔。
定義 dynamic_lib
區段的巨集。
定義 dynamic_lib
區段的配方。
已棄用的方法。請改用 libscan。
由 init_others 呼叫,並呼叫 ext ExtUtils::Liblist。有關詳細資訊,請參閱 ExtUtils::Liblist。
尋找可執行檔 PERL 和 FULLPERL
$mm->fixin(@files);
插入 sharpbang 或等效的 magic number 至一組 @files。
寫入一個空的 FORCE: 目標。
透過檢查工作目錄名稱來猜測此套件的名稱。MakeMaker 僅在開發人員未提供 NAME 屬性的情況下呼叫此函式。
如果此物件內存在需要編譯器的 C、XS、MYEXTLIB 或類似物件,則傳回 true。不會像 needs_linking() 那樣深入子目錄。
掃描目錄結構並初始化 DIR、XS、XS_FILES、C、C_FILES、O_FILES、H、H_FILES、PL_FILES、EXE_FILES。
由 init_main 呼叫。
判斷是否應產生手冊頁,並適當地初始化 MAN1PODS 和 MAN3PODS。
從 EXE_FILES 清單初始化 MAN1PODS。
從 PM 檔案清單初始化 MAN3PODS。
從 PMLIBDIRS 初始化 PMLIBDIRS 和 PM。
針對 Unix 使用 /。由 init_main 呼叫。
初始化 AR、AR_STATIC_ARGS、BASEEXT、CONFIG、DISTNAME、DLBASE、EXE_EXT、FULLEXT、FULLPERL、FULLPERLRUN、FULLPERLRUNINST、INST_、INSTALL、INSTALLDIRS、LIB_EXT、LIBPERL_A、MAP_TARGET、NAME、OBJ_EXT、PARENT_NAME、PERL、PERL_ARCHLIB、PERL_INC、PERL_LIB、PERL_SRC、PERLRUN、PERLRUNINST、PREFIX、VERSION、VERSION_SYM、XS_VERSION。
初始化工具以使用其常見(且較快的)Unix 命令。
Unix 不需要特殊的連結器旗標。
$mm->init_PERL;
由 init_main 呼叫。設定 ABSPERL、PERL、FULLPERL 和所有 *PERLRUN* 排列組合。
PERL is allowed to be miniperl
FULLPERL must be a complete perl
ABSPERL is PERL converted to an absolute path
*PERLRUN contains everything necessary to run perl, find it's
libraries, etc...
*PERLRUNINST is *PERLRUN + everything necessary to find the
modules being built.
新增 MM_Unix_VERSION。
$mm->init_PERM
由 init_main 呼叫。初始化 PERL_*
$mm->init_xs
設定與 XS 程式碼相關的巨集。目前僅有 INST_STATIC、INST_DYNAMIC 和 INST_BOOT。
定義安裝目標。
定義目標以建立和安裝 EXE_FILES。
定義 linkext 目標,而 linkext 目標會定義 LINKTYPE。
以目錄名稱和正規表示式作為引數。傳回目錄中符合正規表示式的所有項目。
簡單的子常式,用於將巨集屬性所定義的巨集插入 Makefile 中。
由 staticmake 呼叫。定義如何撰寫 Makefile 以產生靜態的新 perl。
預設情況下,產生的 Makefile 會包含 perl 函式庫中的所有靜態延伸模組。(函式庫檔案的純化版本,例如 DynaLoader_pure_p1_c0_032.a,會自動略過以避免連結錯誤。)
由 makeaperl 的公用程式方法呼叫。透過查看檔案是否定義任何以 boot_
開頭的符號(可選擇加上開頭底線,MacOS 需要),來檢查給定的檔案是否為 XS 函式庫。
定義如何重寫 Makefile。
如果參數很可能是命令,則傳回 true。
這個模組是否需要連結?會深入子目錄物件(另請參閱 has_link_code())
剖析檔案並傳回您認為的 ABSTRACT
my $version = MM->parse_version($file);
剖析 $file 並傳回第一個指派設定的 $VERSION。如果無法找出 $VERSION,則會傳回字串「undef」。$VERSION 應供所有人查看,因此 our $VERSION
或純粹的 $VERSION 都是可以的,但 my $VERSION
則不行。
也會檢查 package Foo VERSION
。會使用找到的第一個版本宣告,但這可能會有所變更,因為它與 Perl 的做法不同。
parse_version() 會嘗試在檢查 $VERSION
之前 use version
,因此以下做法會有效。
$VERSION = qv(1.2.3);
定義傳遞給子目錄中遞迴 make 呼叫的字串。每個層級都會使用 PASTHRU_DEFINE
等變數,並透過命令列向下傳遞,例如該層級 DEFINE 的值。範例
# Level 0 has DEFINE = -Dfunky
# This code will define level 0's PASTHRU=PASTHRU_DEFINE="$(DEFINE)
# $(PASTHRU_DEFINE)"
# Level 0's $(CCCMD) will include macros $(DEFINE) and $(PASTHRU_DEFINE)
# So will level 1's, so when level 1 compiles, it will get right values
# And so ad infinitum
接受一個參數,一個檔案名稱,如果參數很可能是 perl 腳本,則傳回檔案名稱。在 MM_Unix 上,這適用於任何一般可讀取的檔案。
定義 perl 發行版附帶所有 *.h 檔案的相依性。
定義目標,將雜湊值 PM 中的所有檔案複製到其目的地並自動將它們拆分。請參閱 "DESCRIPTION" in ExtUtils::Install
定義目標,為二進制發行版建立 PPD(Perl 套件說明)檔案。
$MM->prefixify($var, $prefix, $new_prefix, $default);
使用 $MM->{uc $var} || $Config{lc $var},它會嘗試將 $prefix 替換成 $new_prefix。
如果 $prefix 無法比對而且在 WriteMakefile() 中給定 PREFIX 為參數,它會將其設定為 $new_prefix + $default。這是針對其檔案配置無法完美符合我們前綴概念的系統。
這是針對嘗試建立與已安裝 perl 相同目錄結構的啟發法。
例如
$MM->prefixify('installman1dir', '/usr', '/home/foo', 'man/man1');
這會嘗試從 $MM->{INSTALLMAN1DIR} 路徑前面移除 '/usr'(必要時將其初始化為 $Config{installman1dir})並將其替換為 '/home/foo'。如果失敗,它只會使用 '/home/foo/man/man1'。
定義執行 *.PL 檔案的目標。
必要時指定 SHELL - Unix 上不執行此動作。
在命令列參數中反斜線括號 ()
。無法處理遞迴 Makefile $(...)
結構,但可以處理簡單結構。
my $man_name = $MM->replace_manpage_separator($file_path);
取得套件名稱,可以是巢狀套件,格式為 'Foo/Bar.pm',並將斜線替換為 ::
或其他適用於說明頁檔名的安全字元。傳回替換字元。
引用巨集文字值,適合用於命令列,以便在 make 展開時,會以提供給此方法的方式由命令接收
my $quoted = $mm->quote_literal(q{it isn't});
# returns:
# 'it isn'\''t'
print MAKEFILE "target:\n\techo $quoted\n";
# when run "make target", will output:
# it isn't
使用 POSIX::ARG_MAX。否則退回 4096。
定義靜態目標。
定義 static_lib
區段的食譜。
在 extralibs.ld 和 $(PERL_SRC)/ext.libs 中記錄 $(EXTRALIBS)
。
處理複製 $(MYEXTLIB)
作為最終靜態函式庫的起始點,然後將其新增。
定義如何執行封存公用程式。
呼叫 makeaperl。
子目錄的輔助子常式。
定義處理子目錄的目標。
定義測試目標。
由於某個我忘記的原因,Unix 電腦喜歡為測試設定 PERL_DL_NONLAZY。
同樣,PERL_DL_NONLAZY 這件事。
決定類型對應、xsubpp 版本、原型行為。
也建置手冊頁面
定義目標 all、subdirs、config 和 O_FILES
過時的、不建議使用的方法。自版本 5.21 起不再使用。
定義將 XS 檔案編譯成 C 的字尾規則。
定義將 XS 檔案編譯成 C++ 的字尾規則。
定義從 XS 直接到物件檔案的字尾規則。這原本只適用於有問題的 make 實作,但現在對於 XSMULTI
下的每個 XS 檔案而言是必要的,因為每個 XS 檔案可能都有個別的 $(VERSION)
。