37354


通常、ターゲット`hello_world`をmakeするときには、

[code]

    make hello_world
    
[/code]

とします。  
同じ要領で、ターゲット`hello=world`をmakeしようとして、

[code]

    make hello=world
    
[/code]

とすると、意図した結果にはなりません（変数`hello`の値を`world`に設定して、デフォルトターゲットがmakeされます）。

これを`hello=world`のmakeであると認識させるにはどうすればよいでしょうか？

一般論としてmakeのターゲット名に'='を使うべきでないことは理解していますが、やむをえない事情によりwork-aroundを探しています。

* * *

状況を再現する最小構成  
GNU Make 4.2.1 on cygwin x86_64

`Makefile`の内容(スペースはタブに変更してください)

[code]

    HELLO:=hello=world
    all:       # "all world"
        @echo all $(hello)
    $(HELLO):  # "hello=world"
        @echo hello=world $(hello)
    
[/code]

普通に実行

[code]

    $ make hello=world
    all world
    
[/code]

シングルクォートして実行

[code]

    $ make 'hello=world'
    all world
    
[/code]

ダブルクォートして実行

[code]

    $ make "hello=world"
    all world
    
[/code]

エスケープして実行

[code]

    $ make hello\=world
    all world
    
[/code]

シングルクォート＋エスケープして実行

[code]

    $ make 'hello\=world'
    all
    
[/code]

ダブルクォート＋エスケープして実行

[code]

    $ make "hello\=world"
    all
    
[/code]


CC BY-SA 3.0
2017-08-20T08:49:37.230
37350
2017-08-20T13:17:10.143
2017-08-20T10:16:00.150
24961
24961
question
makefile
'='を含むターゲットのMake


Makefile 中の変数 `HELLO` を上書きしてしまってよいなら、

[code]

    make HELLO=hello_world hello_world
    
[/code]

でいいですね。  
ただ、実際に問題になっている Makefile では `HELLO` はもっと複雑な使われ方をしていて、簡単に触れないのでしょうね。

Makefile の冒頭に記述を足してしまっては駄目でしょうか。  
一時ファイルを作らないとすると、例えば以下のような方法が考えられます。

[code]

    printf 'MY_TARGET=hello=world\nmy_target: $(MY_TARGET)\n' |cat - Makefile |make -f -
    
[/code]


CC BY-SA 3.0
2017-08-20T13:05:50.213
37353
2017-08-20T13:05:50.213
3054
37350
answer


これでいかがでしょうか。

[code]

    luna:~ % make --version | head -1
    GNU Make 4.2.1
    luna:~ % make .DEFAULT_GOAL=hello=world
    hello=world
    luna:~ %
    
[/code]


CC BY-SA 3.0
2017-08-20T13:17:10.143
37354
2017-08-20T13:17:10.143
5288
37350
answer