Makefile $ wildcardは最上位ディレクトリにのみ一致します。

Makefile $ wildcardは最上位ディレクトリにのみ一致します。

次のディレクトリ構造を使用してCプロジェクトのメイクファイルを実装しようとしています。

PROJECT_FOLDER:
    folder1
    folder2
    folder // n number of folders
    main.c

FOLDER1:
    subfolder1
    subfolder // n number of subfolders

サブフォルダ1にはより多くのサブフォルダがあります。

私は私のディレクトリ構造について愚かなことをしたくありません。最も深いところはおそらく1-2(MAYBE 3)です。

これまで私は以下を持っています:

# A Makefile to build our First_Game_2 project

dirs = * */parse

PROJECT =  main
HEADERS =  $(PROJECT).h
OBJ     =  $(foreach dirz, $(dirs), \
        \
        $(patsubst %.c,%.o,$(wildcard $(dirz).c)) \
        \
    )

C99     =  gcc -std=c99
CFLAGS  =  -Wall -pedantic -Werror 

$(PROJECT) : $(OBJ)
        $(C99) $(CFLAGS) -o $(PROJECT) $(OBJ)


%.o : %.c $(HEADERS)
        $(C99) $(CFLAGS) -c $<

clean:
        rm -f $(PROJECT) $(OBJ)

私の質問は、構造が与えられたときにサブフォルダがparse含まれているかどうかです。test

PROJECT_FOLDER/parse/test

この場合、何も返されません。

$(foreach dirz, $(dirs), \
        \
        $(patsubst %.c,%.o,$(wildcard $(dirz).c)) \
        \
    )

次のmakefileを使用して関数の出力をテストしました。

# A Makefile to build our First_Game_2 project

dirs = * */parse

PROJECT =  main
HEADERS =  $(PROJECT).h
OBJ     =  

C99     =  gcc -std=c99
CFLAGS  =  -Wall -pedantic -Werror 

$(foreach dirz, $(dirs), \
        \
        $(patsubst %.c,%.o,$(wildcard $(dirz).c)) \
        \
    )

ここで与えられる構造は次のとおりです。

dirs = * */parse */parse/test

次の出力が生成されます。

main.o parse/parse.o

無視する*/parse/test

なぜこれが起こり、OBJ割り当てが認識されるように変更するにはどうすればよいですか*/parse/test

答え1

パターンにリバースワイルドカードを使用しましたdirs。あなたはそれを要求しました:

dirs = * parse/* parse/test/*

書かれているように、上記のパターンは(*.cgood)、*/parse.c(lucky!)、およびで拡張され、*/parse/test.cファイルが存在する場合、これはあなたをさらに混乱させるでしょう。最初のレベルのディレクトリで動作しているように見える唯一の理由は、ディレクトリ名と同じファイル名 "parse"を使用したためです。

関連情報