2009-06-03 6 views
1

Je veux faire la règle de correspondance de modèle pour camelcase dans mon makefile:makefile camelcase pattern matching

par exemple. Règle explicite:

MyFileName.java: nom_fichier_moi.proto protoc --java_out =. J'ai besoin d'une règle de correspondance de modèle pour ce qui précède, afin qu'une seule règle fasse le travail de création de la cible java de camelcase à partir du fichier proto correspondant.

Thnx à l'avance !!

Répondre

2

Remarque: Je suppose que vous utilisez Gnu make.

Vous ne pouvez pas faire cela directement dans Make. La solution est de générer un fichier contenant les règles avec un script (en utilisant sed ou awk, par exemple). Ensuite, incluez le fichier dans votre Makefile. Vous pouvez définir vos dépendances de sorte que make régénère le fichier include avant de l'inclure s'il est périmé. Les pages Make info ont plus de détails.

Toutes les versions de Make ne possèdent pas cette fonctionnalité.

0

Ne dites jamais jamais!

FILES:=foof_goog.proto zozo_bobo.proto 


define makeCamel 
$(strip \ 
$(subst .proto,.java, \ 
$(patsubst a%,A%, \ 
    $(patsubst b%,B%, \ 
    $(patsubst c%,C%, \ 
    $(patsubst d%,D%, \ 
    $(patsubst e%,E%, \ 
    $(patsubst f%,F%, \ 
    $(patsubst g%,G%, \ 
    $(patsubst h%,H%, \ 
    $(patsubst i%,I%, \ 
    $(patsubst j%,J%, \ 
    $(patsubst k%,K%, \ 
    $(patsubst l%,L%, \ 
    $(patsubst m%,M%, \ 
    $(patsubst n%,N%, \ 
    $(patsubst o%,O%, \ 
    $(patsubst p%,P%, \ 
    $(patsubst q%,Q%, \ 
    $(patsubst r%,R%, \ 
    $(patsubst s%,S%, \ 
    $(patsubst t%,T%, \ 
    $(patsubst u%,U%, \ 
    $(patsubst v%,V%, \ 
    $(patsubst w%,W%, \ 
    $(patsubst x%,X%, \ 
    $(patsubst y%,Y%, \ 
    $(patsubst z%,Z%, \ 
    $(subst _a,A, \ 
    $(subst _b,B, \ 
    $(subst _c,C, \ 
    $(subst _d,D, \ 
    $(subst _e,E, \ 
    $(subst _f,F, \ 
    $(subst _g,G, \ 
    $(subst _h,H, \ 
    $(subst _i,I, \ 
    $(subst _j,J, \ 
    $(subst _k,K, \ 
    $(subst _l,L, \ 
    $(subst _m,M, \ 
    $(subst _n,N, \ 
    $(subst _o,O, \ 
    $(subst _p,P, \ 
    $(subst _q,Q, \ 
    $(subst _r,R, \ 
    $(subst _s,S, \ 
    $(subst _t,T, \ 
    $(subst _u,U, \ 
    $(subst _v,V, \ 
    $(subst _w,W, \ 
    $(subst _x,X, \ 
    $(subst _y,Y, \ 
    $(subst _z,Z,$(1))))))))))))))))))))))))))))))))))))))))))))))))))))))) 
endef 



all: $(call makeCamel,$(FILES)) 



define makeTarget 
$(2):: $(1) 
    protoc --java_out=$(2) $(1) 

endef 
$(foreach x,$(FILES),$(eval $(call makeTarget,$x,$(call makeCamel,$x)))) 
+0

Cela ne fonctionne pas pour moi. Tout ce que je reçois suit: make: Rien à faire pour 'tout '. –

+0

il makefile est juste un échantillon. Vous devez remplacer la première ligne FILES: = xxxx avec la liste de vos fichiers .proto. Vous obtiendrez le message Rien à faire si l'un ou l'autre - FICHIERS est vide - ou - Les fichiers .java correspondants existent déjà btw: c'est pour Gnu make – an0nym0usc0ward