如何使Makefile可执行?

Ere*_*evi 5 make shebang

我有一个 Makefile,我想make在双击它时自动运行(从 Ubuntu 文件管理器)。因此,我使这个 Makefile 可执行,并在其顶部添加了以下 shebang 行:

#!/usr/bin/make -f
Run Code Online (Sandbox Code Playgroud)

当我跑步时/usr/bin/make -f Makefile,我得到了想要的结果。

但是,当我双击 Makefile 或只是运行 时./Makefile,出现错误:

: No such file or directory
clang-9      -o .o
clang: error: no input files
make: *** [<builtin>: .o] Error 1
Run Code Online (Sandbox Code Playgroud)

使我的 Makefile 可执行的正确方法是什么?

以下是我的 makefile 的全部内容:

#!/usr/bin/make -f

# A makefile for building pdf files from the text (odt files) and slides (odp files).
# Author: Erel Segal-Halevi
# Since: 2019-02

SOURCES_ODP=$(shell find . -name '*.odp')
TARGETS_ODP=$(subst .odp,.pdf,$(SOURCES_ODP))
SOURCES_ODT=$(shell find . -name '*.odt')
TARGETS_ODT=$(subst .odt,.pdf,$(SOURCES_ODT))
SOURCES_DOC=$(shell find . -name '*.doc*')
TARGETS_DOC=$(subst .doc,.pdf,$(subst .docx,.pdf,$(SOURCES_DOC)))
SOURCES_ODS=$(shell find . -name '*.ods')
TARGETS_XSLX=$(subst .ods,.xlsx,$(SOURCES_ODS))

all: $(TARGETS_ODP) $(TARGETS_ODT) $(TARGETS_DOC) $(TARGETS_XSLX)
    #
    -git commit -am "update pdf files"
    -git push
    echo Done!
    sleep 86400

%.pdf: %.odt
    #
    libreoffice --headless --convert-to pdf $< --outdir $(@D)
    -git add $@
    -git add $<
    
%.pdf: %.doc*
    #
    libreoffice --headless --convert-to pdf $< --outdir $(@D)
    -git add $@
    -git add $<

%.pdf: %.odp
    #
    libreoffice --headless --convert-to pdf $< --outdir $(@D)
    -git add $@
    -git add $<

%.xlsx: %.ods
    #
    libreoffice --headless --convert-to xlsx $< --outdir $(@D)
    -git add $@
    -git add $<

clean:
    rm -f *.pdf
Run Code Online (Sandbox Code Playgroud)

Ste*_*itt 8

#!/usr/bin/make -f是一个允许执行 Makefile 的有效 shebang。你的Makefile的问题是\xe2\x80\x99t它的shebang,它\xe2\x80\x99s它使用了Windows行结束符;如果你解决这个问题,例如

\n
sed -i $\'s/\\r$//\' Makefile\n
Run Code Online (Sandbox Code Playgroud)\n

你的 Makefile 将正确运行。

\n

使用运行这样的 Makefile 和直接运行它之间的区别make在于,在后一种情况下,由于 Windows 行结尾,make被调用为

\n
make -f $\'\\r\'Makefile\n
Run Code Online (Sandbox Code Playgroud)\n

这会产生 \xe2\x80\x9cNo such file or directory\xe2\x80\x9d 错误,因为不存在名称由单个回车符组成的文件。当 Make 被要求将一个文件作为 Makefile 处理时,它会尝试生成该文件或在必要时更新该文件;由于 Make 在这里查找的文件丢失,因此它会尝试创建它。这会调用Make\xe2\x80\x99s 内置规则,这是 C 编译器调用的来源。

\n

  • `dos2unix` 经常被用作解决这个问题的工具。 (2认同)