【问题标题】:Creating target from searched directories从搜索的目录创建目标
【发布时间】:2020-01-16 10:25:45
【问题描述】:

我想在我的项目中为每个名为“test”的目录创建单独的可执行文件。测试目录的结构如下: 测试.mk

test (dir)
|__test.mk
|__testRun.c
|__testRun.h

test.mk 包含特定测试的依赖项,testRun.c 是测试本身。

所以层次结构是这样的:

ROOT
|__Makefile
|__Module1 (dir)
  |__some files
  |__test (dir)
|__Module2 (dir)
   |__some files
   |__test (dir)
|__Module3 (dir)
   |__some files
   |__test (dir)
|__outdir  (dir)
   |__test1 (exec)
   |__test2 (exec)
   |__test3 (exec)

我想在根父目录中运行单个 Makefile。我希望它搜索所有test 目录并在outdirectory 中创建测试可执行文件。到目前为止,我有这个:

生成文件

CFLAGS =    -I$(DIRTEST) -I$(DIRTEST)/..
OUTDIR=     ./outdirectory
DIRTEST =   $(shell find -type d -not -path "$(OUTDIR)/*" -name "test" -prune )

我不知道如何创建从不同目录的源和标头创建目标可执行文件的规则。我一直在寻找类似问题的解决方案,但到目前为止还没有运气。

注意:我不想使用递归 make。 test.mk 看起来像这样:

SRCTEST = module1/test/testRun.c \
          module1/module1.c
CFLAGS += -Imodule1

【问题讨论】:

    标签: c linux bash makefile


    【解决方案1】:

    您可以使用 bash 脚本文件来构建变量,以防万一您避免递归构建。

    cat module1/test/test.sh 
    export SRCTEST="module1/test/testRun.c 
        module1/module1.c"
    export CFLAGS="$CFLAGS -Imodule1"
    
    cat module2/test/test.sh 
    export SRCTEST="module2/test/testRun.c
              module2/module2.c"
    export CFLAGS="$CFLAGS -Imodule2"
    

    那么你的Makefile 可能看起来像:

    test1:
        source module1/test/test.sh && gcc -o $@ $$CFLAGS $$SRCTEST
    test2:
        source module2/test/test.sh && gcc -o $@ $$CFLAGS $$SRCTEST
    

    你也可以用include 指令做一些事情。通过检查构建目标可以避免重新定义,但这不是一个好方法。

    【讨论】:

      【解决方案2】:

      你的例子不够清楚,我们无法回答。

      一方面,tt不清楚测试可执行文件的名称与模块名称的关系。真的是模块以数字结尾并且生成的测试程序也应该以相同的数字结尾(Module1 -> test1)吗?还是有其他关系? test.mk 文件中似乎没有任何包含测试名称的变量,那么如何计算测试名称?

      其次,如果您在每个test.mk 文件中重新定义相同的变量,您的生活将变得非常困难。 make 中没有“作用域”允许您说“CFLAGS 的此实例仅用于此包含的 makefile”。每次包含不同的test.mk 文件时,它都会覆盖之前的设置。

      可以完成:您需要使用define 变量的组合来保存规则定义,然后使用eval 来评估规则。

      假设您向定义测试名称的test.mk 添加了一个新变量,并且您也使用此名称限定了变量;那么你的生活就轻松多了:

      Module1/test/test.mk 将包含:

      TESTNAME = test1
      test1_SRCTEST = module1/test/testRun.c \
                      module1/module1.c
      test1_CFLAGS = -Imodule1
      

      现在在您的主 makefile 中,您将创建一个变量来保存您想要定义的规则:

      define MAKETEST
      include $T
      $$(OUTDIR)/$$(TESTNAME): $$(OUTDIR)/% : $$($$(TESTNAME)_SRCTEST)
              $$(CC) $$(CPPFLAGS) $$(CFLAGS) $$($$*_CFLAGS) -o $$@ $$^
      endef
      
      $(foreach T,$(DIRTEST),$(eval $(MAKETEST)))
      

      注意,这是未经测试的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-26
        • 1970-01-01
        • 2013-01-20
        相关资源
        最近更新 更多