2015-07-06 3 views
1

Я использую csh. Внутри моей Makefile У меня есть что-то вроде этого:Как запустить Makefile со списком аргументов из другого файла

run: 
    program -switch "--alpha 3 --beta 4 --gamma 5" 

Моя цель, чтобы быть в состоянии установить аргументы в -switch когда я бегу Makefile. Я нашел различные решения о том, как это сделать, но в моем случае аргументы типа alpha, beta и gamma составляют около 20-25. В идеале я хотел бы, чтобы поместить их в файл, как это:

file: simple_script_run

--alpha 3 \ 
--beta 5 \ 
--gamma 5 \ 
--..etc 

Я предпочел бы иметь аргументы в отдельных строках для удобства чтения. Файл simple_script_run расположен с другими подобными файлами, каждый из которых содержит конфигурацию аргумента внутри каталога run_scripts. Последний находится по тому же пути, что и мой makefile. Цель состоит в том, чтобы иметь возможность заменить список аргументов внутри Makefile, чтобы что-то вроде:

program -switch "$(RUN_ARGS)" 

Это является обязательным, что список аргументов содержатся с «». Теперь я хотел бы запустить сборочный файл с помощью команды, аналогичной:

make run RUN_ARGS=$(< run_scripts/simple_script_run) 

Очевидно, что это не сработало, и я удивляюсь, почему. Можете ли вы предложить решение для моего решения или лучшую идею? Я был бы рад услышать от вас.

+0

Я предполагаю, что проблема с этой попытки (так как вы не сделали на самом деле * * скажем, что это было), что вы получили частичную команду и то отказ от второй строки файла аргумента обрабатывается как команда в рецепте? make переменные расширяются до оболочки, поэтому строки новой строки расширяются буквально. Вам нужно преобразовать символы новой строки в пробелы, когда вы читаете файл в переменной. –

+0

Изменен файл аргументов, поэтому нет \ n return и аргументы просто разделены пробелами. Вывод оболочки «Недопустимое имя переменной» – Theo

+0

Оболочка выводит это когда? Цитирует аргумент '$ (<...)' аргумента (я не вижу, как это необходимо)? Что означает 'set -x' для этой строки' make' и строки в рецепте? –

ответ

0

Это работает для меня:

файл конфигурации (обратные косые не требуется):

--alpha 3 
--beta 5 
--gamma 5 

MyProg:

#!/bin/bash 
echo "arg1=$1" 
echo "arg2=$2" 

Makefile:

# define the newline as a multi-line variable 
define \n 


endef 

# Convert newlines to spaces in $(ARGS) 
MK_ARGS := $(subst ${\n}, , $(ARGS)) 
# MK_ARGS := $(shell echo "$(ARGS)") # A more expensive way 

all: 
     @echo "MK_ARGS=$(MK_ARGS)" 
     @bash myprog -switch "$(MK_ARGS)" 

Run результат make ARGS="$(< config)":

MK_ARGS=--alpha 3 --beta 5 --gamma 5 
1=-switch 
2=--alpha 3 --beta 5 --gamma 5 
+0

с использованием программы -switch "$ (MK_ARGS)" в bash вызвала запуск программы без аргументов "". В csh он выводит имя нелегальной переменной – Theo

+0

К сожалению, я не могу проверить ее с помощью 'csh'. Кажется, он работает с оболочкой 'bash'. –

+0

Я не думаю, что вам нужно «sed». make автоматически преобразует новые строки в пробелы в выводе функции '$ (shell)'. См. [Функция оболочки] (http://www.gnu.org/software/make/manual/make.html#Shell-Function). –

Смежные вопросы