英语法语西班牙语

Ad


OnWorks 网站图标

makepp_incompatibility - 在云端联机

通过 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器在 OnWorks 免费托管服务提供商中运行 makepp_incompatibility

这是命令 makepp_incompatibility 可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器

程序:

您的姓名


makepp_incompatibility -- makepp 和 GNU make 之间的不兼容性

商品描述


Makepp 被设计为尽可能接近 GNU make
(<http://www.gnu.org/software/make/manual/make.html>)。 GNU自动工具
(<http://www.gnu.org/software/automake/manual/automake.html>), CMake
(<http://www.cmake.org/>), 预制 (http://industriousone.com/premake> 并查看备注
下面)或手工制作的遗留构建系统应该可以使用 makepp 构建。 这是这样
您可以毫不费力地迁移项目。 或者如果你不想享受所有
makepp 的优势(例如,其他人仍然可以使用 GNU make 构建您的项目)
从可靠性优势中获益,促进您的发展。

但是,由于哲学上的差异,一些 GNU make 或 POSIX make
(<http://pubs.opengroup.org/onlinepubs/009695399/utilities/make.html>) 功能不能
支持的。 有一些还没有实施,因为我们没有时间。 大部分的
与 GNU make 的差异是非常技术性的,很少会引起问题。 唉
解决传统 make 缺点的方法变得越来越复杂,
并且给 makepp 带来了困难。

简而言之,如果它不是开箱即用的,请尝试:

makepp --no-warn makepp_simple_concatenation=1 makepp_percent_subdirs=1 \
--build-check=target_newer --last-chance-rules --no-remake-makefiles

如果成功,您可以尝试一一消除这些论点。 但如果失败了,
尝试添加:

--传统递归制作

如果这也失败了,则构建系统需要进行一些调整才能与 makepp 合作。 甚至
如果此处描述的某些选项可以构建某些内容,则仍然建议进行调整
稍有不同,因此它们开箱即用地与两种品牌兼容。

强制 更多 POSIX or GNU 使 兼容性


以下是让许多遗留构建系统工作的一些命令行可能性
无需修改。 它们使 makepp 精确地模拟 GNU make 的行为。

兼容性 通过 选项​​: “--build-check=target_newer”
默认情况下,如果任何依赖项具有,makepp 将尝试重建所有目标
自上次构建以来已更改,或者命令已更改(请参阅 makepp_build_check
细节)。 这通常是您想要的。 但是,有时您不想要目标
如果在 makepp 的控制之外进行了修改(例如,通过编辑
它,或通过手动运行程序来制作文件)。 您可以强制 makepp 使用
传统的 make 算法,只有在任何目标比目标更新时才重建
依赖项,通过将此选项添加到命令行。

兼容性 通过 选项​​: “--dont-build=config.status”
有一些包会尝试自动配置自己,或者做其他事情,gmake
除非被要求,否则忽略,例如:

config.status : 配置
./config.status --重新检查

配置:configure.in aclocal.m4
自动配置

大多数人甚至没有安装“autoconf”,所以认真地做每件事
makepp 所做的规则将失败。 这个选项可以防止这种情况,如果你弄清楚了什么
不建。

兼容性 通过 选项​​: “--最后机会规则”
默认规则(没有模式依赖的模式规则)通常不被支持。
Makepp 根据现有文件实例化所有规则,以便它知道每一个
可以生成的文件。 唉,这样它不知道如何实例化一个模式
没有模式依赖的规则。 :last_chance 机制部分解决了这个问题。
如果这对于遗留的 makefile 足够好,这个选项允许全局打开它。

兼容性 通过 选项​​: “--没有警告”
这不会改善结果。 Makepp 会给出很多事情的警告信息
传统的 Unix 制造商毫不退缩地接受了这一点。 这是因为有
用 makepp 更好的方法来完成它们。 如果这些警告惹恼了您,您可以关闭它们
使用此选项。

兼容性 通过 选项​​: “--混合递归制作”
递归调用 make 通常被认为是一种不安全的做法(参见“更好的
用于分层构建的系统”中的详细信息),但它们在
现有的makefile。 Makepp 支持递归 make 以实现向后兼容性; 对于新的
makefiles,最好使用“load_makefile”语句,或者makepp的隐式
makefile 加载机制。

为了能够使用存储库进行变体构建,并帮助进行递归
调用 make更安全,makepp通常实际上不会递归调用自身
即使你告诉它。 相反,子进程与父进程通信,并且
实际的构建是由父进程完成的。

这在大多数情况下都有效,但您可能无法从同一个文件中调用多个 makefile
目录,例如,以下将不起作用:

目标:依赖
$(MAKE) -f other_makefile 目标

在这种情况下,makepp 注意到它正在加载第二个 makefile 并抱怨。 有了这个选项
相反,它将退回到从额外的 makefile 中构建的传统方式
每个单独的 makepp 进程。

注意:从技术上讲,加载多个 makefile 没有问题,但它们通常具有
相同的虚假目标名称。 将其分开将意味着对 makepp 的完全重新设计
内件。 但是,这会起作用,但并不等效:

目标:依赖
cd subdir && $(MAKE) -f other_makefile 目标

兼容性 通过 选项​​: “--traditional-recursive-make”
有时前面的选项是不够的,特别是如果递归调用使用
矛盾的选择。 Makepp 只使用一组全局选项,所以 submake 不是
允许修改它们,因为这也适用于其他 makefile。

将此选项添加到命令行会产生以下不良副作用:

· 递归使不在内部并行执行,即使父级这样做。
与 gmake 不同,进程数量没有整体协调。 这会
无法实现,因为这种工作方式不是 makepp 的设计目标。

· 递归 make 进程对存储库一无所知。

· 每个递归make进程产生自己的日志文件,在它被调用的目录中
in,而不是为整个构建生成一个日志文件。

· 由于 makepp 通常构建的比传统 make 认为必要的要多,而且由于许多
构建系统提供全方位的递归调用,这可能会导致无休止的
递归。 Makepp会在50回合后拉刹车告诉你如何增加
以防万一你真的有这么深的嵌套。

即使使用“--traditional-recursive-make”选项,环境变量
"MAKEOVERRIDES" 和 "MFLAGS" 没有设置,也被忽略,所以依赖的 makefile
那些是行不通的。

A 预制 产生 生成文件 只是同一个 sub-make 调用的有趣包装
目录。 如果你有一些项目目标 XYZ 它会有一条像

@${MAKE} --no-print-directory -C 。 -f XYZ.make

在这种情况下,您可以通过直接调用来避免“--traditional-recursive-make”选项
带有“-f”的makepp XYZ.make” 选项。

兼容性 也完全不需要 选项​​: “--工作=n"
遗留的 makefile 有时不会列出所有依赖项,依赖于顺序
执行,使他们及时。 在这种情况下 makepp 可能会设法调用规则之前
它的依赖已经全部制作完成。 那么结果可能会更好,甚至没有
并行执行。

兼容性 通过 变量: “makepp_simple_concatenation=1”
Rc 样式替换是 makepp 将变量替换为文本的默认方式
字符串,因为它很少破坏遗留的 makefile 并且通常在新的
生成文件。 但是,它确实会在替换
变量没有被空格包围。 例如,

INCLUDE_PREFIX := -I/some/include/dir -I
包含 := $(INCLUDE_PREFIX)/other/include/dir

将“包含”设置为“-I/some/include/dir/other/include/dir -I/other/include/dir”,如果 rc-
启用了样式替换,而 GNU make 会将其设置为
“-I/some/include/dir -I/other/include/dir”。 例如,在编译 Redis 2.6.5 时,它试图
运行“printfgcc”。 两个命令的如此有趣的串联强烈表明
这个变量需要回退以形成语义。

处理变量中的空格也存在不兼容性:

空:=
T := -o $(null) # T 包含 -o 后跟一个空格。
输出文件 = $(T)输出文件

如果启用了 rc 样式替换,则会将“OUTFILE”设置为“-ooutfile”,而 GNU make
将其设置为“-o outfile”。

通过设置“makepp_simple_concatenation”可以消除这两种不兼容性
多变的。 但是请注意,即使使用“makepp_simple_concatenation”,makepp 仍然
在某些情况下处理空白不兼容:

T := -o # 不要删除此评论。

GNU make 将 "T" 设置为包含 "-o" 后跟一个空格,而 makepp 去掉了
无论如何尾随空格。 如果你想要尾随空格,你必须设置
“makepp_simple_concatenation”并使用涉及虚拟的技术设置“T”
变量,如“null”,如上所示。

解决方法 选项 “--no-remake-makefiles”
典型的开源需要调用“configure”来创建makefile。 但后来这些
通过调用一些命令,makefile 可以包含重新制作 makefile 的规则。 马克普将
愉快地遵守并根据规则更新它。 但有时这是有害的,所以
跳过它。

兼容性 通过 变量: “makepp_percent_subdirs=1”
默认情况下,模式规则中的“%”与目录不匹配。 这意味着像这样的规则
这个:

%.o: %.c
$(CC) $(CFLAGS) -c $(输入) -o $(输出)

不会应用于像“../shared/xyz.c”这样的文件。 如果您希望它匹配中的文件
子目录,然后在命令行上设置变量“makepp_percent_subdirs=1”
或靠近 makefile 的开头。

兼容性 通过 环境 变量: $MAKEPP_IGNORE_OPTS
有时,遗留递归调用会传递 makepp 不理解的选项。
希望该选项并不重要,但它会阻止 makepp 运行。 有了这个
环境变量,您可以要求 makepp 静默忽略某些选项。 价值
应该是一个空格分隔的选项列表,它可以有 4 种变体:

--=x
需要参数的长选项。 这个事实必须通过equals来声明
符号,虽然实际使用中也可能用空格分隔,“--long=bla”或
“--long bla”。

--
没有参数的长选项。

-sx 需要参数的简短选项。 这个事实必须通过添加来声明
直接在选项之后的东西,虽然实际使用也可能被分隔
空格,“-sbla”或“-s bla”。

-s 没有参数的简短选项。

例如,在没有参数的情况下覆盖 makepp 的 -R 选项并接受 gmake 的调试
带参数的选项:

export MAKEPP_IGNORE_OPTS='-R --debug=x'

不兼容性 要求 生成文件 变化


· 显式调用 make 的 Makefile 会阻止 makepp 自己构建所有内容。
Alas Perl 自己的“ExtUtils::MakeMaker”提交了以下两种形式中的第二种
这个错误直到版本 6.56 (Perl 5.12.1):

子目录:
cd子目录; 制作

制作 = 制作

· 将“VPATH”变量设置为某个值隐式调用“vpath % value”。 “虚拟路径”
语句是用存储库机制模拟的。 所以,gmake 在哪里替代
在 vpath 中找到的文件的路径,makepp 会将其符号链接到
需要的地方。 因此 makepp 将提供一个未修改的字符串,通常是
不是问题。

不支持 vpath 中的目标。 (如果它们比它们新,Gmake 会考虑它们
它们的依赖关系,但如果没有,则目标将在当前目录中重新创建
-- 相当不一致。)不支持取消设置 vpath。

· 生成文件中较晚出现的模式规则会覆盖较早出现的模式规则。
这是 GNU make 的倒退。

· 内置的隐式规则集与 GNU make 的有些不同,
尽管变量名称在很大程度上是兼容的。 内置规则应该
成功编译 C/C++/Fortran 程序,实际上也许能猜到
在某些情况下也有适当的库。 支持 Modula-2 和 RatFor 等罕见
语言故意不存在,因为我一直遇到 GNU 的问题
当我不小心重用这些语言的扩展时,make 的规则。

· 一个动作前缀“+”被默默地忽略。

· 不支持存档成员,也不支持关联的自动变量
$%、“$(%D)”和“$(%F)”。

· 没有 SCCS 支持。

· 变量赋值中的前导和尾随空格被忽略(即使
空格后跟注释)。 有关空白处理的更多详细信息
不兼容性,请参阅 makepp_variables 中的“变量中的空白”。

· Makepp 不会尝试重建包含在“include”语句中的文件,除非
生成文件包含在包含语句出现之前构建它们的规则。
(但是,它将尝试重建 makefile 本身。)这通常用于
处理包含文件的依赖关系,并且对 makepp 没有用,因为你没有
无论如何都需要这样做。

· “SHELL”变量当前被部分忽略。 Makepp 总是使用 / bin / sh的
除非 /usr/xpg4/bin/sh or /sbin/xpg4/sh 找到或除非您导出“外壳”
生成文件中的变量。 但是如果你这样做,命令解析器可能不会完全
了解您的 shell 命令的作用。 在 Windows Strawberry 或 ActiveState Perl 上
你必须改为设置你的 SHELL 变量 before 调用makepp。

· Makefile 上的任何依赖项仍然有效,但通常是不必要的。
这通常用于在编译选项更改时强制重建。 马克普知道
当构建命令发生更改时,makefile 中没有任何特殊内容; 它存储
这是逐个文件的。 如果您更改 makefile,它会确切地知道是哪个
文件需要重新编译。

· 不删除中间文件。 (因为 makepp 坚持拥有所有文件
日期与上次构建的日期相同,中间文件必须全部为
存在,否则将发生重建。)没有给予特殊地位
中间文件。

· 唯一支持的特殊目标是“.PHONY”和部分“.SUFFIXES”。 这
剩下的都是简单的。

具体来说,GNU make 有以下特殊目标:

.后缀
Makepp 忽略“.SUFFIXES”,除了“.SUFFIXES”没有
依赖关系,像这样:

.后缀:

这告诉它不要加载任何默认规则。

.中级、.二级、.珍贵
中间文件没有特殊状态,因此这些目标不是
有意义的。

。忽略
该目标被忽略。 如果要忽略错误,请输入“ignore_error”
(或减号)在其退出状态将被忽略的命令前面。

。沉默的
该目标被忽略。 如果您希望命令不回显,请输入“noecho”一词
(或“@”字符)在不应该被回显的命令前面,
或使用 makepp 的“--silent”选项。

.DELETE_ON_ERROR
.EXPORT_ALL_VARIABLES
.NOEXPORT
.POSIX
。默认
这些目标不受支持,只是被忽略。

· 当前不支持GNU make 函数“eval”、“flavor”和“value”。 你
可以使用 "$[...]" 以更直接的方式实现与 eval 相同的功能
变量或函数扩展。

· 不完全支持双冒号规则。 (它们不能是:在 makepp 的范式中,
更新目标的方法不能超过一种。)目前,每个连续的
给定目标的双冒号规则只是附加其命令字符串和依赖项
list 到此目标的命令字符串和依赖项列表。 例如,如果你
写这个:

一:二
&cat b -oa

# 稍后在你的 makefile 中:
一::三
&cat c -o >>a

它是 究竟 就像你写的一样

一:公元前
&cat b -oa
&cat c -o >>a

这当然不是双冒号规则的目的,也不总是
工作,但它确实适用于“干净”之类的目标或所有
ExtUtils::MakeMaker 放入其生成文件。 不要指望它做任何其他事情
比传统的makefile。

· "$(wildcard )" 函数不仅匹配存在的文件,还匹配存在的文件
尚不存在,但其中有 makepp 当时看到的规则
“$(wildcard)”函数被评估。

· 支持“define”语句,但处理它前面的“@”
不一样。 当前在 makepp 中,“@”位于具有多行的变量前
value 只会抑制第一行的回声。 例如,

定义回声线
&echo line1 -o $@
&echo line2 -o>>$@
恩德夫

x:
@$(回声线)

不会像在 GNU make 中那样抑制“&echo line2”的打印; 它只会
禁止打印“&echo line1”。

· Makepp 不支持以下环境变量(它不设置它们,
它只是忽略它们):

改头换面
标志

不兼容性 in 秩序 of 表达 扩张
· 在 makepp 中,在保证所有依赖项之前扩展规则操作
已经建成。 您可以通过更改以下规则来解决此问题:

富:酒吧
genfoo < $(shell cat bar)



富:酒吧
genfoo <`猫吧`

或者这个,这将使文件在扩展过程中:

富:酒吧
genfoo < $(&cat $(make bar))

这在这里更可取,因为列出的文件 酒吧 也是这个的依赖
规则,makepp 现在可以在词法分析重定向时捕获它。

· 虽然我还没有看到使用过这个,但 GNU make 允许以下内容:

冒号 = :
a$(冒号) b
回声 $^

Makepp 扩展 "$(colon)" 太晚了,无法正常工作。 然而它提供了
替代的“$[colon]”语法,它可以做的比 GNU make 多得多,因为它是
很早就扩张了。

“$(制作)” 五月 包括 剩余名额
在卸载的 makepp 中或者如果平台似乎不支持启动 Perl 脚本
通过幻数或“--traditional-recursive-make”这个变量将至少包括
一个空间。 将其用作命令时,这不是问题。 但是当它作为一个
脚本的不带引号的参数(如 Perl 5.14.0 构建系统所做的那样),它会撕裂它
拆分成单独的参数,导致混淆。 所以作为参数更安全
将其引用为“$(MAKE)”。 这不会破坏向后兼容性。

特定目标 任务 传播
Makepp 的特定于目标的变量与 GNU make 的稍有不同,因为它们
仅适用于提到的一个文件的规则,而不适用于其任何前身; 看
针对特定目标的分配。

括弧 or 背带
Makepp 在第一个匹配的括号或大括号处结束表达式。 而不是这个

$(somefunction ... ( ) ...) # GNU make 风格

您必须使用其中任何一个

${somefunction ... ( ) ...} # GNU 兼容
$((somefunction ... ( ) ...)) # Makepp 扩展

这可能会在 2.1 版中修复,也可能是可选的。

未成年人
模式依赖与虚假目标不匹配
%.a: %.b; ...
$(虚假的xb): ; ... # 不提供构建 xa 的方法

评论没有续行
# 这是 \
不是两行注释

命令 线 不兼容性


Makepp 支持一些 make 更有用的命令行选项。 然而,以下
不支持:

-d 或 --debug
-F -
Makepp 的内部 makefile 对象链接到文件对象,因此无法处理
标准输入。

-i
-l 或 --load-average 或 --max-load
-m Makepp 的“-m”选项与签名方法选择有关,而 GNU make
忽略 -m。

-p 或 --print-data-base
-q 或 --question
-R 或 --no-builtin-variables
Makepp 的“-R”选项实际上做了一些完全不同的事情。

-S --no-keep-going 或 --stop
“--stop”选项在学习了所有规则后停止(进入睡眠)makepp,所以你
可以继续编辑。

-t 或 --touch
-w 或 --print-directory
这会自动发生。

--警告未定义变量

如果有人关心,其中一些可以很容易地得到支持。

变量 不兼容性


Makepp 在 $PATH 中查找匹配的命令以返回诸如“$(CC)”或
"$(CXX)",而 GNU make 有静态默认值。 makepp 也优先考虑“gcc”和
"g++" 虽然令人惊讶的是 GNU make 为前者返回了 "cc",但对于
后者。 您可以在 makefile 中、在命令行上或通过导出
调用 makepp 之前的同名变量。

使用 onworks.net 服务在线使用 makepp_incompatibility


免费服务器和工作站

下载 Windows 和 Linux 应用程序

Linux 命令

Ad