欢迎光临散文网 会员登陆 & 注册

杂说1 —— make、Makefile

2023-04-13 14:29 作者:FineClassFuture  | 我要投稿

    对于小项目来说,使用make(借个词“自动化”)足够了

    只要用到最基本的规则就够了,配合一点通配和内置函数使使用更灵活

make -j 问题

    make -jN 可以多线程编译,比其它系统慢就慢吧,小项目也就十几秒几十秒的时间,又何必在意。

    上面的写法,使用make -jN会有个提示

make[1]: warning: jobserver unavailable: using -j1.  Add '+' to parent make rule.

    搜索到https://qa.1r1g.com/sf/ask/4249190851/,底下的回答说明了

(看着应该是机翻)

GNU make 手册对这个错误有很好的解释。关键是:'make' 不会将有关 jobserver 的信息传递给被调用的进程,除非确定被调用的进程也是 'make'。

'警告:作业服务器不可用:使用 -j1。将“+”添加到父生成规则。

为了使进程进行通信,父进程将信息传递给子进程。因为如果子进程实际上不是一个 make,这可能会导致问题,所以父进程只有在它认为子进程是一个 make 时才会这样做。父级使用普通算法来确定这一点(请参阅MAKE 变量的工作原理)。如果 makefile 的构造使得父进程不知道子进程是一个 make 进程,那么子进程将只收到部分必要的信息。在这种情况下,子进程将生成此警告消息并按顺序进行构建。

错误描述中引用的 MAKE 变量如何工作部分指定了两种告诉 'make' 调用的进程是 'make' 的另一个实例的方法:使用$(MAKE)+。它指出:

  1. $(MAKE)在配方中调用“make”时应该使用变量。

    递归 make 命令应始终使用变量 MAKE,而不是显式命令名称“make”,如下所示:

    subsystem:        cd subdir && $(MAKE)
  2. 在配方中调用“make”的行之前使用$(MAKE)和放置 a+具有相同的效果

    使用 MAKE 变量与在配方行的开头使用“+”字符具有相同的效果。

  3. 只有当您明确输入MAKE配方时,魔法才会发生。如果不是这种情况,请使用+.

    仅当 MAKE 变量直接出现在配方中时才启用此特殊功能:如果 MAKE 变量是通过扩展另一个变量引用的,则它不适用。在后一种情况下,您必须使用“+”标记来获得这些特殊效果。

所以要改一改自己的习惯了,编写时使用$(MAKE)替代make



杂说1 —— make、Makefile的评论 (共 条)

分享到微博请遵守国家法律