nal*_*ply 17 makefile heredoc gitignore
这有可能吗?怎么样?
更新:我需要这个,因为我从动态和静态数据创建了一个文件.
使用案例:我有一个测试目录.每个C文件生成一个测试可执行文件 同
SRCS = $(wildcard [a-z]*.c)
Run Code Online (Sandbox Code Playgroud)
我可以根据需要添加新的测试,make会找到新的测试,编译,运行和valgrind它们.我也用git.我.gitignore想要包含可执行文件.
所以那里.如何创建.gitignore和包含静态数据,即我想要忽略的文件(*.o和depend)以及动态可执行文件?
Ash*_*lor 23
另一个GNU Make解决方案.
您可以使用define和export命令执行以下操作:
define GITIGNOREDS
*.o
depend
endef
SRCS = $(wildcard [a-z]*.c)
EXES = $(SRCS:.c=)
export GITIGNOREDS
.gitignore: $(SRCS)
echo $(EXES) | sed 's/ /\n/g' > $@
echo "$$GITIGNOREDS" >> $@
Run Code Online (Sandbox Code Playgroud)
你必须小心$(x)定义块内的扩展(即).
Cal*_*leb 10
是的你可以.正如其他人所说,你可能不应该,但你可以.Ash的答案有一个涉及定义命令的解决方案,但这很简洁,并且可以使变量扩展到正确的值变得棘手.另一个技巧是使用.ONESHELL:特殊目标.
有时您希望将配方中的所有行传递给shell的单个调用.通常有两种情况,这是有用的:首先,它可以通过避免额外的进程来提高makefile中的性能,其中配方由许多命令行组成.其次,您可能希望在配方命令中包含换行符(例如,您可能正在使用与SHELL非常不同的解释器).如果.ONESHELL特殊目标出现在makefile中的任何位置,则每个目标的所有配方行将提供给shell的单个调用.配方行之间的换行符将被保留.
几句警告:
-或@禁止输出或忽略错误的行前缀运算符仅适用于所有配方的第一行,并对后面的所有行生效.有了这个,这里是生成markdown文件的样子:
SHELL = bash
.ONESHELL:
MYVAR = "Some Title"
file.md:
cat <<- EOF > $@
$(MYVAR)
========
This stuff will all be written to the target file. Be sure
to escape dollar-signs and backslashes as Make will be scanning
this text for variable replacements before bash scans it for its
own strings.
Otherwise formatting is just as in any other bash heredoc. Note
I used the <<- operator which allows for indentation. This markdown
file will not have whitespace at the start of lines.
Here is a programmatic way to generate a markdwon list all PDF files
in the current directory:
`find -maxdepth 1 -name '*.pdf' -exec echo " + {}" \;`
EOF
Run Code Online (Sandbox Code Playgroud)
注意另外一个问题是Make跳空行.如果你的heredoc内容中有一个空行是很重要的,你需要确保用适当的空白级别缩进该行以匹配heredoc,否则Make会吃它而不是将它传递给cat!
GNU Makefile 可以执行以下操作。这很丑陋,我不会说你应该这样做,但我在某些情况下会这样做。
.profile = \
\#!/bin/sh.exe\n\
\#\n\
\# A MinGW equivalent for .bash_profile on Linux. In MinGW/MSYS, the file\n\
\# is actually named .profile, not .bash_profile.\n\
\#\n\
\# Get the aliases and functions\n\
\#\n\
if [ -f \$${HOME}/.bashrc ]\n\
then\n\
. \$${HOME}/.bashrc\n\
fi\n\
\n\
export CVS_RSH="ssh"\n
#
.profile:
echo -e "$($(@))" | sed -e 's/^[ ]//' >$(@)
Run Code Online (Sandbox Code Playgroud)
make .profile 如果不存在,则创建一个 .profile 文件。
此解决方案用于应用程序仅在 POSIX shell 环境中使用 GNU Makefile 的情况。该项目不是平台兼容性有问题的开源项目。
目标是创建一个 Makefile,便于设置和使用特定类型的工作空间。Makefile 带来了各种简单的资源,而不需要其他特殊档案等。从某种意义上说,它是一个 shell 档案。然后,程序可以说诸如将此 Makefile 放入文件夹中以进行工作之类的事情。设置您的工作区 enter make workspace,然后执行 blah、 entermake blah等。
可能会变得棘手的是弄清楚要引用什么。以上完成了这项工作,并且接近在 Makefile 中指定 here 文档的想法。对于一般用途来说,这是否是一个好主意是另一个问题。