Makefileを実行可能にする方法は?

Makefileを実行可能にする方法は?

makeUbuntuファイルマネージャでダブルクリックすると、自動的に実行したいMakefileがあります。だから私はこのMakefileを実行可能にし、その上に次のshebang行を追加しました。

#!/usr/bin/make -f

実行すると、/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

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

答え1

#!/usr/bin/make -fMakefile の実行を許可する有効な shebang です。 Makefile の問題は、shebang ではなく、この問題を解決する場合に Windows 行終端を使用することです。例えばそして

sed -i $'s/\r$//' Makefile

Makefileが正しく実行されます。

makeこのようにMakefileを実行することと直接実行することの違いは、後者の場合、Windows行の終わりのために次のようにmake呼び出されることです。

make -f $'\r'Makefile

単一のキャリッジリターンで構成される名前のファイルが存在しないため、「該当するファイルまたはディレクトリなし」エラーが発生します。 Make がファイルを Makefile として処理するように要求されたら、ファイルを生成するか、必要に応じて更新を試みます。ここでMakeが探しているファイルがないので、それを生成しようとします。これは電話するMakeの基本ルール、C コンパイラの呼び出しが開始される場所です。

関連情報