【问题标题】:How can I write a makefile that can accept parameters from the CMD line如何编写一个可以接受来自 CMD 行的参数的 makefile
【发布时间】:2018-09-23 22:03:43
【问题描述】:

所以我正在努力实现我自己的类似于链表的数据结构 我创建了一个 make 文件,它使用测试用例文件编译我的 .c 文件,该文件检查我的实现是否正确

我的 make 文件现在可以正常工作,但如果我需要更改测试用例,我必须手动编辑我的 make 文件

test:
        gcc -o test LL.c testcase00.c -g
        ./test

clean:
        rm test

我想知道是否有一种方法可以在我调用make 时传递我想测试的测试用例的编号,例如make 05 会自动编译我的LL.ctestcase05.c 假设所有文件在同一目录中。

谢谢!

【问题讨论】:

  • 使用 make 最简单、最自然的方法是传递变量,例如 make foo=bar all
  • 好吧,我不确定它是如何工作的,我将如何将它应用于我的情况?我会在调用 make 时将 testcase 更改为 foo 然后输入 testcaseXX.c 吗?
  • 我添加了一个答案来展示这个想法,请看一下。

标签: c linux makefile gnu-make


【解决方案1】:

下面的 makefile 将生成一个可执行文件testcase,由其中一个测试用例的目标文件组成。

当像make TEST_ID=02 这样调用时,它将使用testcase02.c

它没有明确宣布依赖gmake 明确规则的编译规则(通常有效)。

.PHONY: all
all: testcase

testcase: testcase$(TEST_ID).o
    @echo "making test $(TEST_ID)..."
    gcc $(LDFLAGS) -o $@ $^

或者,如果您需要一起构建和运行,您可以使其更简单(对所有内容使用隐式,它将生成并运行名为 testcase$(TEST_ID) 的可执行文件):

.PHONY: all
all: testcase$(TEST_ID)
    @echo "running test $(TEST_ID)..."
    $^

【讨论】:

    【解决方案2】:

    bash$ 使 NN=05

    在 Makefile 中:

    SRC=testcase$(NN).c
    test:
        gcc -o test LL.c $(SRC) -g
    

    【讨论】:

      【解决方案3】:
      # default testcase
      case ?= 00
      
      test:
              gcc -o test LL.c testcase$(case).c -g
              ./test
      
      clean:
              rm test
      

      在这个makefile中case ?= 00设置默认变量名。环境变量和命令行会覆盖此默认值。所以

      make
      

      将使用testcase00.c

      make case=05
      

      将使用testcase05.c

      export case=07
      make
      

      将使用testcase07.c

      【讨论】:

        猜你喜欢
        • 2013-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-09
        相关资源
        最近更新 更多