仅使用Make创建项目的用户配置的标准做法是什么?

时间:2017-08-23 16:38:16

标签: makefile gnu-make

仅使用Make的用户配置项目的标准做法是什么?具体来说,我想知道如何让用户在不使用autotools或CMake等实用程序的情况下交流库和安装位置等内容。我已经看到一些项目在Makefile中将某些变量留空,这些变量由用户填写。从某种意义上说,如果Makefile本身处于版本控制之下,这会感觉不理想,这将注册为一个更改,并且可能不应该签入。这也使得有多个配置存在尴尬。似乎应该有一种方法可以让外部配置文件包含用户可能改变的标志,但我不知道如何实现这一点或是否是正常的做法。

编辑1

好吧,这是一次尝试,但我仍然对是否有更好的方法感兴趣。对于Makefile

ifndef CONFIG
ifeq (,$(findstring config,$(MAKECMDGOALS)))
$(error Usage: make CONFIG=<configuration> or make config)
endif
else
include ${CONFIG}
endif

all:
    $(info Name is $(Name))
    $(info Age is $(Age))
    $(info Profession is $(Profession)) 
    @:

.PHONY: config
config:
    $(info Name :=)
    $(info Age :=)
    $(info Profession :=)
    @:

然后,运行make给出

Makefile:3: *** Usage: make CONFIG=<configuration> or make config.  Stop.

正在运行make config

Name :=
Age :=
Profession :=

表面上,我们运行类似make config > bob.config的内容,然后填写

等详细信息
Name := Bob
Age := 23
Profession := Carpenter

然后,运行make CONFIG=bob.config all给出

Name is Bob
Age is 23
Profession is Carpenter

这或多或少都符合我的要求,但是,我想知道是否有更好或更标准的方法来处理这个问题。

1 个答案:

答案 0 :(得分:0)

我认为你有一些选择。

首先:您创建一些包含不同参数/选项的包含文件,make将包含取决于参数:

# Makefile
ifdef v1
include vars.v1
endif

ifdef v2
include vars.v2
endif

如果您需要v1make -Dv1

第二:您将定义包含在Makefile

# Makefile
ifdef v1
destdir=...
flags=...
endif

ifdef v2
destdir=...
flags=...
endif

第三:您将通过CLI传递参数,但如果您有许多参数(也许您可以使用shell脚本或别名),我认为这很复杂。