Makefile - установить значение переменной из другого правила - PullRequest
0 голосов
/ 12 марта 2020

В следующем make-файле правило wat предназначено для создания файла .wat из файла .c.

CC=emcc
CFLAGS= -O2 -s WASM=1 -s SIDE_MODULE=1
# flags are for not generating any emscripten glue code

# makes a .wat version of a .c file of specified name
# TARGET must be specified from command line
wat: $(TARGET).c
    $(CC) $(CFLAGS) -o $(TARGET).wasm $(TARGET).c && wasm2wat $(TARGET).wasm > $(TARGET).wat && rm $(TARGET).wasm

struct: TARGET = struct
struct: wat

clear:
    rm -f *.wasm *.wat

Вызывается так, работает нормально:

[user@pc]$ make wat TARGET=struct
emcc -O2 -s WASM=1 -s SIDE_MODULE=1 -o struct.wasm struct.c && wasm2wat struct.wasm > 
struct.wat && rm struct.wasm

Теперь я хочу более конкретное c правило struct, написанное, как вы видите. По сути, я хочу повторно использовать правило wat и просто убедиться, что TARGET установлен в значение «struct» перед запуском. Тем не менее, выполнение make struct дает мне ошибку no input file от em cc, как будто значение TARGET не существует:

[user@pc]$ make struct
emcc -O2 -s WASM=1 -s SIDE_MODULE=1       -o .c
shared:ERROR: no input files

Как правильно выполнить то, к чему я стремлюсь

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Вы, похоже, пытаетесь использовать переменные, определенные для цели c, и, в частности, их функцию наследования, для достижения вашей цели.

Однако это не может работать из-за этого оператора в документация :

Как и в случае автоматических переменных c, эти значения доступны только в контексте рецепта цели (и других назначений цели c).

Это означает, что $(TARGET) в предварительном условии:

wat: $(TARGET).c

вычисляется при разборе make-файла, а не при вызове правила struct и расширяется до:

wat: .c

Я вижу, что Ондрей дал ответ, поэтому я остановлюсь здесь:)

1 голос
/ 12 марта 2020

Проблема в том, что когда make оценивает, как сделать цели и каковы предварительные условия, ваш TARGET не определен, и поэтому правило гласит: wat нуждается в .c. Вы можете попробовать рекурсию и сказать что-то вроде этого:

struct:
        $(MAKE) TARGET=struct wat

На самом деле это не так уж и хорошо, потому что ничто на самом деле не генерирует файл wat, поэтому цель всегда устарела, а Makefile на самом деле это всего лишь несколько прославленный сценарий оболочки.

Возможно, вам следует подумать о написании правила шаблона для сборки .wat из .c, что-то вроде (на вашем примере):

%.wat: %.c
        $(CC) $(CFLAGS) -o $(*F).wasm $< \
                && wasm2wat $(*F).wasm > $@.wat \
                && rm $(*F).wasm

Затем вы можете позвонить make struct.wat, и если вы все еще хотите (для удобства) иметь только цель struct, вы можете добавить:

.PHONY: struct

struct: struct.wat
...