Интерактивный ввод переменной Makefile - PullRequest
0 голосов
/ 10 февраля 2020

Я хочу запустить makefile с входной переменной. Я хочу, чтобы, если я запишу имя проекта, будет создана папка с таким именем.

Итак, я напишу команду read:

CC = gcc
CFLAGS = -W -Wall
FILE := hi
src = $(wildcard *.c)
OBJ = $(src:.c=.o)

all : $(FILE)
$(FILE) : $(OBJ)
    $(CC) $(CFLAGS) -o $@ $^

.PHONY: clean

clean : 
    rm *.o $(FILE)

move : 
    mkdir -p ../../bin/$(FILE);
    mkdir -p ../../exe/$(FILE);
    mv *.o ../../bin/$(FILE);
    mv $(FILE) ../../exe/$(FILE)

afterclean :
    rm ../../bin/$(FILE)/*.o;
    rm ../../exe/$(FILE)/$(FILE)

execute :
    ./../../exe/$(FILE)/$(FILE)


read :
    @read -p "Enter : " enter; \
    $(FILE) := enter; \
    echo $FILE

То, что я хочу сделать, это если я получу FILE имя через read, я хочу изменить FILE переменную, но я не могу изменить ее. Как я могу это сделать?

1 Ответ

2 голосов
/ 17 февраля 2020

Короче говоря, вы не можете легко это сделать (и, скорее всего, не хотите, прокрутите вниз для обоснования). Если вы присмотритесь к своему Makefile, то заметите, что вы смешиваете make и синтаксис оболочки ... и их контексты.

В вашем случае буквально передается следующая строка shell (значение SHELL, вероятно, по умолчанию /bin/sh) с -c:

read -p "Enter : " enter; \
hi := enter; \
echo ILE

, которое показывает эффекты смешанного синтаксиса. $(FILE) (значение hi) и $F (unset -> empty) - переменные make, заменяемые make перед вызовом shell. (в то время как переменная read в enter вообще не используется, и вместо этого используется литеральная строка enter при попытке назначения переменной внутри этой запущенной оболочки.)

Если вы хотите запустить команду оболочки и присвоить значение из того, что он сделал / выучил, переменной make, вы должны будете сделать это, используя функцию shell (или сгенерировать (временный) файл, который вы бы include, но это даже сложнее):

FILE := $(shell read -p "Enter: " enter ; echo $${enter})

Это, однако, всегда спрашивает ... если только вы не используете условное присвоение (?=), и в этом случае вы уже можете выбирать из командной строки (make FILE=something, в этот момент мы собираемся замкнуть круг) , Я, как правило, не уверен, каковы были ваши намерения, как сказать make, когда спрашивать и когда использовать значение по умолчанию hi.

. Это приводит меня к тому, почему это понятие кажется мне подозрительным для начала и почему предложение, сделанное @ HolyBlackCat , является превосходным способом настройки вызова make.

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

Другими словами, если бы вам действительно пришлось, я бы сказал, напишите interactive_make_call.sh вокруг него для этого типа вызова:

#!/bin/bash
read -p "Enter : " enter
make FILE="${enter}" "$@"

Или даже:

#!/bin/bash
read -p "Enter : " enter
if [[ -n "${enter}" ]] ; then
        make FILE="${enter}" "$@"
else
        make "$@"
fi     

Для возврата к значению по умолчанию FILE из Makefile, если вы просто нажмете , введите .

...