內容

名稱

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 中尋找。

方法

os_flavor

僅表示我們是 Unix。

c_o (o)

定義將不同風味的 C 檔案編譯為物件檔案的附檔字規則。

xs_obj_opt

將物件檔案作為引數,並傳回將輸出至指定物件檔案的編譯命令列部分。

dbgoutflag

傳回一個 CC 旗標,指示 CC 在編譯物件檔案時發出一個獨立的偵錯符號檔案。

cflags (o)

與 perl 發行版中的 cflags 腳本執行非常相似的操作。它不會傳回整個編譯器命令列,但會初始化其所有部分。const_cccmd 方法接著實際傳回使用這些部分的 CCCMD 巨集定義。

const_cccmd (o)

傳回 C 程式完整的編譯呼叫,並將定義儲存在 CONST_CCCMD 中。

const_config (o)

如果需要,設定 SHELL,然後在 Makefile 中定義幾個從 %Config 匯入的常數。

const_loadlibs (o)

定義 EXTRALIBS、LDLOADLIBS、BSLOADLIBS、LD_RUN_PATH。有關詳細資訊,請參閱 ExtUtils::Liblist

constants (o)
my $make_frag = $mm->constants;

印出許多常數的巨集。

depend (o)

與 depend 屬性的巨集相同。

init_DEST
$mm->init_DEST

定義 DESTDIR 和 DEST* 變數,與 INSTALL* 平行。

init_dist
$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)
dist (o)
my $dist_macros = $mm->dist(%overrides);

產生一個 make 片段,定義 init_dist 中初始化的所有巨集。

%overrides 可用於覆寫上述任何項目。

dist_basics (o)

定義目標 distclean、distcheck、skipcheck、manifest、veryclean。

dist_ci (o)

定義 RCS 的目標檢查。

dist_core (o)
my $dist_make_fragment = $MM->dist_core;

將「make dist」所需的目標放入一個 make 片段中。

dist_target
my $make_frag = $MM->dist_target;

傳回「dist」目標,以建立發行用的封存檔案。此目標只檢查 Makefile 是否是最新的,並取決於 $(DIST_DEFAULT)。

tardist_target
my $make_frag = $MM->tardist_target;

傳回「tardist」目標,這個目標只是讓「make tardist」可以運作。實際的工作是由動態命名的 tardistfile_target() 方法完成,tardist 應該將其設為相依性。

zipdist_target
my $make_frag = $MM->zipdist_target;

傳回「zipdist」目標,這只是為了讓「make zipdist」運作。實際的工作由動態命名的方法 zipdistfile_target() 執行,zipdist 應該將其設定為相依性。

tarfile_target
my $make_frag = $MM->tarfile_target;

此目標的名稱是 tardist 所產生的 tarball 名稱。此目標執行將 distdir 轉換為 tarball 的實際工作。

zipfile_target
my $make_frag = $MM->zipfile_target;

此目標的名稱是 zipdist 所產生的 zip 檔名稱。此目標執行將 distdir 轉換為 zip 檔的實際工作。

uutardist_target
my $make_frag = $MM->uutardist_target;

將 tarfile 轉換為 uuencoded 檔

shdist_target
my $make_frag = $MM->shdist_target;

將 distdir 轉換為 shell 檔案。

dlsyms (o)

某些作業系統用來定義 DL_FUNCS 和 DL_VARS,並撰寫 *.exp 檔。

通常只會傳回一個空字串。

dynamic_bs (o)

定義 bootstrap 檔的目標。

dynamic_lib (o)

定義如何產生 *.so (或等效) 檔。

xs_dynamic_lib_macros

定義 dynamic_lib 區段的巨集。

xs_make_dynamic_lib

定義 dynamic_lib 區段的配方。

exescan

已棄用的方法。請改用 libscan。

extliblist

由 init_others 呼叫,並呼叫 ext ExtUtils::Liblist。有關詳細資訊,請參閱 ExtUtils::Liblist

find_perl

尋找可執行檔 PERL 和 FULLPERL

fixin
$mm->fixin(@files);

插入 sharpbang 或等效的 magic number 至一組 @files。

force (o)

寫入一個空的 FORCE: 目標。

guess_name

透過檢查工作目錄名稱來猜測此套件的名稱。MakeMaker 僅在開發人員未提供 NAME 屬性的情況下呼叫此函式。

如果此物件內存在需要編譯器的 C、XS、MYEXTLIB 或類似物件,則傳回 true。不會像 needs_linking() 那樣深入子目錄。

init_dirscan

掃描目錄結構並初始化 DIR、XS、XS_FILES、C、C_FILES、O_FILES、H、H_FILES、PL_FILES、EXE_FILES。

由 init_main 呼叫。

init_MANPODS

判斷是否應產生手冊頁,並適當地初始化 MAN1PODS 和 MAN3PODS。

init_MAN1PODS

從 EXE_FILES 清單初始化 MAN1PODS。

init_MAN3PODS

從 PM 檔案清單初始化 MAN3PODS。

init_PM

從 PMLIBDIRS 初始化 PMLIBDIRS 和 PM。

init_DIRFILESEP

針對 Unix 使用 /。由 init_main 呼叫。

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。

init_tools

初始化工具以使用其常見(且較快的)Unix 命令。

init_linker

Unix 不需要特殊的連結器旗標。

init_PERL
$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.
init_platform
platform_constants

新增 MM_Unix_VERSION。

init_PERM
$mm->init_PERM

由 init_main 呼叫。初始化 PERL_*

init_xs
$mm->init_xs

設定與 XS 程式碼相關的巨集。目前僅有 INST_STATIC、INST_DYNAMIC 和 INST_BOOT。

install (o)

定義安裝目標。

installbin (o)

定義目標以建立和安裝 EXE_FILES。

linkext (o)

定義 linkext 目標,而 linkext 目標會定義 LINKTYPE。

lsdir

以目錄名稱和正規表示式作為引數。傳回目錄中符合正規表示式的所有項目。

macro (o)

簡單的子常式,用於將巨集屬性所定義的巨集插入 Makefile 中。

makeaperl (o)

由 staticmake 呼叫。定義如何撰寫 Makefile 以產生靜態的新 perl。

預設情況下,產生的 Makefile 會包含 perl 函式庫中的所有靜態延伸模組。(函式庫檔案的純化版本,例如 DynaLoader_pure_p1_c0_032.a,會自動略過以避免連結錯誤。)

xs_static_lib_is_xs (o)

由 makeaperl 的公用程式方法呼叫。透過查看檔案是否定義任何以 boot_ 開頭的符號(可選擇加上開頭底線,MacOS 需要),來檢查給定的檔案是否為 XS 函式庫。

makefile (o)

定義如何重寫 Makefile。

maybe_command

如果參數很可能是命令,則傳回 true。

needs_linking (o)

這個模組是否需要連結?會深入子目錄物件(另請參閱 has_link_code())

parse_abstract

剖析檔案並傳回您認為的 ABSTRACT

parse_version
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);
pasthru (o)

定義傳遞給子目錄中遞迴 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_script

接受一個參數,一個檔案名稱,如果參數很可能是 perl 腳本,則傳回檔案名稱。在 MM_Unix 上,這適用於任何一般可讀取的檔案。

perldepend (o)

定義 perl 發行版附帶所有 *.h 檔案的相依性。

pm_to_blib

定義目標,將雜湊值 PM 中的所有檔案複製到其目的地並自動將它們拆分。請參閱 "DESCRIPTION" in ExtUtils::Install

ppd

定義目標,為二進制發行版建立 PPD(Perl 套件說明)檔案。

prefixify
$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'。

processPL (o)

定義執行 *.PL 檔案的目標。

specify_shell

必要時指定 SHELL - Unix 上不執行此動作。

quote_paren

在命令列參數中反斜線括號 ()。無法處理遞迴 Makefile $(...) 結構,但可以處理簡單結構。

replace_manpage_separator
my $man_name = $MM->replace_manpage_separator($file_path);

取得套件名稱,可以是巢狀套件,格式為 'Foo/Bar.pm',並將斜線替換為 :: 或其他適用於說明頁檔名的安全字元。傳回替換字元。

cd
oneliner
quote_literal

引用巨集文字值,適合用於命令列,以便在 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
escape_newlines
max_exec_len

使用 POSIX::ARG_MAX。否則退回 4096。

static (o)

定義靜態目標。

xs_make_static_lib

定義 static_lib 區段的食譜。

static_lib_closures

extralibs.ld$(PERL_SRC)/ext.libs 中記錄 $(EXTRALIBS)

static_lib_fixtures

處理複製 $(MYEXTLIB) 作為最終靜態函式庫的起始點,然後將其新增。

static_lib_pure_cmd

定義如何執行封存公用程式。

staticmake (o)

呼叫 makeaperl。

subdir_x (o)

子目錄的輔助子常式。

subdirs (o)

定義處理子目錄的目標。

test (o)

定義測試目標。

test_via_harness (override)

由於某個我忘記的原因,Unix 電腦喜歡為測試設定 PERL_DL_NONLAZY。

test_via_script (override)

同樣,PERL_DL_NONLAZY 這件事。

tool_xsubpp (o)

決定類型對應、xsubpp 版本、原型行為。

all_target

也建置手冊頁面

top_targets (o)

定義目標 all、subdirs、config 和 O_FILES

writedoc

過時的、不建議使用的方法。自版本 5.21 起不再使用。

xs_c (o)

定義將 XS 檔案編譯成 C 的字尾規則。

xs_cpp (o)

定義將 XS 檔案編譯成 C++ 的字尾規則。

xs_o (o)

定義從 XS 直接到物件檔案的字尾規則。這原本只適用於有問題的 make 實作,但現在對於 XSMULTI 下的每個 XS 檔案而言是必要的,因為每個 XS 檔案可能都有個別的 $(VERSION)

另請參閱

ExtUtils::MakeMaker