如何为某些文件制作可配置的makefile和可选配置?

时间:2015-06-04 09:32:27

标签: makefile gnu-make

我制作了makefile,可以制作可打印的演示版本。

工作原理:

  1. 为每个演示文稿制作图块
  2. 将演示文稿连接成一个大文件
  3. 尚未完成:向网页添加数字
  4. Makefile

    SLIDES_BASE_NAME := presentation-prefix-
    
    FILES := $(shell ls $(SLIDES_BASE_NAME)*.pdf)
    
    OUT_DIR := generated
    SLIDES_DIR := $(OUT_DIR)/slides
    SLIDES := $(addprefix $(SLIDES_DIR)/, $(FILES))
    SLIDES_CONCAT := $(OUT_DIR)/slides-oneside-print.pdf
    
    CFG_FILE := config.env
    
    TRIM := 0 0.36cm 0 0
    # TODO: read global config
    
    $(SLIDES_DIR)/%.pdf : %.pdf
        @echo Generating: $< "->" $@
        @# TODO: read optional local config - "$<.cfg"
        @pdfjam --nup 2x4 $< --outfile $@ --delta "0.1cm 0.1cm" --a4paper --frame True --trim "$(TRIM)" --clip True --width '9.45cm'; 
    
    all: $(SLIDES_CONCAT)
    
    $(SLIDES_CONCAT): $(SLIDES)
        @echo Generating: $@ from $^
        @pdfjam $(SLIDES) -o $@
    
    $(SLIDES): | $(SLIDES_DIR)
    
    $(SLIDES_DIR):
        mkdir -p $(SLIDES_DIR)
    
    clean:
        rm -rf $(OUT_DIR)
    

    我想让它可配置。请参阅Makefile中的“TODO”。

    如何添加全局配置文件:

    • 读取属性TRIM(更多属性即将到来,因此无法使用TRIM := $(shell cat ...))。
    • 当全局配置文件发生变化时,我运行make,然后一切都被重新制作。

    有些教授的演示风格不一致,所以:我如何为每个文件添加可选配置:

      从配置覆盖
    • 属性
    • 不是必需的,但如果存在且已更改 - 导致重建某些演示文稿

    我一直在考虑changind规则: $(SLIDES_DIR)/%.pdf : %.pdf它将依赖于全局cfg,并且可选地依赖于当前表示的可选配置文件,然后将规则的内容包装到我自己的脚本中并将所有文件名传递给该脚本。

    但是,我不知道这样做的正确方法是什么。谢谢你的帮助:)

1 个答案:

答案 0 :(得分:0)

这是让你一路走来的东西。他们的配置文件当然要在Make语言中编写。

所以你开始使用"include"。您将看到可以从变量或文件名模式中设置包含名称,以便为本地文件名提供可选或有条件的方式。

您需要注意包含与其控制的事物相关的位置。你可能不得不从使用:=(在宏中扩展)切换到=(在使用变量时展开)

至于确保在配置文件发生变化时事情发生变化,那就是配置文件只是在变化时必须运行的事物的依赖关系。我将其作为变量放在下面,因此您不必列出所有配置文件,本地,全局等。

例如,在autoconf系统中,config.statusconfig.h就是这样的配置文件;通过查看其中一个makefile配置生成,看看它在autoconf系统中是如何工作的。

这是一个让你入门的小例子。假设所有这些文件都在同一目录中。使用以下命令创建名为global-config.mk的全局配置makefile:

 TRIM = 0 0.72cm 0 0

和名为local-config.mk的可选本地配置文件,其中包含:

 LOCAL_USED=yep

现在你的主要Makefile将包含这个结构:

TRIM = 0 0.36cm 0 0  # used if not in any config file
LOCAL_USED=nope 
local_config=$(wildcard local-config.mk) # optional config
CONFIG_FILES=global-config.mk $(local_config)
include global-config.mk $(CONFIG_FILES)

slides: $(CONFIG_FILES)  # and other dependencies here
    @echo trim is $(TRIM)
    @echo local used $(LOCAL_USED)

现在尝试运行make slides。我明白了:

$ make slides
trim is 0 0.72cm 0 0
local used yep

他们在评论global-config.mk

中的一行后尝试了
# TRIM = 0 0.72cm 0 0

我明白了:

$ make slides
trim is 0 0.36cm 0 0
local used yep

最后删除local-config.mk。我明白了:

$ make slides
trim is 0 0.36cm 0 0
local used nope