0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Makefileで関数・マクロをcallするときに前スペースが入ってしまう

Last updated at Posted at 2023-05-13

当たり前かもしれないがわからなかった

結論

:o: callするときは、以下のように書く

$(foreach NUM,$(NUMS),$(eval $(call MACRO,$(NUM))))

:x: 以下のように書いてはいけない (引数に前スペースが入ってしまう)

$(foreach NUM, $(NUMS), $(eval $(call MACRO, $(NUM))))
                                            ^

(引数以外に前スペースはあってもいいが、統一感出すためについでに消している)

経緯

以下のようなMakefileを書いた

NUMS = 1 2

define BUILD
build/foo-$(1): src/foo-$(1).cpp
	g++ $$^ -o $$@
endef

$(foreach NUM, $(NUMS),$(eval $(call BUILD, $(NUM))))

make foo-1と打ってみると以下のように何も実行されなかった

Makefile:8: 警告: ターゲット 'build/foo-' のためのレシピを置き換えます
Makefile:8: 警告: ターゲット 'build/foo-' のための古いレシピは無視されます
make: *** ターゲット 'build/foo-1' を make するルールがありません.  中止.

make -npで確認すると以下のように、スペースが入っているようだった

1: src/foo- 1.cpp # foo-と1の間にスペースが入っている
#  暗黙ルールの探索は行われませんでした.
#  修正時刻がチェックされることはありません.
#  ファイルは更新されていません.
#  実行するレシピ (ファイル 'Makefile', 8 行目):
	g++ $^ -o $@

最初は、マクロ内でbuild/foo-$(trim $(1))とやったり、call関数内で$(call BUILD,$(trim $(NUM)))とやったりした(こちらは無意味だった)が、以下のスペース削除に落ち着いた

$(foreach NUM,$(NUMS),$(eval $(call BUILD,$(NUM))))

もちろん、make foo-1の実行結果は期待通りになった

g++ src/foo-1.cpp -o build/foo-1

余談

上の事象を再現しようとして、以下のようにしていた

  • ディレクトリ構成 (Makefileとソースコードを同じディレクトリ直下においた)
    test/
     ├ foo-1.cpp
     ├ foo-2.cpp
     └ Makefile
    
  • Makefile (前スペースあり)
    NUMS = 1 2
    
    define BUILD
    foo-$(1): foo-$(1).cpp
    	g++ $$^ -o $$@
    endef
    
    $(foreach NUM, $(NUMS),$(eval $(call BUILD, $(NUM))))
    

make foo-1の実行すると、警告はでるが、コンパイルはしてくれる

Makefile:8: 警告: ターゲット 'foo-' のためのレシピを置き換えます
Makefile:8: 警告: ターゲット 'foo-' のための古いレシピは無視されます
g++     foo-1.cpp   -o foo-1

(コンパイルしてくれるのはいいが、再現できないので困っていた)

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?