尝试创建一个包含 if 的规则makefile
。run
当我运行该命令时,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
答案1
以那种方式将 shell 代码混合到 Makefile 中几乎肯定不会按您期望的方式工作(如果它根本起作用的话)。
特别是,每个 shell 命令行将在其自己的子 shell 中执行 -/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
注意:我命名了可执行程序,executable
因为该名称exec
与 shell 内置命令的名称冲突。
或者,更习惯地使用make
's自动变量目标和先决条件:
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
答案2
if
如果您想检查是否存在,语句应该如下所示exec
。
if [ ! -f exec ]; then
gcc -o exec file1.o file2.o
fi
./exec