2010-07-08 12 views
8

Sto scrivendo un makefile generico per creare librerie statiche. Sembra funzionare bene finora, tranne che per la linea chiamando sed:Utilizzo di sed in un makefile; come sfuggire alle variabili?

# 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 è usato per sostituire il percorso/nome del file oggetto con il percorso completo in cui l'oggetto è in realtà. per esempio. 'src/foo.o:' è sostituito da 'build/linux/src/foo.o:' in questo esempio. $ (BUILD_DIR) e $ * nella stringa di sostituzione contengono entrambe barre inverse quando espanse - come faccio a passarle a sed?

Nota: a questo potrebbe essere stata data risposta prima, ma non sono ancora in grado di applicare tali risposte al mio problema specifico!

risposta

13
  • È possibile utilizzare nient'altro che le barre in avanti come separatore in sed. Per esempio. sed s~foo~bar~g
  • È possibile usare le virgolette " (almeno nella shell), e le variabili sarà ancora ampliato: echo "Hello $PLANET"
+2

Come possiamo fare qualcosa come "sed s ~ $ {PLANET} ~ bar ~'? Per qualche motivo che non si espande in Makefile –

5

Se si desidera che il percorso di espandersi in un file si utilizza

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

Se il PATH_VARIABLE variabile sembrava/opt/percorso/user/home/etc sarà ora gonfiare a:

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

Ciò dovrebbe consentire a sed di inserire correttamente il segno "/".

-Matt

+0

Questo è stato utile, grazie! –

+1

Penso che ci sia un errore di sintassi qui. Invece di ... '$ (subst, /, \ /, $ {PATH_VARIABLE})', penso che dovrebbe essere '$ (subst /, \ /, $ {PATH_VARIABLE})'. Cioè, c'è una virgola extra in là dopo "subst". – rdr

+0

Dovrebbe essere '$ (subst /, \ /, $ (PATH_VARIABLE))' assumendo che 'PATH_VARIABLE' fosse una variabile Make? – CMCDragonkai

Problemi correlati