【问题标题】:using MAKEFILE to copy files before compilation and delete them after编译前使用 MAKEFILE 复制文件,编译后删除
【发布时间】:2017-12-18 06:56:04
【问题描述】:

我试图在编译之前复制文件(我有两个同名的源文件,所以我将文件复制到一个不同名称的文件中)并在 MAKEFILE 末尾删除它们。 我正在尝试执行以下操作,但执行顺序可能不匹配。 我怎样才能正确地做到这一点?

all: copy_dup_files $(dst_dir) $(APP_TARGET_LIB) delete_dup_files

copy_dup_files:  
    @echo "COPYING DUP FILES"
    $(shell cp /aaa/hmac.c /aaa/hmac1.c )
    $(shell cp /bbb/hmac.c /bbb/hmac2.c )

delete_dup_files:
    @echo "DELETING DUP FILES"
    $(shell rm /aaa/hmac1.c )
    $(shell rm /bbb/hmac2.c )

谢谢

【问题讨论】:

    标签: c makefile gnu-make


    【解决方案1】:

    $(shell) 的目的是产生一个 Make 读取的输出。配方行根本不应该有这种结构。

    # this is evaluated when the Makefile is read
    value := $(shell echo "Use the shell to produce a value for a variable")
    
    # this is evaluated when you say "make foo"
    foo:
        echo 'No $$(shell ...) stuff here'
    

    因此,您尝试中的所有 $(shell ...) 内容都会在读取 Makefile 时进行评估,但在执行任何实际目标之前。

    【讨论】:

    • 顺便说一句,在编译之前复制文件本身似乎是一种反模式。你为什么这样做,你实际上想要完成什么......?
    【解决方案2】:

    您的 makefile 试图说 /aaa/hmac1.c 依赖于 /aaa/hmac.c。 因此我们有:

    /aaa/hmac1.c: /aaa/hmac.c
        cp $< $@
    
    /bbb/hmac2.c: /bbb/hmac.c
        cp $< $@
    
    /aaa/hmac1.o /bbb/hmac2.o: %.o: %.c
        gcc $< -o $@
    
    myprog: /aaa/hmac1.o /bbb/hmac2.o
        gcc $^ -o $@
    

    这是干净且并行安全的(对任何 makefile 的良好测试)。

    你可以做出无数的风格改进,比如

    • 摆脱绝对路径
    • 使用符号链接而不是复制
    • 自动生成依赖项(用于.h 文件等)
    • 不要玷污源代码树 - 将所有中间文件(.os 和临时 .cs)放在它们自己的构建文件夹中

    &c。等等。

    【讨论】:

    • 最后我还需要删除 hmac1.c & hmac2.c。如何做到这一点?
    • @RanTeshuva 就我个人而言,我会把它们留在身边。以与您考虑 .o 文件相同的方式考虑它们。由于它们是构建产品,我将在目标文件所在的相同临时文件夹中创建它们。
    • @RanTeshuva 如果你真的想删除它们,那么在编译的配方中创建和删除它们。拥有一个重量级的copy_dup_files 步骤可以一次性完成所有复制是错误的步骤。 Make 更喜欢细粒度的依赖项(然后在并行构建中运行良好)。
    猜你喜欢
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多