使用 Makefile 从特定文件名创建文件夹

with Makefile create folders from specific filenames

我需要一个 Makefile 为每个 <file.rst> 创建一个 <file> 文件夹然后执行
<file.rst> 上的气垫船需要一个文件夹作为第二个参数


    $ tree                                                                                          
    .                                                                                               
    ├── a.rst                                                                                       
    ├── b.rst                                                                                       
    └── Makefile                                                                                    

有了这个 Makefile

    $ cat Makefile                                                                                  
    .PHONY: html   
                                                                               
    HTML_TARGETS:= $(patsubst %.rst,%.html,$(wildcard *.rst))                                       
                                                                                                    
    html: $(HTML_TARGETS)                                                                           
                                                                                                    
    %.html: %.rst                                                                                   
        @rm -fr $(basename $@ .html)                                                                
        @mkdir -p $(basename $@ .html)                                                              
        @hovercraft -Ns $< $(basename $@ .html)                                                     
    $                                                                                               

我有点工作

.
├── a
│   └── index.html
├── a.rst
├── b
│   └── index.html
├── b.rst
└── Makefile

我觉得这个 Makefile 是多么的古怪,有什么更好的写法吗?

顺便说一句,我无法在 Makefile 中添加此 echo:

@echo output done in $(basename $@ .html)/index.html                                            

我得到:

 output done in a /index.html                                                                   
 output done in b /index.html                                                                   
                 ^                                                                              
                 └─ with an unwanted space                                                      
                                                                                                

我想打印:

 output done in a/index.html                                                                    
 output done in b/index.html     

如果我理解正确,你想创建一个目录“x”,然后对每个文件“x.rst”执行hovercraft x.rst x/index.html,那么这应该是一个简洁的方法。

SOURCES := $(wildcard *.rst)
TARGETS := $(SOURCES:.rst=/index.html)

%/index.html: %.rst
    mkdir -p $*
    hovercraft $< $@

.PHONY: all
all: $(TARGETS)