1つのアイテムがスペースを含む引用符付き文字列であるアイテムのリストを持つmakefileプロセス変数

makefile process variable with list of items where one item is a quoted string with spaces


質問 written by code_fodder @2019-01-15 10:47:05Z

: 0 : 2 : 42

次のメイクファイルスニペットを使用します。

VAR_LIST = "item1" "item2" "item 3 that has spaces" "item4"
ARGS = $(addprefix echo ,$(VAR_LIST))

私が達成しようとしているのは、ARGSに次のものを含めることです:

echo "item1" echo "item2" echo "item 3 that has spaces" echo "item4"

解決方法がわからないのは、addprefixなどの関数がスペースに作用することです...

コメント 1

これで解決しようとしている最大の問題は何ですか?

written by マキシムエゴラスキン @2019-01-15 10:55:06Z

コメント 2

@MaximEgorushkin makefileユーザーが入力できるdoxygen構成変数が必要です。項目は"VAR=Some Value"ように見えます。次に、それぞれを次のように変換する必要があり; echo "VAR=Some Value"; echo "VAR=Some Value" 、セミコロンはリスト区切り文字です。次に、それをdoxygenコマンドにパイプします。最初の回答はこちら: stackoverflow.com/questions/11032280/…それは理にかなっていますか?

written by code_fodder @2019-01-15 10:59:23Z

コメント 3

@MaximEgorushkinユーザーに次のようなアイテムを追加させることができ; echo "VAR=some value"; echo "VAR=some value" ...しかし、それはユーザーに課す恐ろしい構文のように見えます...現時点では、スペースなしの値しか使用できないと言っています(ほとんどは大丈夫です)。

written by code_fodder @2019-01-15 11:02:30Z

コメント 4

makeで必要なものが簡単に実現できるかどうかはわかりません。そのためにシェルまたはpythonスクリプトを使用します。

written by マキシムエゴラスキン @2019-01-16 10:33:28Z

コメント 5

@MaximEgorushkinええ、私はこれについてあなたと一緒にいると思います。恐らく適用できる恐ろしいmake関数のセットがありますが、実際には複雑です(可能な場合)。私はそこに本当に賢い/恐ろしいコードを見ました!...しかし、あなたが言うように、スクリプトを使用してください!-私はそれを考えていませんでした、素晴らしいアイデア-答えとして自由に追加してください:)

written by code_fodder @2019-01-16 12:22:37Z

回答 1 written by Maxim Egorushkin @2019-01-16 12:24:55Z
1

必要なものがmake簡単に達成できるかどうかはわかりません。文字列を引用makeことは、単語を処理make関数に影響を与えないからです: "は単語の一部です。

そのためにシェルまたはpythonスクリプトを使用します。

コメント 1

それは実行可能です(私の答えを参照してください)-複雑さについて議論することはできますが、バッテリーに含まれるプロパティのほうが優雅さに欠けています。

written by ブルームフォンデル @2019-01-17 13:48:19Z

回答 2 written by ブルーム @2019-01-17 14:01:41Z
1

完全にGNUmake内でgmttの助けを借りてそれを行うことができます。 完全なプログラミング言語ほど単純ではありませんが、少なくとも移植性があり、外部シェルのフレーバーやツールに依存しません。

include gmtt/gmtt.mk

VAR_LIST = "item1" "item2" "item 3 that has spaces" "item4"

# make a prefix-list by splitting at ". This will yield superfluous space 
# characters between the items, but we can eliminate them later
prefix-list := $(call chop-str-spc,$(VAR_LIST),A $(-alnum-as-str))
$(info $(prefix-list))

# Now we select the data payload from the prefix-list. Spaces inside items 
# are still encoded as $(-spacereplace) characters, which is good as we have  
# a normal make list this way
string-list := $(call get-sufx-val,$(prefix-list),A,,100)
$(info $(string-list))

# Using get-sufx-val() is fine, but we can have it even simpler, by dropping
# the prefix, as we have only one in the list anyway:
string-list := $(call drop-prfx,$(prefix-list))

# Now step through the list with a normal for loop, converting $(-spacereplace)
# back to real spaces 
$(foreach item,$(string-list),$(if $(strip $(call spc-unmask,$(item))),\
   $(info [$(call spc-unmask,$(item))])))

出力:

Output:

コメント 1

うわー...それはあなたがそれを行うことができることはかなり驚くべきことです....しかし、コードは本当に良くありません-私はかろうじて理解することができますので、将来のメンテナンスのために私の最初のオプションではありません。ただし、コードは+1です!

written by code_fodder @2019-01-17 21:20:50Z

コメント 2

あなたはこのコードまたはライブラリの背後にあるコードを意味しますか?すべてのmakeプログラミングは、基本的に、1つのデータ型である文字列を持つ非常に単純な機能的パラダイムです。プレフィックスリストは、コレクションを処理する1つの方法です。

written by ブルームフォンデル @2019-01-18 08:07:30Z