2010-07-08 7 views
8

Estoy escribiendo un archivo MAKE genérico para construir bibliotecas estáticas. Parece que funciona bien hasta ahora, a excepción de la línea de llamada SED:Usando sed en un archivo MAKE; cómo escapar de las variables?

# Generic makefile to build a static library 
ARCH  = linux 

CFLAGS  = -O3 -Wall 

SOURCES = src 
BUILD_DIR = build/$(ARCH) 
TARGET  = $(BUILD_DIR)/libz.a 

CFILES  = $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.c)) 
OBJECTS = $(addprefix $(BUILD_DIR)/,$(CFILES:.c=.o)) 

# Pull in the dependencies if they exist 
# http://scottmcpeak.com/autodepend/autodepend.html 
-include $(OBJECTS:.o=.dep) 

default: create-dirs $(TARGET) 

$(TARGET): $(OBJECTS) 
    $(AR) -rc $(TARGET) $^ 

$(BUILD_DIR)/%.o: %.c 
    $(CC) $(CFLAGS) -c $< -o [email protected] 
    $(CC) -M $(CFLAGS) $*.c > $(BUILD_DIR)/$*.tmp 
    sed s/.*:/$(BUILD_DIR)\\/$*.o:/ $(BUILD_DIR)/$*.tmp > $(BUILD_DIR)/$*.dep 
    @rm $(BUILD_DIR)/$*.tmp 

.PHONY: create-dirs 
create-dirs: 
    @for p in $(SOURCES); do mkdir -p $(BUILD_DIR)/$$p; done 

.PHONY: clean 
clean: 
    rm -fr $(BUILD_DIR) 

sed se utiliza para sustituir la ruta/nombre del archivo objeto con la ruta completa donde el objeto es en realidad. p.ej. 'src/foo.o:' se reemplaza por 'build/linux/src/foo.o:' en este ejemplo. $ (BUILD_DIR) y $ * en la cadena de reemplazo ambos contienen barras diagonales cuando se expanden - ¿cómo los paso a sed?

Nota: Esto podría haber sido respondido aquí antes, pero hasta ahora no puedo aplicar esas respuestas a mi problema específico.

Respuesta

13
  • Puede usar cualquier otra cosa que no sean barras diagonales como separador en sed. P.ej. sed s~foo~bar~g
  • Puede utilizar comillas dobles " (al menos en la cáscara), y las variables todavía será ampliado: echo "Hello $PLANET"
+2

¿Cómo podemos hacer algo como 'sed s ~ $ {PLANET} ~ bar ~'? Por alguna razón que no se expande en Makefile –

5

Si desea que el camino para expandirse en un archivo que se utiliza

sed -i "s/TO_REPLACE/$(subst, /,\/,${PATH_VARIABLE})/g" filename.txt 

Si su PATH_VARIABLE variables se parecía a/opt/ruta/usuario/home/etc y pasará a inflar a:

\ /opt\ /path\ /user\ /home\ /etc 

Esto debería permitir a sed insertar el '/' correctamente.

-Matt

+0

Esto fue útil, ¡gracias! –

+1

Creo que hay un error de sintaxis aquí. En lugar de ... '$ (subst, /, \ /, $ {PATH_VARIABLE})', creo que debería ser '$ (subst /, \ /, $ {PATH_VARIABLE})'. Es decir, hay una coma adicional allí después de "subst". – rdr

+0

¿Debería ser '$ (subst /, \ /, $ (PATH_VARIABLE))' suponiendo que 'PATH_VARIABLE' era una variable Make? – CMCDragonkai

Cuestiones relacionadas