Makefile с ошибкой оператора if

Попытка создать make-файл с правилом run , которое имеет if в это.

Когда я запускаю команду make run , она возвращает эту ошибку:

/bin/sh: 1: Syntax error: end of file unexpected (expecting "then")

Имя файла - Makefile . Что я могу сделать? (Я создал этот Makefile с редактором Vim и формат Vim уже установлен на unix).

Это часть кода:

#!bin/bash

#other rules 

run:

    if ls exec &>/dev/null
    then
            gcc -o exec file1.o file2.o
            ./exec
    else
           ./exec
    fi
0
задан 28 November 2020 в 13:39

2 ответа

Оператор if должен выглядеть так, если вы хотите проверить существование exec .

if [ ! -f exec ]; then
    gcc -o exec file1.o file2.o
fi

./exec
0
ответ дан 3 January 2021 в 22:48

Добавление кода оболочки в Makefile таким образом почти наверняка не сработает так, как вы ожидаете (если оно вообще будет работать).

В частности, каждая командная строка оболочки будет выполняться в собственной подоболочке - с использованием по умолчанию / bin / sh - поэтому вы видите такие ошибки, как

/bin/sh: 1: Syntax error: end of file unexpected (expecting "then")

из / bin / sh , несмотря на #!/ bin / bash shebang (который make будет рассматривать как чистый комментарий).

Поскольку вся цель make состоит в проверке наличия и статуса модификации предварительных требований, вы можете определить цель run , которая условно строит свой исполняемый компонент, если он отсутствует или устарел, следующим образом:

executable: file1.o file2.o
        gcc -o executable file1.o file2.o

run: executable
        ./executable

Примечание. Я назвал исполняемую программу исполняемым , поскольку name exec конфликтует с именем встроенной оболочки.

или, что более идиоматично, использование автоматических переменных make для целей и предварительных требований:

CC      := gcc
OBJS    := file1.o file2.o

executable: $(OBJS)
        $(CC) -o $@ $^

run: executable
        ./$<

] Тестирование с помощью make -n :

$ touch file1.c file2.c

$ make -n run
gcc    -c -o file1.o file1.c
gcc    -c -o file2.o file2.c
gcc -o executable file1.o file2.o
./executable
0
ответ дан 3 January 2021 в 22:48

Другие вопросы по тегам:

Похожие вопросы: