Make parameter Unterscheidung

rubricanis

Homo ludens
Ich möchte in einem gmake Makefile 3 parameter zur Konfiguration unterschieden, die ich hier mal aaa, bbb und ccc nenne. Auf der Kommandozeile soll das also so aussehen: gmake config=xxx. Hier ist der Code wie ich das z.Z. löse, aber das erscheint mir doch recht umständlich und unelegant. Gibt es da eine bessere Lösung ?
Code:
# config = aaa | bbb | ccc
ifndef config
CFG := aaa
else
# aaa
ifeq ($(config),aaa)
CFG := aaa
endif
# ccc
ifeq ($(config),ccc)
CFG := ccc
endif
#bbb
ifeq ($(config),bbb)
CFG := bbb
endif
# error
endif
ifndef CFG
$(error Config may be aaa, bbb or ccc, default is aaa.)  
endif
[code]
 
Du musst nicht extra 'ne neue Variable setzen. Mit "gmake foo=bar" hast du schon eine Variable (nämlich "foo"), deren Wert du direkt verwerten kannst.

Falls du keine Leerzeichen in den möglichen Werten zulässt, könnte der Code unten funktionieren. Die Idee ist, alle möglichen zulässigen Werte der Reihe nach vom übergebenen Wert "abzuziehen" und dann zu schauen, ob ein nicht-leerer String übrigbleibt (da alles erlaubte schon "abgezogen" wurde, muss etwas unerlaubtes übriggeblieben sein).

Code:
# Makefile

# possible values for `config'
config_options=foo bar moo

# check if `config_options' contains `config'
config_check=$(filter-out $(config_options),$(config))
ifneq ($(config_check),)
$(error Valid config options: $(config_options))
endif

# set default
config?=foo

all:
  @echo "config=${config}"

Code:
$ gmake
config=foo
$ for value in foo bar moo baz; do gmake config=$value; done
config=foo
config=bar
config=moo
Makefile:9: *** Valid config options: foo bar moo.  Stop.
$
 
Danke Worldi,
das funktioniert genau so wie es soll!

Filter muss ich mir noch mal anschauen: Aber irgendwie stehe ich mit dem ganzen make-kram auf dem Kriegsfuss ...:confused:

Peter
 
irgendwie stehe ich mit dem ganzen make-kram auf dem Kriegsfuss ...:confused:

Ohh, da bist du nicht alleine. Der ganze Mist ist absolut gruselig. Keine Ahnung, auf was die waren, als sie sich die Syntax ausgedacht haben. Vermutlich Peyote und/oder LISP... :ugly:

Am Rande: mein Beispiel wird einem um die Ohren fliegen, wenn man sowas hier macht:
Code:
$ gmake config=
config=
$

Zweiter Anlauf...
Code:
# Makefile

config         ?= $(config_default)
config_default  = $(firstword $(config_opts))
config_opts     = foo bar moo

# exit if `config' is not in `config_opts'
ifneq (,$(filter-out $(config_opts),$(config)))
  $(info )
  $(info ERROR! Invalid argument: config=$(config))
  $(info Supported arguments for config are: $(config_opts))
  $(info )
  $(error )
endif
# check if `config' was defined but contains an empty string (i.e. "gmake config=")
ifeq (,$(config))
  $(warning config is empty, using default value ($(config_default)))
  override config=$(config_default)
endif

all:
  @echo "config=${config}"
Ach ja... innerhalb von ifbla will mit Leerzeichen eingerückt werden, sonst kracht's... *seufz*

Code:
$ gmake
config=foo
$ for value in foo bar moo baz ""; do gmake config=$value; echo ---; done
config=foo
---
config=bar
---
config=moo
---

ERROR! Invalid argument: config=baz
Supported arguments are: foo bar moo

Makefile:13: *** .  Stop.
---
Makefile:17: config is empty, using default value (foo)
config=foo
---
$
Ich befürchte, "elegant" und "make" lassen sich nicht wirklich unter einen Hut bringen. :D
 
Ich befürchte, "elegant" und "make" lassen sich nicht wirklich unter einen Hut bringen. :D
Andere build-tools sind ja auch nicht besser. Am besten hat mir noch premake gefallen, aber da ich noch andere tools verwenden werde müßte ich die interfaces erst noch schreiben und mich dafür in premake reinfummeln was mir zuviel ist. Na ja, C/C++ eben... :rolleyes:

Ich lasse es mal bei der ersten Version von dir. Sowas muss man nur vernünftig dokumentieren. Und wer das nicht ließt, schießt sich eben in den Fuss. :mad:

Peter
 
Sowas muss man nur vernünftig dokumentieren. Und wer das nicht ließt, schießt sich eben in den Fuss.

Das trifft aber auf so ziemlich alle build-tools zu, die ich kenne. Entweder sie sind flexibel, dann aber überhaupt nicht elegant, oder sie sind (halbwegs) elegant, aber dann kann man damit nicht wirklich was anderes machen, als die Autoren sich überlegt haben.
 
Zurück
Oben