[英]Makefile does not find target
我有以下Makefile,但它不起作用。 當我打電話
make html
我得到一個
make: *** No rule to make target `docs/index.html', needed by `html'. Stop.
錯誤,即使我認為我已經定義了它。
SRCDIR = source
OUTDIR = docs
RMD = $(wildcard $(SRCDIR)/*.Rmd)
TMP = $(RMD:.Rmd=.html)
HTML = ${subst $(SRCDIR),$(OUTDIR),$(TMP)}
test:
echo $(RMD)
echo $(TMP)
echo $(HTML)
all: clean update html
html: $(HTML)
%.html: %.Rmd
echo $(HTML)
@Rscript -e "rmarkdown::render('$<', output_format = 'prettydoc::html_pretty', output_dir = './$(OUTDIR)/')"
update:
@Rscript -e "devtools::load_all(here::here()); microcosmScheme:::updateFromGoogleSheet(token = './source/googlesheets_token.rds')"
## from https://stackoverflow.com/a/26339924/632423
list:
@$(MAKE) -pRrq -f $(lastword $(MAKEFILE_LIST)) : 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | sort | egrep -v -e '^[^[:alnum:]]' -e '^$@$$' | xargs
.PHONY: update clean cleanhtml all list
變量似乎是正確的:
15:21 $ make test
echo source/index.Rmd
source/index.Rmd
echo source/index.html
source/index.html
echo docs/index.html
docs/index.html
如果我按照以下方式進行更改,則它可以工作,但是目標指向SRCDIR,但我希望它指向OUTDIR:
RMD = $(wildcard $(SRCDIR)/*.Rmd)
HTML = $(RMD:.Rmd=.html)
# HTML = ${subst $(SRCDIR),$(OUTDIR),$(TMP)}
我相信這是一件小事...
這條規則:
%.html : %.Rmd
....
告訴make如何從foo.Rmd
文件構建文件foo.html
或從source/foo.Rmd
文件foo.Rmd
文件source/foo.html
或從docs/foo.Rmd
文件docs/foo.Rmd
docs/foo.html
文件。
它沒有告訴make如何從文件source/foo.Rmd
構建文件docs/foo.html
,因為匹配模式%
的詞干是不同的。
如果要編寫從source/foo.Rmd
構建docs/foo.html
的模式,則必須這樣編寫:
$(OUTDIR)/%.html : $(SRCDIR)/%.Rmd
....
因此與模式%
匹配的部分相同。
ETA其他一些注意事項:您應該在wildcard
函數中使用:=
,因為它的性能要好得多。 另外,您不應該在這里使用subst
,因為它會替換所有出現的字符串,如果您的任何.Rmd
文件包含例如字符串source
(例如source/my_source_file.Rmd
,它都可能會破壞事情(最好用patsubst
,如:
RMD := $(wildcard $(SRCDIR)/*.Rmd)
HTML := $(patsubst $(SRCDIR)/%.Rmd,$(OBJDIR)/%.html,$(RMD))
最后,您沒有顯示clean
目標的作用,但是讓all
依賴clean
目標是不尋常的。 通常,它是一個單獨的目標,僅在需要時才調用,例如make clean
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.