2014-12-06 1 views
0

Я пытаюсь скомпилировать программу OpenCobol с помощью make. Я всегда получаю «make: ничего не делать для test1.cob». Вот мой makefile. Я поставил TAB до початки. Но все же я получаю это сообщение. Пожалуйста помоги. Спасибо.OpenCobol Makefile

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

И вот моя программа для коболов.

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

Какую команду вы используете для вызова make?Вышеупомянутый make-файл не является полным: сам по себе он ничего не сделает. – MadScientist

+0

@MadScientist: Я использую Vim. Я использую ': make%' для компиляции. Что мне следует добавить в make-файл, чтобы он работал? – Joydeep

ответ

1

В вашем файле makefile нет фактических целей. Вы определили только правило шаблона, которое сообщает, как создавать цели, соответствующие шаблону. Но make не ищет целевые объекты в файловой системе, которые могут соответствовать шаблону, он проверяет шаблон только на цели, которые были запрошены специально.

У вас нет каких-либо конкретных целей (файлов), перечисленных в вашем файле makefile, поэтому единственный способ make может узнать о цели, если вы даете цель быть построенной в командной строке.

Вы используете эту команду из vim, используя специальный токен , который расширяется до имени файла, который в настоящее время редактируется. Это означает, что вы запускаете команду:

make test1.cob 

, потому что вы редактируете файл test1.cob. Итак, вы говорите make «попробуйте создать цель (файл) test1.cob». Но этот файл уже существует (это файл, который вы пишете). Поэтому make говорит «ничего не делать».

Если вы запустите сделать и попросить его, чтобы создать цель, которую Вы действительно хотите создан, он будет работать:

make test1 

Теперь файл test1 не существует, и сделать можно найти шаблонное правило, которое знает, как для его создания, поэтому make будет запускать это правило.

В качестве альтернативы, вы можете отредактировать Makefile, чтобы добавить конкретную цель, например:

COBCWARN = -W 

test1: test1.cob 

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

Затем вы можете запустить make без аргументов вообще. Без аргументов командной строки make будет выглядеть в make-файле для явных целей и найти test1 в качестве первого. Он видит, что существует правило (правило шаблона), которое соответствует этой цели, поэтому оно построит эту цель.

UPDATE

Если вы хотите, чтобы простая команда make построить несколько программ, написать Makefile так:

COBCWARN = -W 

all: test1 test2 test3 
.PHONY: all 

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

Теперь из Vim вы можете просто сказать :!make и это все.

Если вы запустите make без аргументов, то он найдет первую явную цель в make-файле и построит ее. В этом примере первая цель - all, и ее предпосылками являются возможные программы для сборки. Для создания каждого из них make видит, что он может применить правило шаблона, и поэтому он сделает это (если файл .cob был изменен с момента последнего создания программы).

+0

В этом случае, как передать имена файлов в make-файл? Теперь, что я делаю для его работы - «: make%: r» для компиляции в Vim. – Joydeep

+0

Это вопрос для пользователей vim, это не имеет никакого отношения к make. Я не использую vim (я использую Emacs), но из документации, которую я читал, я думаю, что вы хотите ':! make% <', чтобы передать имя файла без расширения. – MadScientist

+0

@Joydeep Правило '%:% .cob' сообщает, что оно может создать исполняемый файл (более конкретно, имя без расширения), если оно совпадает с именем с расширением .cob. 'make myprogram' будет пытаться и make' myprogram', если он найдет 'myprogram.cob', он будет использовать правило' cobc -free -x ... ', используя' myprogram.cob', как ввод и генерирующий 'myprogram'. Используйте любое имя, которое вам нравится, и передайте его имя. –