Makefile: criar pré-requisito de uma lista

1

A maneira usual de criar uma dependência de 1: 1 em Makefiles é usando % , por exemplo

%o:%cc

Imagine que eu tenho 50% de arquivos.cc e estou interessado em apenas 3 deles. Eu construí uma lista de seus nomes básicos:

CC_BASENAMES := Source15 Source32 Source41

Como posso criar um pré-requisito para um arquivo .o , iterando os itens em $(CC_BASENAMES) . O efeito deve ser equivalente a:

Source15.o: Source15.cc

Source32.o: Source32.cc

Source41.o: Source41.cc
    
por Viesturs 18.03.2018 / 10:39

2 respostas

3

Não sei ao certo o que você está pedindo, mas há várias maneiras simples de manipular strings.

Por exemplo, você pode adicionar o sufixo .o a cada um dos seus nomes de base com OBJS = $(addsuffix .o,$(CC_BASENAMES)) .

Você pode converter um sufixo em outro, por exemplo $(OBJS:.o=.cc) . Então talvez o que você queira seja um Makefile como

CC_BASENAMES := Source15 Source32 Source41
OBJS = $(addsuffix .o,$(CC_BASENAMES))
SRCS = $(OBJS:.o=.cc)

fred.o: $(SRCS)
        cc $(SRCS) -o fred.o

Ou, mais comumente, você definiria o SRCS primeiro e derivaria o OBJS dele.

Se você quiser que uma regra de dependência seja aplicada apenas a alguns destinos, você pode usar targets: target-pattern: padrões prereq ie

$(OBJS): %.o: %.cc

Veja o gnu make .

    
por 18.03.2018 / 10:57
2

Ter uma regra de compilação geral (como %o:%cc ) não significa que make terá que passar por todos os 50 arquivos de origem todas as vezes. O que você precisa fazer é especificar a saída desejada e deixar make aplicar a regra para construí-la para você. Por exemplo. você poderia correr

$ make Source15.o Source32.o Source41.o

na linha de comando, ou crie um alvo específico no seu makefile

my_build: Source15.o Source32.o Source41.o

e, em seguida, peça make para criar esse destino:

$ make my_build
    
por 19.03.2018 / 11:02

Tags