【问题标题】:How to run a Makefile with a list of arguments from another file如何使用来自另一个文件的参数列表运行 Makefile
【发布时间】:2015-07-07 08:22:51
【问题描述】:

我正在使用 csh。 在我的makefile里面我有这样的东西:

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

我的目标是在运行 makefile 时能够在 -switch 中设置参数。我找到了不同的解决方案,但就我而言,alpha、beta 和 gamma 类型的参数数量约为 20-25。理想情况下,我想将它们放在这样的文件中:

文件:simple_script_run

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

为了更好的可读性,我宁愿将参数放在单独的行中。文件 simple_script_run 与其他类似文件位于目录 run_scripts 中,每个文件都包含参数的配置。后者位于与我的 makefile 相同的路径中。 目的是能够将 makefile 中的参数列表替换为:

program -switch "$(RUN_ARGS)"

参数列表必须包含在“”中。现在我想使用类似于以下的命令运行 makefile:

make run RUN_ARGS=$(< run_scripts/simple_script_run)

显然,这不起作用,我想知道为什么。你能建议我的解决方案或更好的主意吗?我很高兴收到您的来信。

【问题讨论】:

  • 我假设该尝试的问题(因为您实际上并没有它是什么)是您获得了部分命令,然后从参数文件的第二行被视为配方中的命令? make 变量在 shell 前扩展,因此换行符在字面上扩展。将文件读入变量时,需要将换行符转换为空格。
  • 更改了参数文件,因此没有 \n 返回,并且参数只是用空格分隔。 shell 输出“非法变量名”
  • shell 什么时候输出?引用 $(&lt; ...) 参数是否有帮助(我不明白它应该如何必要)? set -xmake 行和配方中的行报告了什么?
  • 忘了提到我使用 c shell 是出于工具的原因。如果参数用空格分隔,它在 bash 下没有问题。但仍然没有解决我的问题。
  • csh 外部制造还是内部制造?因为 csh 内部的 make 众所周知,我相信,是一个非首发。外部制作我认为假设make run RUN_ARGS=$(&lt; ...) 是有效的csh 命令行并不重要(在这种情况下,您可能需要以不同的方式执行此操作,但这个想法应该没问题)。你从来没有告诉我 what 给出了那个论点错误。你能准确地展示这些尝试的输出吗?

标签: linux makefile command-line-arguments csh


【解决方案1】:

这对我有用:

配置文件(不需要反斜杠):

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

myprog:

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

生成文件:

# 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)"

make ARGS="$(&lt; config)"的运行结果:

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

【讨论】:

  • 在 bash 中使用 program -switch "$(MK_ARGS)" 导致程序在没有参数“”的情况下启动。在csh中,输出Illegal variable name
  • 很遗憾,我无法使用csh 对其进行测试。它似乎适用于 bash shell。
  • 我认为您在这里不需要sed。 make 将在$(shell) 函数的输出中自动将换行符转换为空格。见The shell function
  • 我也不知道我在这里看到了$(shell) 函数的意义(除了在这种情况下进行转换,这可能是一种昂贵的方法)。跨度>
  • @Etan Reisner:我最终设法使用 subst 而不是 shell 进行转换。
猜你喜欢
  • 2011-04-07
  • 1970-01-01
  • 2023-03-31
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
相关资源
最近更新 更多