2013-09-30 30 views
1

在makefile中,我试图遍历c文件并使用路径以及文件名。 例如对于/dir/dir2/file.c 我想要执行“cc /dir/dir2/file.c -o文件” 我不明白为什么basename和patsubst不起作用。它只是显示了现在的路径。 任何人都可以请帮忙吗?makefile迭代并检索文件名

test_files := Test/src/test_*.c 

compile_tests: 
    @for f in $(test_filenames); do \ 
     echo ">>> $(basename $(patsubst %.c, %, $$f))";\ 
    done 
+1

请注意显示的例子,当以显示你实际尝试过的。在上面你正在使用'test_files'和'test_filenames',这可能会让人误解真正的错误。 – MadScientist

+0

如果我们知道你真的想要做什么,这将有所帮助。 – Beta

回答

1

您不能将make函数与shell操作混合搭配。 Make将首先完全展开所有的变量和函数,然后将扩展的结果传递给shell,shell将其作为脚本运行。

您正试图在shell循环中使用make函数,但make函数首先被扩展,然后循环将在结果上运行。基本名称和patsubst运行在字符串$f上,该字符串没有任何路径名,并且与%.c模式不匹配,所以这些函数不起作用。

如果你想这样做,这样,你必须使用100%的shell操作,否则修改变量的外壳变得像在此之前:

test_filenames := $(wildcard Test/src/test_*.c) 

compile_tests: 
     @for f in $(basename $(patsubst %.c,%,$(test_filenames))); do \ 
      echo ">>> $$f";\ 
     done 

埃塔:如果你想要做的这一切在外壳,您可以使用:

test_filenames := $(wildcard Test/src/test_*.c) 

compile_tests: 
     @for f in $(test_filenames); do \ 
      echo ">>> $$(basename $$f .c)";\ 
     done 

或者更明确:

test_filenames := $(wildcard Test/src/test_*.c) 

compile_tests: 
     @for f in $(test_filenames); do \ 
      echo ">>> `basename $$f .c`";\ 
     done 
+0

但正如我所提到的,我需要源路径和文件名作为输出,所以我不能使用make命令。我需要在bash中按照你所说的做%100,但是对$$ f的bash操作不起作用。我试过bash的basename操作,例如:echo“>>> $(basename $$ f .c)”;仍然不起作用。你有什么其他的建议? – max

+0

我认为这会做到这一点:\t @for $ in $(test_files);做\ \t \t $(CC)$(LINKFLAGS)$(CPPFLAGS)$(MY_LIBS)$$˚F-o $(BUILD_BIN_DIR)$$($$基名.c的˚F); \ \t在做 – max

+1

的方法你注释不起作用,因为你正在尝试使用'$()'形式的反引号,但是如果你这样做,你必须转义'$',所以不会尝试扩展它,例如:'echo“> >> $$(basename $$ fc)“' – MadScientist