2010-07-08 16 views
8

Piszę ogólny plik Makefile do tworzenia bibliotek statycznych. Wydaje się, że działa dobrze do tej pory, z wyjątkiem linii dzwoniącej sed:Używanie sed w pliku makefile; jak wydostać się z zmiennych?

# 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 jest stosowany w celu zastąpienia ścieżka/nazwa pliku obiektu z pełną ścieżkę gdzie obiekt jest w rzeczywistości. na przykład "src/foo.o:" w tym przykładzie jest zamieniane na "build/linux/src/foo.o:". $ (BUILD_DIR) i $ * w łańcuchu zamiennym zawierają rozwijane ukośniki po rozwinięciu - jak przekazać je do sed?

Uwaga: Odpowiedź mogła zostać udzielona tutaj wcześniej, ale do tej pory nie mogę zastosować tych odpowiedzi do mojego konkretnego problemu!

Odpowiedz

13
  • Możesz użyć czegokolwiek innego niż ukośniki jako separatora w sed. Na przykład. sed s~foo~bar~g
  • Można użyć cudzysłowia " (przynajmniej w powłoce), a zmienne nadal będzie rozszerzony: echo "Hello $PLANET"
+2

Jak możemy zrobić coś takiego jak "sed s ~ $ {PLANET} ~ bar ~"? Z jakiegoś powodu, który nie rozwija się w Makefile –

5

Jeśli chcesz ścieżkę, aby rozwinąć w pliku użyć

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

Jeśli zmienna PATH_VARIABLE wyglądało/opt/ścieżka/user/home/etc będzie teraz nadmuchać do:

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

To powinno umożliwić prawidłowe wstawienie znaku "/".

-Matt

+0

To było pomocne, dzięki! –

+1

Myślę, że tutaj jest błąd składni. Zamiast ... '$ (subst, /, \ /, $ {PATH_VARIABLE})', myślę, że powinno to być '$ (subst /, \ /, $ {PATH_VARIABLE})'. Oznacza to, że istnieje dodatkowy przecinek po "subst". – rdr

+0

Powinien to być '$ (subst /, \ /, $ (PATH_VARIABLE))' przy założeniu, że 'PATH_VARIABLE' jest zmienną Make? – CMCDragonkai

Powiązane problemy