Makefile $ wildcard corresponde apenas ao diretório superior

2

Eu estou tentando implementar um makefile para o meu projeto C que possui uma estrutura de diretórios da seguinte forma:

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

FOLDER1:
    subfolder1
    subfolder // n number of subfolders

A subpasta 1 pode ter mais subpastas, etc. etc.

Eu não pretendo ser burro com a minha estrutura de diretórios, o mais profundo que eu posso ir é 1-2 MAIO 3.

Até agora eu tenho:

# 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)

Meu problema é se parse contiver uma subpasta, digamos test , para fornecer a estrutura

PROJECT_FOLDER/parse/test

Nesse caso, nada é retornado de

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

Eu testei a saída da função com o seguinte 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)) \
        \
    )

Que, dada uma estrutura de:

dirs = * */parse */parse/test

Produz uma saída de:

main.o parse/parse.o

Ignorando */parse/test

Por que esse é o caso, o que posso fazer para corrigir minha atribuição de OBJ para reconhecer */parse/test ou de outra forma?

    
por tsujp 22.02.2013 / 18:01

1 resposta

3

Você tem o curinga no padrão dirs para trás. Você queria:

dirs = * parse/* parse/test/*

Como escrito, seu padrão acima foi expandido para: *.c (bom), */parse.c (sorte!) e */parse/test.c , o que teria confundido ainda mais se esse arquivo existisse. A única razão pela qual parecia que funcionava para o primeiro diretório de nível é porque você usou o mesmo nome de arquivo, 'parse', como o nome do diretório.

    
por 22.02.2013 / 21:24