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.
¿Cómo podemos hacer algo como 'sed s ~ $ {PLANET} ~ bar ~'? Por alguna razón que no se expande en Makefile –