📄 m4sh.m4
字号:
# Set VAR to DIR-NAME/FILE-NAME.# Optimize the common case where $2 or $3 is '.'.m4_define([AS_SET_CATFILE],[case $2 in.) $1=$3;;*) case $3 in .) $1=$2;; [[\\/]]* | ?:[[\\/]]* ) $1=$3;; *) $1=$2/$3;; esac;;esac[]dnl])# AS_SET_CATFILE## ------------------ #### 5. Common idioms. #### ------------------ ### This section is lexicographically sorted.# AS_BOX(MESSAGE, [FRAME-CHARACTER = `-'])# ----------------------------------------# Output MESSAGE, a single line text, framed with FRAME-CHARACTER (which# must not be `/').m4_define([AS_BOX],[AS_LITERAL_IF([$1], [_AS_BOX_LITERAL($@)], [_AS_BOX_INDIR($@)])])# _AS_BOX_LITERAL(MESSAGE, [FRAME-CHARACTER = `-'])# -------------------------------------------------m4_define([_AS_BOX_LITERAL],[cat <<\_ASBOXm4_text_box($@)_ASBOX])# _AS_BOX_INDIR(MESSAGE, [FRAME-CHARACTER = `-'])# -----------------------------------------------m4_define([_AS_BOX_INDIR],[sed 'h;s/./m4_default([$2], [-])/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX@%:@@%:@ $1 @%:@@%:@_ASBOX])# AS_LITERAL_IF(EXPRESSION, IF-LITERAL, IF-NOT-LITERAL)# -----------------------------------------------------# If EXPRESSION has shell indirections ($var or `expr`), expand# IF-INDIR, else IF-NOT-INDIR.# This is an *approximation*: for instance EXPRESSION = `\$' is# definitely a literal, but will not be recognized as such.m4_define([AS_LITERAL_IF],[m4_bmatch([$1], [[`$]], [$3], [$2])])# AS_TMPDIR(PREFIX, [DIRECTORY = $TMPDIR [= /tmp]])# -------------------------------------------------# Create as safely as possible a temporary directory in DIRECTORY# which name is inspired by PREFIX (should be 2-4 chars max), and set# trap mechanisms to remove it.m4_define([AS_TMPDIR],[# Create a temporary directory, and hook for its removal unless debugging.$debug ||{ trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 trap 'AS_EXIT([1])' 1 2 13 15}# Create a (secure) tmp directory for tmp files.m4_if([$2], [], [: ${TMPDIR=/tmp}]){ tmp=`(umask 077 && mktemp -d -q "m4_default([$2], [$TMPDIR])/$1XXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp"} ||{ tmp=m4_default([$2], [$TMPDIR])/$1$$-$RANDOM (umask 077 && mkdir $tmp)} ||{ echo "$me: cannot create a temporary directory in m4_default([$2], [$TMPDIR])" >&2 AS_EXIT}dnl])# AS_TMPDIR# AS_UNAME# --------# Try to describe this machine. Meant for logs.m4_define([AS_UNAME],[{cat <<_ASUNAMEm4_text_box([Platform.])hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`uname -m = `(uname -m) 2>/dev/null || echo unknown`uname -r = `(uname -r) 2>/dev/null || echo unknown`uname -s = `(uname -s) 2>/dev/null || echo unknown`uname -v = `(uname -v) 2>/dev/null || echo unknown`/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`hostinfo = `(hostinfo) 2>/dev/null || echo unknown`/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`_ASUNAME_AS_PATH_WALK([$PATH], [echo "PATH: $as_dir"])}])# AS_HELP_STRING(LHS, RHS, [COLUMN])# ----------------------------------## Format a help string so that it looks pretty when# the user executes "script --help". This macro takes three# arguments, a "left hand side" (LHS), a "right hand side" (RHS), and# the COLUMN which is a string of white spaces which leads to the# the RHS column (default: 26 white spaces).## The resulting string is suitable for use in other macros that require# a help string (e.g. AC_ARG_WITH).## Here is the sample string from the Autoconf manual (Node: External# Software) which shows the proper spacing for help strings.## --with-readline support fancy command line editing# ^ ^ ^# | | |# | column 2 column 26# |# column 0## A help string is made up of a "left hand side" (LHS) and a "right# hand side" (RHS). In the example above, the LHS is# "--with-readline", while the RHS is "support fancy command line# editing".## If the LHS is contains more than (COLUMN - 3) characters, then the LHS# is terminated with a newline so that the RHS starts on a line of its# own beginning with COLUMN. In the default case, this corresponds to# an LHS with more than 23 characters.## Therefore, in the example, if the LHS were instead# "--with-readline-blah-blah-blah", then the AS_HELP_STRING macro would# expand into:### --with-readline-blah-blah-blah# ^ ^ support fancy command line editing# | | ^# | column 2 |# column 0 column 26#m4_define([AS_HELP_STRING],[m4_pushdef([AS_Prefix], m4_default([$3], [ ]))dnlm4_pushdef([AS_Prefix_Format], [ %-]m4_eval(m4_len(AS_Prefix) - 3)[s ])dnl [ %-23s ]m4_text_wrap([$2], AS_Prefix, m4_format(AS_Prefix_Format, [$1]))dnlm4_popdef([AS_Prefix_Format])dnlm4_popdef([AS_Prefix])dnl])## ------------------------------------ #### Common m4/sh character translation. #### ------------------------------------ ### The point of this section is to provide high level macros comparable# to m4's `translit' primitive, but m4/sh polymorphic.# Transliteration of literal strings should be handled by m4, while# shell variables' content will be translated at runtime (tr or sed).# _AS_CR_PREPARE# --------------# Output variables defining common character ranges.# See m4_cr_letters etc.m4_defun([_AS_CR_PREPARE],[# Avoid depending upon Character Ranges.as_cr_letters='abcdefghijklmnopqrstuvwxyz'as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'as_cr_Letters=$as_cr_letters$as_cr_LETTERSas_cr_digits='0123456789'as_cr_alnum=$as_cr_Letters$as_cr_digits])# _AS_TR_SH_PREPARE# -----------------m4_defun([_AS_TR_SH_PREPARE],[AS_REQUIRE([_AS_CR_PREPARE])dnl# Sed expression to map a string onto a valid variable name.as_tr_sh="eval sed 'y%*+%pp%;s%[[^_$as_cr_alnum]]%_%g'"])# AS_TR_SH(EXPRESSION)# --------------------# Transform EXPRESSION into a valid shell variable name.# sh/m4 polymorphic.# Be sure to update the definition of `$as_tr_sh' if you change this.m4_defun([AS_TR_SH],[AS_REQUIRE([_$0_PREPARE])dnlAS_LITERAL_IF([$1], [m4_bpatsubst(m4_translit([[$1]], [*+], [pp]), [[^a-zA-Z0-9_]], [_])], [`echo "$1" | $as_tr_sh`])])# _AS_TR_CPP_PREPARE# ------------------m4_defun([_AS_TR_CPP_PREPARE],[AS_REQUIRE([_AS_CR_PREPARE])dnl# Sed expression to map a string onto a valid CPP name.as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[[^_$as_cr_alnum]]%_%g'"])# AS_TR_CPP(EXPRESSION)# ---------------------# Map EXPRESSION to an upper case string which is valid as rhs for a# `#define'. sh/m4 polymorphic. Be sure to update the definition# of `$as_tr_cpp' if you change this.m4_defun([AS_TR_CPP],[AS_REQUIRE([_$0_PREPARE])dnlAS_LITERAL_IF([$1], [m4_bpatsubst(m4_translit([[$1]], [*abcdefghijklmnopqrstuvwxyz], [PABCDEFGHIJKLMNOPQRSTUVWXYZ]), [[^A-Z0-9_]], [_])], [`echo "$1" | $as_tr_cpp`])])# _AS_TR_PREPARE# --------------m4_defun([_AS_TR_PREPARE],[AS_REQUIRE([_AS_TR_SH_PREPARE])dnlAS_REQUIRE([_AS_TR_CPP_PREPARE])dnl])## --------------------------------------------------- #### Common m4/sh handling of variables (indirections). #### --------------------------------------------------- ### The purpose of this section is to provide a uniform API for# reading/setting sh variables with or without indirection.# Typically, one can write# AS_VAR_SET(var, val)# or# AS_VAR_SET(as_$var, val)# and expect the right thing to happen.# AS_VAR_SET(VARIABLE, VALUE)# ---------------------------# Set the VALUE of the shell VARIABLE.# If the variable contains indirections (e.g. `ac_cv_func_$ac_func')# perform whenever possible at m4 level, otherwise sh level.m4_define([AS_VAR_SET],[AS_LITERAL_IF([$1], [$1=$2], [eval "$1=AS_ESCAPE([$2])"])])# AS_VAR_GET(VARIABLE)# --------------------# Get the value of the shell VARIABLE.# Evaluates to $VARIABLE if there are no indirection in VARIABLE,# else into the appropriate `eval' sequence.m4_define([AS_VAR_GET],[AS_LITERAL_IF([$1], [$$1], [`eval echo '${'m4_bpatsubst($1, [[\\`]], [\\\&])'}'`])])# AS_VAR_TEST_SET(VARIABLE)# -------------------------# Expands into the `test' expression which is true if VARIABLE# is set. Polymorphic. Should be dnl'ed.m4_define([AS_VAR_TEST_SET],[AS_LITERAL_IF([$1], [test "${$1+set}" = set], [eval "test \"\${$1+set}\" = set"])])# AS_VAR_SET_IF(VARIABLE, IF-TRUE, IF-FALSE)# ------------------------------------------# Implement a shell `if-then-else' depending whether VARIABLE is set# or not. Polymorphic.m4_define([AS_VAR_SET_IF],[AS_IF([AS_VAR_TEST_SET([$1])], [$2], [$3])])# AS_VAR_PUSHDEF and AS_VAR_POPDEF# --------------------------------## Sometimes we may have to handle literals (e.g. `stdlib.h'), while at# other moments, the same code may have to get the value from a# variable (e.g., `ac_header'). To have a uniform handling of both# cases, when a new value is about to be processed, declare a local# variable, e.g.:## AS_VAR_PUSHDEF([header], [ac_cv_header_$1])## and then in the body of the macro, use `header' as is. It is of# first importance to use `AS_VAR_*' to access this variable. Don't# quote its name: it must be used right away by m4.## If the value `$1' was a literal (e.g. `stdlib.h'), then `header' is# in fact the value `ac_cv_header_stdlib_h'. If `$1' was indirect,# then `header's value in m4 is in fact `$ac_header', the shell# variable that holds all of the magic to get the expansion right.## At the end of the block, free the variable with## AS_VAR_POPDEF([header])# AS_VAR_PUSHDEF(VARNAME, VALUE)# ------------------------------# Define the m4 macro VARNAME to an accessor to the shell variable# named VALUE. VALUE does not need to be a valid shell variable name:# the transliteration is handled here. To be dnl'ed.m4_define([AS_VAR_PUSHDEF],[AS_LITERAL_IF([$2], [m4_pushdef([$1], [AS_TR_SH($2)])], [as_$1=AS_TR_SH($2)m4_pushdef([$1], [$as_[$1]])])])# AS_VAR_POPDEF(VARNAME)# ----------------------# Free the shell variable accessor VARNAME. To be dnl'ed.m4_define([AS_VAR_POPDEF],[m4_popdef([$1])])## ----------------- #### Setting M4sh up. #### ----------------- ### AS_INIT# -------m4_define([AS_INIT],[m4_init# Forbidden tokens and exceptions.m4_pattern_forbid([^_?AS_])# Bangshe and minimal initialization.m4_divert_text([BINSH], [@%:@! /bin/sh])m4_divert_text([M4SH-INIT], [AS_SHELL_SANITIZE])# Let's go!m4_wrap([m4_divert_pop([BODY])[]])m4_divert_push([BODY])[]dnl])
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -