如何在不同的文件上从makefile调用pandoc?

如何在不同的文件上从makefile调用pandoc?,makefile,gnu-make,Makefile,Gnu Make,我正在写一个项目,希望使用make在文件上运行pandoc。到目前为止,我已经尝试将参数传递给make,就像我使用bash脚本一样 例如: $make第2章 在make文件中,章节是目标,2将是参数 我不知道makefiles是否具有获取cli参数的功能。我一直没能在地图上找到我要找的东西 到目前为止,我试着用这个食谱来制作 chapter: @pandoc -s -o "$1.epub" "$1.md" 我找回了这个错误 pandoc:.md:openBinaryFile:不存在(

我正在写一个项目,希望使用
make
在文件上运行
pandoc
。到目前为止,我已经尝试将参数传递给
make
,就像我使用bash脚本一样

例如:

$make第2章
在make文件中,
章节
是目标,
2
将是参数

我不知道makefiles是否具有获取cli参数的功能。我一直没能在地图上找到我要找的东西

到目前为止,我试着用这个食谱来制作

chapter:
    @pandoc -s -o "$1.epub" "$1.md"
我找回了这个错误

pandoc:.md:openBinaryFile:不存在(没有这样的文件或目录)
make:**[Makefile:2:章节]错误1

这是为了将我正在编写的一本书的部分转换为epubs。我愿意使用其他方法来实现这一点,因为标记不起作用。

在make中,这样说的自然方式是将所有章节作为目标枚举,通常作为
make all
的依赖项

所以基本上

src := $(wildcard *.md)
epubs := $(patsubst %.md,%.epub,$(src))

.PHONY: all
all: $(epubs)

%.epub: %.md
    pandoc -s -o $@ $<
能够说
make2
,并使其意思是
makech2.epub
。如果像这样系统地命名文件名,您可以将其概括为

short := $(patsubst ch%.md,%,$(src))
.PHONY: $(short)
$(short): %: ch%.epub
不要在前面使用
@
,这只会让事情变得更难。如果您不想看到输出并且不想破坏
Makefile
,可以使用
make-s

在makefile中,第二章是目标,第二章是参数

make命令行上对变量的赋值将覆盖makefile中的任何定义 (是的,这样的变量实际上变成了只读的)。 这建议使用类似以下内容的makefile:

num = $(error You must set $$num to the chapter number you want (make chapter num=4))

.PHONY: chapter
chapter:
    pandoc -s -o "${num}.epub" "${num}.md"
这是怎么回事? 如果你忘了设置num, 当make为本章扩展配方时
$(错误)
将导致make停止

你最初的例子呢

$ make chapter num=2
pandoc -s -o "2.epub" "2.md"
提示
  • 我很少建议使用
    @
    前缀-如果用户不想看到shell命令,可以使用make的
    -s
  • 不要说谎-特别是,您的规则不会生成名为
    的文件,因此请通过标记目标来告诉make

我喜欢您的解决方案,可能与您的解决方案重复。当我尝试
$make forward.epub
时,我得到了
Makefile:7:**混合了隐式和静态模式规则。停止。
这可能是目录布局的问题吗?对不起,我在依赖项声明中的冒号太多了;现在修好了。谢谢,这正是我要找的。我不熟悉制作文件。我想知道您是否知道在Makefile中包含
-s
的方法,因为使用
@
前缀是不好的?
@
可以,但是如果您确实想查看命令,如何将它们全部删除?(比如说调试)。我想你可以在顶部做一个
q:=@
,然后用
$q
开始每个配方行(例如
$qecho hello
)-单字符宏不需要在
{
}
中包围。[强制
-s
相当于强制
-j5
。实际上,这应该由用户IMHO决定。]
num = $(error You must set $$num to the chapter number you want (make chapter num=4))

.PHONY: chapter
chapter:
    pandoc -s -o "${num}.epub" "${num}.md"
$ make
Makefile:5: *** You must set $num to the chapter number you want (make chapter num=4).  Stop.
$ make chapter num=2
pandoc -s -o "2.epub" "2.md"