11.6文件系统惯例
Autoconf广泛使用shell-script处理,因此文件名它处理的不应包含特殊于外壳。特殊字符包括空格、制表符、换行符、NUL和以下内容:
" # $ & ' ( ) * ; < = > ? [ \ ` |
此外,文件名不应以“~'或'-',并且应该两者都不包含'-'紧接其后'/“无”~’紧随其后':’. 在类Posix平台上,目录名不应包含“:',因为这与'冲突':'用作路径分隔符。
这些限制不仅适用于您分发的文件,而且也可以是源、生成和目标的绝对文件名目录。
在一些类似Posix的平台上,”!'和'^“也很特别,所以应该避免出现这种情况。
Posix允许实现处理领先//特别是,但是需要领导///甚至更高,相当于/.大多数Unix变体处理//喜欢/然而,一些治疗//作为“超级光盘”,可以访问无法从其他地方访问/.超光速传统开始Apollo Domain/OS早已消亡,但不幸的是Cygwin让它复活了。
While期间自动配置文件
和朋友通常在Posix上运行多种多样,它们可以在其他系统上使用,尤其是DOS变体。这影响了有关文件名的几个假设。
例如,以下代码:
案例$foo_dir in/*)#绝对值;;*)foo_dir=$dots$foo_dir;;欧洲安全理事会
无法正确检测这些系统上的绝对文件名,因为他们可以使用drivespec,通常使用反斜杠作为目录分离器。如果您想移植到DOS变体(在拒绝有效但奇怪的Posix文件名的代价a: \b个),您可以这样检查绝对文件名:
案例$foo_dir in[\\/]* | ?:[\\/]*)#绝对;;*)foo_dir=$dots$foo_dir;;欧洲安全理事会
确保在适当的情况下引用括号,并保持反斜杠为第一个字符。请参见壳牌内置产品的局限性.
此外,因为冒号是作为drivespec的一部分使用的,所以这些系统不会将其用作路径分隔符。创建或访问路径时,可以使用路径_分离器
而不是输出变量。配置
设置此到构建系统的适当值(':'或';')当它启动。
文件名也需要特别注意。而DOS变体有足够的力量跑自动配置文件
(如DJGPP)通常能够正确处理长文件名可能严重破坏程序包的限制。其中几个问题可以很容易地被多施克包裹。
以下是简要概述;问题用SFN/LFN标记为指出其适用范围:SFN表示问题仅与普通DOS,而不是Microsoft Windows下的DOS变量,而LFN识别即使在Microsoft Windows变体。
- 无多点(SFN)
DOS无法处理文件名中的多个点。这是一个特别的构建可移植配置脚本时要记住的重要事项,作为自动配置文件
模板文件使用.in后缀。
这在Posix变体上完全可以:
AC_CONFIG_HEADERS([配置h])AC_CONFIG_FILES([source.c foo.bar])交流输出
但它会在DOS上造成问题,因为它需要'配置h.in’,‘源.c.in'和'foo.bar.in软件’. 使您的包更便于携带对于基于DOS的环境,您应该使用此选项:
AC_CONFIG_HEADERS([CONFIG.h:CONFIG.hin])AC_CONFIG_FILES([source.c:source.cin foo.bar:foobar.in])交流输出
- 无前导点(SFN)
DOS无法处理以点开头的文件名。这通常是对不重要自动配置文件
.
- 不区分大小写(LFN)
DOS不区分大小写,因此不能同时使用文件名为“安装'和名为'的目录安装’. 这个也会影响制作
; 如果有一个名为“”的文件安装中的'目录,'进行安装'什么都不做(除非‘安装'目标标记为PHONY)。
- 8+3极限(SFN)
因为DOS文件系统只存储文件名和扩展名的前3个必须是唯一的。这意味着foobar部分1.c,foobar第2.c部分和foobar漂亮的小鸟。c(c)全部解析为相同的文件名(FOOBAR-P.C公司). 这也适用于foo.bar按钮和食物.小吃.
8+3限制在Microsoft Windows下通常不是问题,因为使用数字在文件名的简短版本中添加尾部以使其唯一。然而,a注册表设置可以关闭此行为可以在SFN之间共享包含长文件名的文件树和LFN环境,这也意味着上述问题适用于此也。
- 无效字符(LFN)
DOS文件名中的某些字符无效,因此应该避免。在LFN环境中,这些是“/’, ‘\’,‘?’, ‘*’, ‘:’, ‘<’, ‘>’, ‘|'和'"’.在SFN环境中,其他字符也无效。这些包括'+’, ‘,’, ‘['和']’.
- 无效名称(LFN)
某些DOS文件名是保留的,如果您尝试使用具有这些名称的文件。这些名称包括反对的论点,辅助的,通信1,通信2,通信3,通信4,低压变压器1,LPT2型,LPT3型,NUL(无)、和项目需求编号.文件名不区分大小写,因此即使是像这样的名称辅助/配置猜测不允许。