2015-02-24 35 views
1

我有一个Makefile以下逻辑:编程选择子的makefile运行make时包括

ifdef INCLUDE_FILE 
$(shell cp $(INCLUDE_FILE) include.make) 
else 
$(shell cp -n default.make include.make) 
endif 

include include.make 

预期的行为是:

  • 如果一个人只是运行makeinclude.make存在,包括include.make。否则,将默认文件复制到include.make然后包括在内。
  • 如果其中一个运行make INCLUDE_FILE=myinclude.make,则复制并包含myinclude.make

这似乎很好地工作,以便生成文件自定义(编译标志等)在include.make,这将持续存在,如果一个做类似

$make INCLUDE_FILE=myinclude.make 
$... 
$make 

,但也让新用户只需键入make和请参阅默认行为。

我的问题是

  • 这是好/标准(GNU)生成文件的做法?
  • 是否存在严重的可移植性问题? [也就是说,依靠cp这样危险吗?]
  • 有没有更好的替代方法来实现类似的行为?

回答

0

你为什么不只是使用:

INCLUDE_FILE := $(firstword $(wildcard include.make default.make)) 

include $(INCLUDE_FILE) 

?这将包括include.make(如果存在)或default.make,或者如果在命令行上定义INCLUDE_FILE,它将覆盖makefile中的设置。

+1

这非常接近我想要的行为,除了我相信如果我运行'make INCLUDE_FILE = myinclude.make; ... 工作工作工作 ..; make',第二个'make'将包含'default.make'中的命令,而不是'myinclude.make'中的命令。也就是说,我想'include.make'作为永久配置存在,它(至少天真地)似乎需要一些与文件系统的交互。 – 2015-02-24 15:25:55

1

如果这个意图是坚持下去的,那么我认为这个想法是合理的,尽管我不会这样实施它。

我可能会这样做,而不是。

include include.mk 

include.mk: 
     @cp $(or $(INCLUDE_FILE),default.mk) [email protected] 

假设您希望复制只发生一次(除非include.mk被手动删除)。还有其他一些方法可以完成再次处理复制(如果default.mk发生变化等,但那些需要更多关于您的目标的信息)。

总是通过include.mk复制的最简单(虽然破解)的方式很可能会在上面的makefile代码片段中添加如下内容。

ifdef INCLUDE_FILE 
.PHONY: $(INCLUDE_FILE) 

include.mk: $(INCLUDE_FILE) 
endif 

尽管这样可以多次复制文件。您也可以在$(MAKE_RESTARTS)上添加一个支票以避免这种情况。包括

包括包括。MK

include.mk: 
     cp $(or $(INCLUDE_FILE),default.mk) [email protected] 

ifdef INCLUDE_FILE 
ifndef MAKE_RESTARTS 
.PHONY: $(INCLUDE_FILE) 

include.mk: $(INCLUDE_FILE) 
endif 
endif 

这是稍微滥用正常目标的行为,当它指定一个.PHONY目标为前提,但它似乎工作,是的,我认为,仅仅依靠记录的行为。

+0

如果'include.mk'不存在并且如果明确指定了'INCLUDE_FILE',我想要复制发生。具体来说,我想让'INCLUDE_FILE = myinclude.mk'总是覆盖'include.mk'。 – 2015-02-24 15:56:17