2014-12-06 46 views
0

我想编译使用make的OpenCobol程序。我总是得到“make:test1.cob没有任何事情要做”。这是我的makefile。我已经在cobc之前放了一张TAB。但我仍然得到这个信息。请帮忙。 谢谢。OpenCobol Makefile

COBCWARN = -W 
%: %.cob 
    cobc $(COBCWARN) -free -x $^ -o [email protected] 

这是我的cobol程序。

IDENTIFICATION DIVISION. 
PROGRAM-ID. TEST1. 
PROCEDURE DIVISION. 
    DISPLAY 'Hello world!'. 
    STOP RUN. 
+0

你运行什么命令来调用make?上面的makefile不完整:它本身不会执行任何操作。 – MadScientist 2014-12-06 14:12:44

+0

@MadScientist:我正在使用Vim。我正在使用':make%'来编译。我应该将哪些内容放入makefile才能使其工作? – Joydeep 2014-12-06 15:30:30

回答

1

您的makefile不包含实际目标。您只定义了一个模式规则,告诉如何构建匹配模式的目标。但是make并不会在文件系统上寻找可以匹配模式的目标,它只会针对特定请求的目标检查模式。

您的makefile中没有列出任何特定目标(文件),因此唯一可以了解目标的方法是如果您在目标线上构建目标。

您正在使用%特殊令牌从vim内运行此命令,该令牌展开为当前正在编辑的文件的名称。这意味着您正在运行命令:

make test1.cob 

因为您正在编辑文件test1.cob。所以,你告诉make“请尝试创建目标(文件)test1.cob”。但是,该文件已经存在(这是您正在编写的文件)。所以说,“无事可做”。

如果你运行make,并要求它来创建你真的想要创建的目标,它会工作:

​​

现在文件test1不存在,并可以找到一个知道如何图案规则建立它,所以使得将运行该规则。

或者,你可以编辑你的Makefile添加的特定目标,如:

COBCWARN = -W 

test1: test1.cob 

%: %.cob 
     cobc $(COBCWARN) -free -x $^ -o [email protected] 

然后你就可以运行在所有make不带参数。没有任何命令行参数,make会在makefile中查找显式目标,并将test1作为第一个。它看到有一个与该目标相匹配的规则(模式规则),所以它会构建该目标。

UPDATE

如果你想允许一个简单的命令make建立多个程序,写你的makefile是这样的:

COBCWARN = -W 

all: test1 test2 test3 
.PHONY: all 

%: %.cob 
     cobc $(COBCWARN) -free -x $^ -o [email protected] 

现在从VIM,你就可以说:!make,就是这样。

如果您运行make没有参数,那么它会在makefile中找到第一个显式目标并构建它。在这个例子中,第一个目标是all,它的先决条件是可能的程序。构建每一个make都会看到它可以应用模式规则,所以它会这样做(如果.cob文件自上次构建该程序以来已被修改)。

+0

在这种情况下,我如何将文件名传递给makefile?现在,我所做的工作 - “:make%:r”在Vim中编译。 – Joydeep 2014-12-07 08:25:08

+0

这是一个针对vim用户的问题,它与make无关。我不使用vim(我使用Emacs),但是从我读的文档中,我认为你需要':!使%<'通过使文件名不带扩展名。 – MadScientist 2014-12-07 15:14:50

+0

@Joydeep规则'%:%.cob'告诉make它可以创建一个可执行文件(更具体地说,是一个没有扩展名的名字),如果它与.cob扩展名相匹配的话。 'make myprogram'会尝试make myprogram,如果它找到一个'myprogram.cob',它将使用'cobc -free -x ...'使用'myprogram.cob'作为输入并生成'myprogram'。使用任何你喜欢的名字,并通过名称。 – 2014-12-07 21:09:49