Использование sed в make-файле; как избежать переменных? - PullRequest
9 голосов
/ 08 июля 2010

Я пишу универсальный make-файл для создания статических библиотек. Кажется, до сих пор это работает хорошо, за исключением строки, вызывающей sed:

# 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 $@ 
    $(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 используется для замены пути / имени объектного файла полным путем к тому месту, где фактически находится объект. например 'src / foo.o:' заменяется на 'build / linux / src / foo.o:' в этом примере. $ (BUILD_DIR) и $ * в строке замены содержат косые черты при развертывании - как передать их в sed?

Примечание. Возможно, здесь уже был дан ответ, но я пока не могу применить эти ответы к моей конкретной проблеме!

Ответы [ 2 ]

13 голосов
/ 08 июля 2010
  • Вы можете использовать в качестве разделителя в sed все, кроме косой черты.Например, sed s~foo~bar~g
  • Вы можете использовать двойные кавычки " (по крайней мере, в оболочке), и переменные все равно будут расширены: echo "Hello $PLANET"
5 голосов
/ 31 июля 2013

Если вы хотите, чтобы путь раскрылся в файл, который вы используете

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

Если ваша переменная PATH_VARIABLE выглядела как / opt / path / user / home / etc теперь он будет раздуваться до:

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

Это должно позволить sed правильно вставить '/'.

Матф

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...