匹配路径中的 %

Matching % in a path

我怎样才能像这样进行目标匹配:

efl_class_bundles = \                                                         
  efl_class_returnszero \                                                     
  efl_class_cmd_regcmp \                                                      
  efl_class_expression                                                        

.PHONY: $(efl_class_bundles)                                                  
$(efl_class_bundles): version syntax \                                        
  test/$@/efl_main.json \                                                     
  test/$@/01_$@.json \                                                        
  test/$@/02_efl_test_simple.json                                             
   prove t/efl_class_$@_csv.t                                                 
   prove t/efl_class_$@_json.t                                                

test/%/efl_main.json: test/%/efl_main.csv                                     
   $(CSVTOJSON) -b efl_main < $< > $@                                         
   perl -pi -e 's/csv/json/' $@

当我尝试 'make efl_class_returnszero' 时出现以下错误,这表明先决条件 test/$@/efl_main.json 无法匹配目标 'test/%/efl_main.json' Han 我可以做这个吗工作?

prove t/00_version.t
t/00_version.t .. ok   
All tests successful.
Files=1, Tests=1,  0 wallclock secs ( 0.03 usr  0.00 sys 
Result: PASS
prove t/01_syntax.t
t/01_syntax.t .. ok   
All tests successful.
Files=1, Tests=1,  0 wallclock secs ( 0.02 usr  0.00 sys 
Result: PASS
make: *** No rule to make target 'test//efl_main.json', needed by
  'efl_class_returnszero'.  Stop.

您不能在先决条件列表中使用像 $@ 这样的自动变量。它们通常只在食谱中可用。请参阅手册中的 automatic variables

如果需要,您可以启用secondary expansion;您的规则将如下所示:

.SECONDEXPANSION:
(efl_class_bundles): version syntax \
                     test/$$@/efl_main.json \
                     test/$$@/01_$$@.json \
                     test/$$@/02_efl_test_simple.json
        prove t/efl_class_$@_csv.t
        prove t/efl_class_$@_json.t