2017-12-18 153 views
-2

我试图复制文件befoe编译(我有两个源文件具有相同的名称,因此我将这些文件复制到具有不同名称的文件),并在最后删除它们的MAKEFILE。 我正在尝试做下列事情,但可能在执行顺序中存在不匹配。 我该如何正确地做到这一点?使用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) 

由于

回答

2

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

# 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' 

所以,当读Makefile都在你的企图$(shell ...)东西被评估,但在执行任何实际的目标之前。

+4

顺便说一句,在编译之前复制文件本身就像是一个反模式。你为什么这么做,你究竟在做什么*试图完成......? – tripleee

0

您的生成文件试图说/aaa/hmac1.c取决于/aaa/hmac.c。 因此,我们有:

/aaa/hmac1.c: /aaa/hmac.c 
    cp $< [email protected] 

/bbb/hmac2.c: /bbb/hmac.c 
    cp $< [email protected] 

/aaa/hmac1.o /bbb/hmac2.o: %.o: %.c 
    gcc $< -o [email protected] 

myprog: /aaa/hmac1.o /bbb/hmac2.o 
    gcc $^ -o [email protected] 

这是干净的,安全的平行(任何生成文件的一个很好的测试)。

有无数风格的改进,你可以做,像

  • 摆脱了绝对路径的
  • 使用符号链接,而不是复制
  • 自动依存产生的(对于.h文件等)
  • 不要污染源树—将所有中间文件(.o和临时.c s)放在它们自己的生成文件夹中

& c。 & c。

+0

我还需要在最后删除hmac1.c&hmac2.c。如何做到这一点? –

+0

@RanTeshuva我个人会离开他们。想想他们的方式与您对'.o'文件的思考方式相同。由于它们是构建产品,因此我会在与目标文件相同的临时文件夹中创建它们。 – bobbogo

+0

@RanTeshuva如果您确实想删除它们,请在配方中创建并删除它们以进行编译。有一个重量级的'copy_dup_files'步骤可以一次完成所有的拷贝,这是一个错误的步骤。 _Make_更喜欢细粒度的依赖关系(然后在并行构建中运行良好)。 – bobbogo

相关问题