首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使Makefile可执行?

如何使Makefile可执行?
EN

Unix & Linux用户
提问于 2022-10-20 04:51:13
回答 1查看 790关注 0票数 5

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

代码语言:javascript
复制
#!/usr/bin/make -f

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

但是,当我双击Makefile或只运行./Makefile时,我会得到一个错误:

代码语言:javascript
复制
: No such file or directory
clang-9      -o .o
clang: error: no input files
make: *** [: .o] Error 1

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

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

代码语言:javascript
复制
#!/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
EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2022-10-20 09:08:11

#!/usr/bin/make -f是允许执行Makefile的有效方法。Makefile的问题不在于它的执行,而是它使用了Windows行尾;如果您修复了这个问题,例如用

代码语言:javascript
复制
sed -i 生成文件将正确运行。使用make运行这样一个Makefile与直接运行它之间的区别在于,在后一种情况下,由于Windows的结尾,make被调用为make -f 这就产生了“no这类文件或目录”错误,因为没有包含一个回车返回的名称的文件。当Make被要求以Makefile的形式处理一个文件时,它会尝试生成它或在必要时更新它;因为在这里查找的文件丢失了,所以它尝试创建它。这会调用制作的内置规则,这是C编译器调用的来源。s/\r$//' Makefile生成文件将正确运行。使用D2运行这样一个Makefile与直接运行它之间的区别在于,在后一种情况下,由于Windows的结尾,D3被调用为A4这就产生了“no这类文件或目录”错误,因为没有包含一个回车返回的名称的文件。当Make被要求以Makefile的形式处理一个文件时,它会尝试生成它或在必要时更新它;因为在这里查找的文件丢失了,所以它尝试创建它。这会调用C5,这是C编译器调用的来源。\r'Makefile

这就产生了“no这类文件或目录”错误,因为没有包含一个回车返回的名称的文件。当Make被要求以Makefile的形式处理一个文件时,它会尝试生成它或在必要时更新它;因为在这里查找的文件丢失了,所以它尝试创建它。这会调用C5,这是C编译器调用的来源。

s/\r$//' Makefile

生成文件将正确运行。

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

A4

这就产生了“no这类文件或目录”错误,因为没有包含一个回车返回的名称的文件。当Make被要求以Makefile的形式处理一个文件时,它会尝试生成它或在必要时更新它;因为在这里查找的文件丢失了,所以它尝试创建它。这会调用C5,这是C编译器调用的来源。

票数 8
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/721698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档