【问题标题】:Randomize Make goals for a target为目标制定目标
【发布时间】:2016-09-27 04:50:35
【问题描述】:

我有一个 C++ 库,它有一些 C++ 静态对象。该库可能会遭受 C++ 静态初始化失败。我正在尝试通过在构建期间随机化 *.o 文件的顺序来审查无法预料的翻译单元依赖关系。

我访问了 GNU 手册中的2.3 How make Processes a Makefile,它告诉我:

目标是最终努力更新的目标。您可以使用命令行覆盖此行为(请参阅指定目标的参数)...

我也关注了9.2 Arguments to Specify the Goals,但没有提供治疗。这并不让我感到惊讶。

是否可以让 Make 随机化其目标?如果是这样,那我该怎么做呢?

如果没有,还有其他选择吗?这是在测试环境中,所以我有更多可用的工具,而不仅仅是 GNUmake。

提前致谢。

【问题讨论】:

    标签: gnu-make target static-order-fiasco


    【解决方案1】:

    这实际上是实现定义的,但 GNU Make 会从左到右处理目标。

    假设您有一个 OBJS 变量,其中包含要随机化的对象,您可以编写类似的内容(例如使用 shuf):

    RAND_OBJS := $(shell shuf -e -- $(OBJS))
    random_build: $(RAND_OBJS)
    

    只要您不使用并行 make(-j 选项),这就是成立的。如果你是,顺序仍然是随机的,但也取决于作业数量、系统负载、当前月相等。

    【讨论】:

    • 谢谢安德里亚。我们确实使用-j 选项。这是否意味着它不可能?我不清楚-jRAND_OBJS 的意义是什么。天真地,我想象一个随机列表,每个工作线程都从列表的头部拉出。
    • 对不起,我不是很清楚。它仍然是随机的,但当然你会有一些线程会扭曲来自shuf 的顺序——不过,这不是你关心的事情。实际上,您尝试解决的问题通常发生在链接时(当 init 部分合并到 init 数组时),因此随机化链接顺序应该足够了。
    • 是的,正是……我将记录SOURCESOBJECTS,所以我只需要解决一个问题。
    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 2022-12-11
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    相关资源
    最近更新 更多