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