makefile中的预构建步骤

zxc*_*cat 30 makefile prebuild

如何运行必须在所有其他makefile命令之前执行的脚本?如果没有什么可构建的话,脚本的执行会很好(但不是强制性的).

我搜索了SO和谷歌,但找不到任何东西.

我有这个解决方法:

# myscript.bat output is empty
CHEAT_ARGUMENT = (shell myscript.bat)
CFLAGS += -DCHEAT_ARGUMENT=$(CHEAT_ARGUMENT)
AFLAGS += -DCHEAT_ARGUMENT=$(CHEAT_ARGUMENT)
Run Code Online (Sandbox Code Playgroud)

但它非常难看.还有其他方法可以在makefile中运行" pre-build step " 吗?

Amr*_*mro 29

我提出两种解决方案.第一个模仿NetBeans IDE生成的内容:

CC=gcc

.PHONY: all clean

all: post-build

pre-build:
    @echo PRE

post-build: main-build
    @echo POST

main-build: pre-build
    @$(MAKE) --no-print-directory target

target: $(OBJS)
    $(CC) -o $@ $(OBJS)

clean:
    rm -f $(OBJS) target
Run Code Online (Sandbox Code Playgroud)

第二个是Eclipse IDE生成的:

CC=gcc

.PHONY: all clean
.SECONDARY: main-build

all: pre-build main-build

pre-build:
    @echo PRE

post-build:
    @echo POST

main-build: target

target: $(OBJS)
    $(CC) -o $@ $(OBJS)
    @$(MAKE) --no-print-directory post-build

clean:
    rm -f $(OBJS) target
Run Code Online (Sandbox Code Playgroud)

请注意,在第一个版本中,无论主要版本是否确定为最新版本,都始终调用前置和后置构建.

在第二个中,如果主构建的状态是最新的,则不执行构建后步骤.虽然预构建步骤总是在两者中执行.

  • 在第二个示例中,pre-build不必在main-build之前运行,因为它们之间没有依赖关系.如果你做并行制作,请注意这一点. (8认同)

ndi*_*dim 11

根据您的make版本,如果CFLAGS和AFLAGS被评估了数十次,那么至少应该避免运行几十次:

CHEAT_ARG := $(shell myscript)
Run Code Online (Sandbox Code Playgroud)

注意冒号.

这只运行一次.永远不会超过一次,但也不会少于一次.选择自己的权衡.


ndi*_*dim 5

您可以向Makefile添加一个特殊目标,并使所有构建规则依赖于:

run-script:
    myscript

.o.c: run-script
     $(CC) $(CFLAGS) -o $@ $<

.o.S: run-script
     $(AS) $(AFLAGS) -o $@ $<
Run Code Online (Sandbox Code Playgroud)

根据您的脚本实际执行的操作,将其在Makefile(在autoconf术语中配置阶段)之前的阶段中运行一次可能会更有意义(并且工作量更少).

  • 无论有多少其他目标,脚本最多都不会运行一次.试试吧. (2认同)