다음 디렉터리 구조를 사용하여 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"를 사용했기 때문입니다.