Использование ввода из командной строки в makefile - PullRequest
0 голосов
/ 30 октября 2019

В настоящее время у меня есть make-файл, который при запуске свяжет файлы .h и .c, а затем создаст двоичный файл. Можно ли заставить make-файл выполнить этот двоичный файл, просто выполнив команду make с последующим вводом имя_файла?

Мой make-файл выглядит примерно так:

CC = g++
cppflags = "-std=c++0x"
all : interpreter

byte.o : opcode.h byte.h byte.cpp
    $(CC) -c $(cppflags) byte.cpp
interpreter : byte.o main.cpp
 $(CC) $(cppflags) byte.o main.cpp -o interpreter

Если я сделаю make, я получу исполняемый файл interpreter, который принимает имя входного файла в качестве аргумента. То, что я хочу сделать, это изменить мой make-файл, чтобы я мог сделать make <file_name>, чтобы make-файл запускал исполняемый файл вместо того, чтобы использовать бинарный файл, созданный уже имеющейся у меня make. Имя входного файла не может быть жестко запрограммировано.

Ответы [ 3 ]

0 голосов
/ 30 октября 2019

Обычно вы вызываете make для цели для создания (например, make interpreter), а не для входного файла (который make не знает, как собрать). Одним из распространенных способов решения этой проблемы является определение (на основе правил) цели для выполнения кода. Например .res («.res» для результата). Цель запустит программу и сохранит вывод в файл .res.

Вы вызовете цель с make input_file_name.res

%.res: % interpreter
    interpreter $< > $@

Обратите внимание на явную зависимость для построения интерпретации перед запускомэта цель.

См. make make 'variable' для получения дополнительной информации о $< (входной файл) и $@ (выходной файл)

0 голосов
/ 01 ноября 2019

не пытайтесь заставить make принимать аргументы, отличные от целей для сборки.

вместо этого создайте скрипт:

#! /bin/sh
# rebuild if necessary
make
# run interpreter with arguments
interpreter "$@"

и запустите с аргументами:

$ ./buildtheninterpret.sh filenametointerpret

для более подробного объяснения, почему это и предостережения от взлома makefile, прочитайте мой ответ на другой похожий вопрос: Передача аргументов в "make run"

0 голосов
/ 30 октября 2019

Попробуйте этот простой пример:

  a : a.c
          gcc a.c -o a.o
          ./a.o
  b : b.c
          gcc b.c -o b.o
          ./b.o

при запуске "make a", исполняемого файла. "make b", bo исполняемый.

...