Как правильно сделать мой make-файл для компиляции и запуска? - PullRequest
17 голосов
/ 24 мая 2009

Вопрос, вероятно, не самый лучший, чтобы описать мою проблему, но я не мог придумать лучшего. Мой make-файл выглядит так:

PROGRAM_NAME = prog

OBJECT_FILES = $(PROGRAM_NAME).o
CFLAGS = -O2 -Wall -g

$(PROGRAM_NAME) : $(OBJECT_FILES)
    gcc $(CFLAGS) -o $@ $(OBJECT_FILES)

$(PROGRAM_NAME).o : $(PROGRAM_NAME).c data.h
    gcc $(CFLAGS) -c $<

clean :
    $(RM) $(PROGRAM_NAME)
    $(RM) $(OBJECT_FILES)
    $(RM) *~ *.bak

run :
    @$(MAKE) && ./$(PROGRAM_NAME) $(ARGS)

Когда я хочу скомпилировать и запустить, я просто делаю "make run". Проблема заключается в том, что моя программа обрабатывает сигнал, генерируемый Ctrl + Z, и если я запускаю свою программу с помощью «make run», сигнал будет отправляться на «make run», а не на саму мою программу.

По сути, вызов «make run» - это не то же самое, что прямой вызов «make && ./prog», потому что в первом случае «make run» не прекратится, пока «prog» не завершится первым.

Есть ли способ обойти это?

Ответы [ 4 ]

16 голосов
/ 24 мая 2009

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

run:    ${PROGRAM_NAME}
        ./${PROGRAM} ${ARGS}

Нет смысла запускать make, когда вы уже запускаете make - по крайней мере, не в этом контексте. Может быть, для рекурсивных операций (в разных каталогах), но см. ' Рекурсивное создание считается вредным '.

Кроме того, ваш make-файл обычно должен содержать цель 'all', и обычно он должен быть первой и, следовательно, целью по умолчанию.

15 голосов
/ 24 мая 2009

Запуск из make-файла немного необычен. Возможно, вы пытаетесь продублировать пункт меню «Скомпилировать и запустить», который предоставляют некоторые IDE? Марка плохо подготовлена ​​для этого.

Все, что происходит в целевых командах, происходит в подпроцессах, которые не подключены непосредственно к терминалу, поэтому make получает ваш ход нажатия клавиши.

Еще одна вещь, на которую нужно обратить внимание: обычно, в объектном файле на этапе исполняемого файла (связывание) используется другой набор флагов (LDFLAGS и LIBS), чем на этапе компиляции. В этом простом примере вы можете обойтись без него, но если вы скопируете этот make-файл для использования в более сложном случае, у вас возникнут проблемы.

4 голосов
/ 08 марта 2013

Если вы собираетесь строить и запускать снова и снова, вы можете использовать команду history, чтобы помочь с этим:

# Run this once
make && ./foo

# Repeat last command
!!
3 голосов
/ 24 мая 2009

Как сказал ответ dmckee, make (1) что-то делает, а не для компиляции и запуска.

Конечно, ничто не мешает вам создать оболочку псевдоним make-run , которая выполняет ' make && ./prog args '.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...