带有 if 语句错误的 Makefile

带有 if 语句错误的 Makefile

尝试创建一个包含 if 的规则makefilerun

当我运行该命令时,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/bashshebang(这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

相关内容