【问题标题】:Make "make" default to "make -j 8"使“make”默认为“make -j 8”
【发布时间】:2026-02-18 08:35:01
【问题描述】:

有什么办法可以做

$ make

默认为:

$ make -j 8

?

【问题讨论】:

    标签: makefile alias bash


    【解决方案1】:

    将环境变量 MAKEFLAGS 设置为 -j 8。如果您使用 csh 或 tcsh,您可以使用 setenv MAKEFLAGS '-j 8' 执行此操作。如果您使用的是 bash,则可以使用 export MAKEFLAGS='-j 8' 执行此操作。您可能希望将此命令放在 shell 的启动文件中,例如 .cshrc 或 .bashrc(在您的主目录中)。

    注意:像这样设置默认值将适用于所有 make 调用,包括当您“制作”一个不是您自己的项目或运行调用 make 的脚本时。如果项目设计得不好,在构建多个作业并行执行时可能会出现问题。

    【讨论】:

      【解决方案2】:

      建议alias make='make -j 8' 的答案很好地回答了您的问题。

      但是,我建议不要这样做!

      无论如何,请使用别名来节省输入 - 但将其命名为 make 以外的其他名称。

      对于您当前正在从事的任何项目都可能没问题;但是很可能编写缺少依赖项的makefile,这些依赖项不能很好地与-j一起工作,如果你遇到这样的事情,你会想知道为什么构建对你来说以一种神秘的方式失败,但对其他人来说却很好人。

      (也就是说,如果你别名make,你可以通过输入\make让bash忽略别名。)

      【讨论】:

      • 为什么不像 Eric 所说的那样建议使用 MAKEFLAGS 环境变量?
      【解决方案3】:

      alias make="make -j 8",假设是 bash shell

      【讨论】:

      • wait .. 这怎么不递归调用 make 即 make -> make -j 8 -> make -j 8 -j 8 -> make -j 8 -j 8 -j 8
      • 别名将make命令改为默认'make -j 8' 不调用make命令。
      • 这也可以放在 .bashrc 文件中,这样你就不必在每个 shell 中输入它,.bashrc 在你的主目录中(至少在 Debian 中)。
      【解决方案4】:

      如果你使用的是命令行,你可以这样做:

      alias make='make -j 8'
      

      这将是临时的,要使其永久化,您需要将其添加到 .bashrc

      在这里阅读:http://www.linfo.org/make_alias_permanent.html

      【讨论】:

        【解决方案5】:

        添加

        MAKEOPTS='-j8'
        MAKEFLAGS='-j8'
        

        /etc/make.conf(如果它不存在就创建它)。

        如果这不起作用,请添加

        export MAKEOPTS='-j8'
        export MAKEFLAGS='-j8'
        

        到您的系统范围的配置文件(例如,/etc/profile)。

        对我来说,单独使用 MAKEOPTS 是行不通的。可能只需要 MAKEFLAGS。

        【讨论】:

        • 只是让你知道,也不能让它工作。 gist.github.com/sanmai/dcc31ae20afa6e8ba4721f174fe05fd9
        • 检查要点自己看看。 MAKEFLAGS 只能保留 -j,没有数字
        • @sanmai 当我使用 GNU Make 4.2.1 运行 Makefile 时(我的 strings /usr/bin/make | grep MAKEOPTS 也没有输出任何内容),我得到 ' -j4 --jobserver-auth=3,4' must have --jobs=4
        • 嗯,好像是they added this feature in 4.2。现在没有简单的方法在 Debian 中获得 4.2...
        【解决方案6】:

        为什么不创建一个外部makefile,像这样调用另一个makefile,这是从手册here复制的。

        子目录 = foo bar baz .PHONY: 子目录 $(SUBDIRS) 子目录:$(子目录) $(子目录): $(MAKE) -j 8 -C $@ 富:巴兹

        【讨论】:

        • 通常当你想要这种类型的行为时,它是每台机器,而不是项目。
        【解决方案7】:

        如果您使用的是 GNU make:

        $ make --version
        GNU Make 4.2.1
        Built for x86_64-alpine-linux-musl
        

        ...然后我发现GNUMAKEFLAGS 似乎可以工作:

        export GNUMAKEFLAGS=-j8
        make
        

        免责声明,我是 C 工具链的 n00b,如果这不是可移植的,我很抱歉。不过它在 Alpine Linux 3.8(在 Docker 中)上运行。

        【讨论】:

          【解决方案8】:

          您可以将/usr/bin/make 移动到/usr/bin/make_orig 并制作/usr/bin/make 这个脚本:

          #!/bin/sh
          
          /usr/bin/make_orig -j 8 $@
          

          一定要运行chmod +x /usr/bin/make

          如果my other answer 中更简单的方法不起作用,请尝试此方法。这种方法不太安全,而且有点笨拙。

          【讨论】:

          • 这简直太糟糕了。想象一下,如果您需要更新您的 make 二进制文件。
          • @sanmai 是的,MAKEOPTS 更好;参看。 my other answer above.