2012-03-16 4 views
7

У меня есть объектные файлы, поступающие с путями, которые могли бы выглядеть следующим образом:Makefile - удалить ../ из пути

'../../src/foo/bar.c' 

Я хотел бы, чтобы они были выход к

'build/src/foo/bar.o' 

В настоящее время используется :

COBJS  := $(notdir $(CFILES)) 
COBJS  := $(patsubst %,$(BUILD)%.o,$(COBJS)) 

я могу достичь

'build/bar.o' 

Это проблематично, если какие-либо две библиотеки/проекта содержат одно и то же имя класса.

Итак, вопрос в том, как можно удалить несколько «../» из пути в Make. Я попытался сделать очевидные и наивные подходы без каких-либо результатов.

Обновить, следующее будет точно соответствовать ../../ и заменить его на остальные. Это прекрасно, за исключением того, что он специфичен для ../../. Просто необходимо, чтобы он соответствовал любому количеству ../../

COBJS  := $(CFILES:../../%=%) 

Update,

решаемым, только три репутации застенчивого размещения моему собственному ответа.

COBJS  := $(subst ../,,$(CFILES)) 
+0

Что случилось с 'COBJS: = $ (Подст ../.., построить, $ (CFILES))'? – Beta

+0

Некоторые файлы не всегда являются двумя относительными путями назад. – Halsafar

ответ

2

Как опубликовано в моем первоначальном вопросе, и я забыл в конце концов ответить.

Решение этой проблемы и, вероятно, многие другие замены Сделать строки выглядит следующим образом:

COBJS  := $(subst ../,,$(CFILES)) 

«Подст» принимает 3 параметра. $ toMatch, $ replaceWith, $ string.

В этом случае $ (CFILES) - это список всех файлов .c для компиляции. Я заменяю «../» ничем.

1

Пробег: abspath.

COBJS := $(foreach file,${CFILES},$(abspath ${file})) 
0

Простым решением проблемы может быть следующее. Рассмотрим простой Makefile

path_to_remove := batch1/test2 
path_to_add := earth/planet 

my_paths := \ 
batch1/test2/p/a3.c \ 
batch1/test2/p/a2.c \ 
batch1/test2/p/a1.c \ 
batch1/test2/q/b3.c \ 
batch1/test2/q/b2.c \ 
batch1/test2/q/b1.c 

$(info [Original] [$(my_paths)]) 
my_paths := $(my_paths:$(path_to_remove)/%=$(path_to_add)/%) 
$(info [New Changed] [$(my_paths)]) 

all: 
    @echo "Hi Universe" 

При выполнении команды make.

make 

вы получите как выводе:

[Original] [batch1/test2/p/a3.c batch1/test2/p/a2.c batch1/test2/p/a1.c batch1/test2/q/b3.c batch1/test2/q/b2.c batch1/test2/q/b1.c] 
[New Changed] [earth/planet/p/a3.c earth/planet/p/a2.c earth/planet/p/a1.c earth/planet/q/b3.c earth/planet/q/b2.c earth/planet/q/b1.c]