2012-03-16 19 views
7

tengo archivos de objetos que entran con las rutas que podría tener este aspecto:Makefile - ../ quitar del camino

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

me gustaría que se impriman a

'build/src/foo/bar.o' 

Actualmente el uso :

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

puedo lograr

'build/bar.o' 

Esto es problemático si dos bibliotecas/proyectos contienen el mismo nombre de clase.

Entonces la pregunta es, ¿cómo se puede eliminar múltiples '../' de una ruta en Make. Intenté los enfoques obvios e ingenuos sin resultados.

Actualización, lo siguiente coincidirá exactamente con ../../ y lo reemplazará con el resto. Esto es perfecto, excepto que es específico de ../../. Sólo hay que hacer que coincida con cualquier número de ../../

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

actualización,

resuelto, sólo tres reputación tímido de la publicación de mi propia respuesta.

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

¿Qué pasa con 'COBJS: = $ (subst ../.., construir, $ (CFILES))'? – Beta

+0

Algunos archivos no son siempre dos caminos relativos hacia atrás. – Halsafar

Respuesta

2

Como se publicó en mi pregunta original y olvidé responder con el tiempo.

La solución para esto y es probable que muchos otros sustitución de cadenas Marca es el siguiente:

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

'subst' toma 3 parámetros. $ toMatch, $ replaceWith, $ string.

En este caso $ (CFILES) es la lista de todos los archivos .c para compilar. Reemplazo '../' con nada.

1

Probar abspath.

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

Una solución simple a su problema puede ser la siguiente. Considere un simple 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" 

Cuando ejecuta make command.

make 

Usted recibirá ouput como:

[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]