仅使用Make的用户配置项目的标准做法是什么?具体来说,我想知道如何让用户在不使用autotools或CMake等实用程序的情况下交流库和安装位置等内容。我已经看到一些项目在Makefile中将某些变量留空,这些变量由用户填写。从某种意义上说,如果Makefile本身处于版本控制之下,这会感觉不理想,这将注册为一个更改,并且可能不应该签入。这也使得有多个配置存在尴尬。似乎应该有一种方法可以让外部配置文件包含用户可能改变的标志,但我不知道如何实现这一点或是否是正常的做法。
好吧,这是一次尝试,但我仍然对是否有更好的方法感兴趣。对于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
这或多或少都符合我的要求,但是,我想知道是否有更好或更标准的方法来处理这个问题。
答案 0 :(得分:0)
我认为你有一些选择。
首先:您创建一些包含不同参数/选项的包含文件,make
将包含取决于参数:
# Makefile
ifdef v1
include vars.v1
endif
ifdef v2
include vars.v2
endif
如果您需要v1
:make -Dv1
。
第二:您将定义包含在Makefile
:
# Makefile
ifdef v1
destdir=...
flags=...
endif
ifdef v2
destdir=...
flags=...
endif
第三:您将通过CLI传递参数,但如果您有许多参数(也许您可以使用shell脚本或别名),我认为这很复杂。