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"를 사용했기 때문입니다.

관련 정보