【问题标题】:Making make print commands before executing when NOT using CMake在不使用 CMake 时执行之前制作 make 打印命令
【发布时间】:2012-06-15 19:25:52
【问题描述】:

我发现这是同一个问题

Making cmake print commands before executing

但是这个答案对我不起作用。我猜这个答案只适用于cmake。哪些选项不使用 cmake?

注意尝试了这些

make VERBOSE=1 target
make target VERBOSE=1
VERBOSE=1 make target
make V=1 target
make target V=1
V=1 make target
make -V target
make -v target

它们都不起作用。

make -v 返回

GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for x86_64-pc-linux-gnu

【问题讨论】:

标签: makefile


【解决方案1】:

默认情况下,make 在执行之前会打印每个命令。可以通过以下机制之一抑制此打印:

  • 根据具体情况,在命令开头添加@
  • 全局,通过添加 .SILENT 内置目标。
  • 在制作过程中的某个地方,通过使用标志之一调用子制作-s--silent--quiet,例如$(MAKE) --silent -C someDir。从那一刻起,命令回显在子制作中被抑制。

如果您的 makefile 没有打印命令,那么它可能使用了这三种机制之一,您必须实际检查 makefile(s) 以确定哪个。

作为避免这些回声抑制机制的解决方法,您可以重新定义 shell 以使用调试模式,例如 make SHELL="/bin/bash -x" target。其他 shell 也有类似的选项。使用这种方法,打印命令的不是make,而是shell 本身。

如果您使用标志-n--just-print,回声抑制机制将被忽略,您将始终看到make 认为应该执行的所有命令——但它们并没有实际执行,只是打印出来.这可能是了解您实际期望看到的内容的好方法。

VERBOSE 变量对于 make 没有标准含义,但前提是您的 makefile 可以解释它。

【讨论】:

  • 所以没有办法让 make 打印它正在执行的内容? -n 不起作用,因为我需要看到它在上下文中失败,并且无论出于何种原因,执行 -n 的输出与没有它的情况不同。
  • 默认情况下,make 打印它正在执行的内容。我说的是你的makefile(s)可能使用一种机制来抑制这种回显,或者通过命令前面的@符号,或者通过内置目标.SILENT。您必须查看 makefile 以查看是否确实如此。
  • 谢谢,我想我希望有一个像 --verbose-level=10000000 或 --ignore-silent 这样的覆盖,我无法控制我的 makefile。我的项目有超过 500 名程序员。
  • 啊哈...好吧,作为最后的手段,您可以通过在运行 make 时定义 SHELL=/bin/bash -x 来解决问题——假设您可以使用 bash。由于make 使用在$SHELL 中找到的值来执行命令,这将导致由于-x 标志而首先回显每个命令。我会将其添加到答案中,让我知道这是否适合您。
  • 这很奇怪。对我来说,make SHELL="/bin/bash -x" target 显示所有已执行的 shell 命令,与生成文件的外观无关。当您说“不走运”时,这是否意味着您根本看不到任何不同,或者它是否打印了某些内容但不是您想要的命令?如果您先执行make clean,然后执行make SHELL="/bin/bash -x" target,会怎样?
【解决方案2】:

对于我的 make 版本,我发现 -n-d 两个参数都有帮助。

GNU Make 3.80 版权所有 (C) 2002 Free Software Foundation, Inc

  -d                          Print lots of debugging information.
  -n, --just-print, --dry-run, --recon
                              Don't actually run any commands; just print them.

当包含一堆 makefile 片段时,如果没有这个关键调试标志,行号就没有意义。

CreateProcess(....exe,...)
Reading makefile `../../../../build/Makefile.options' (search path) (don't care) (no ~ expansion)...
Makefile:361: Extraneous text after `else' directive
Makefile:368: Extraneous text after `else' directive
Makefile:368: *** only one `else' per conditional.  Stop.

【讨论】:

    【解决方案3】:

    我认为这就是你想要的: 使 MAKE_VERBOSE=1 目标

    【讨论】:

    • “MAKE_VERBOSE”make 变量对 make 本身没有特殊意义,除非您的 makefile 定义并使用它。
    【解决方案4】:

    在我的情况下,我可以通过在我的 make 文件顶部设置以下变量来抑制输出中的命令

    # Use `make V=1` to print commands.
    $(V).SILENT:
    

    在你的make文件顶部添加上面的行,当你调用任何目标时它不会打印

    之前:

    muhasan@admins-MacBook-Pro fx.identitymanagement % make dockerstatus
    cd identity.API/ && docker-compose ps 
            Name                       Command              State           Ports         
    --------------------------------------------------------------------------------------
    identityapi_backend_1   dotnet Identity.API.dll         Up      0.0.0.0:5000->80/tcp  
    identityapi_db_1        docker-entrypoint.sh postgres   Up      0.0.0.0:5432->5432/tcp
    muhasan@admins-MacBook-Pro fx.identitymanagement % 
    

    之后:

    muhasan@admins-MacBook-Pro fx.identitymanagement % make dockerstatus
            Name                       Command              State           Ports         
    --------------------------------------------------------------------------------------
    identityapi_backend_1   dotnet Identity.API.dll         Up      0.0.0.0:5000->80/tcp  
    identityapi_db_1        docker-entrypoint.sh postgres   Up      0.0.0.0:5432->5432/tcp
    muhasan@admins-MacBook-Pro fx.identitymanagement % 
     
    

    我的 Makefile

    # Use `make V=1` to print commands.
    $(V).SILENT:
    Path = identity.API
    builddocker:
        cd devops && cp -rv Dockerfile docker-compose.yml ../${Path}/ && cd ..
    installdocker:
        cd ${Path}/ && docker-compose up -d
    dockerstatus:
        cd ${Path}/ && docker-compose ps    
    

    【讨论】:

      猜你喜欢
      • 2011-06-16
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 2019-04-12
      • 1970-01-01
      相关资源
      最近更新 更多