2015-03-03 20 views
5

Nie mogę wymusić, aby make użyć bardziej szczegółowej reguły. Pracuję z wersją 3.81, która jest supposed to use the first rule it comes to, ale to nie działa, gdy bardziej szczegółowa reguła ma zależność , która musi być skonstruowana z inną regułą. Oto podstawowe obrazku:Wymuś zastosowanie bardziej szczegółowej reguły

#rule for the dependency of the more specific rule 
%.bbl: %.tex *.bib 
    <build the .bbl file> 

#more specific rule 
some_prefix%.pdf: some_prefix%.tex some_prefix%.bbl 
    <build the .pdf> 

#general rule 
%.pdf: %.tex 
    <build the .pdf> 

Więc zasadniczo chcę make budować pdf z pliku .bbl jeśli pasuje some_prefix, inaczej używać bardziej ogólną zasadę. Niestety, chyba że usunę zależność od pliku .bbl, druga zasada nigdy nie zostanie wywołana.

wydaje mi się, aby móc dostać pracy poprzez dodanie hack do ogólnej zasady:

%.pdf: %.tex %.hack 
    <make the pdf with a more general rule> 

%.hack: %.tex 
    touch [email protected] 

To wydaje się działać, a .hack pliki są automatycznie usuwane, ale jak sama nazwa wskazuje, jest to straszny hack. Wygląda na to, że musi istnieć jakiś lepszy sposób na wymuszenie zastosowania konkretnej reguły.

Jak mogę zmusić markę do korzystania z bardziej szczegółowej reguły? Wprowadzenie go na pierwszy plan nie pomaga.

+0

Reguła '% .bbl' działa poprawnie sama? To znaczy, że możesz uruchomić 'make some_prefix_something.bbl' gdy istnieje plik' some_prefix_something.tex' i losowy '* .bib' i czy działa on poprawnie? Co 'make -d' mówi o tym, co robi, gdy nie używa reguły w sposób, jakiego oczekujesz? –

+0

@EtanReisner, to ciekawe: jeśli najpierw zrobię plik '.bbl', a potem utworzę' .pdf', to działa. Plik '.bbl' zwykle jest usuwany po uruchomieniu, ale (to jest to, czego chcę), więc nie działa bez jawnego tworzenia' .bbl'. – Shep

+1

Dokładnie tego oczekiwałbym od mojej odpowiedzi poniżej: gdy istnieją pliki 'bbl', to jest to krok 5 algorytmu, ponieważ plik wymagań wstępnych już istnieje. Dopiero gdy pliki jeszcze nie istnieją, muszą spróbować użyć łączenia reguł, aby je utworzyć. – MadScientist

Odpowiedz

4

Zapominasz bardzo ważny aspekt implicit rule search algorithm: makezawsze preferuje ukrytych reguł, które mają warunki, które są wyraźne cele, na niejawny reguła, gdzie jednym z warunków wstępnych schematów nie pasuje znany cel i musi być zbudowany przez łańcuch reguł. Zobacz krok nr 5 w algorytmie, w porównaniu z krokiem # 6. Jest to poza normalnym porządkiem reguł "pierwsze w makefile".

Jeśli chcesz to zrobić, musisz zapisać regułę bbl jako statyczną regułę wzorca, a nie rzeczywistą regułę wzoru, tak aby pliki bbl były wyraźnymi celami, a nie pośrednimi celami.

+0

Jak napisać regułę 'bbl' jako regułę wzoru statycznego? – Shep

+3

Potrzebujesz listy plików 'bbl':' BBL_FILES = foo.bbl bar.bbl biz.bbl', a następnie zmienisz wprowadzenie reguły wzorca na '$ (BBL_FILES):% .bbl:% .tex * .bib' (i reszta reguły). Teraz jest to reguła statycznego wzorca. – MadScientist

+3

Należy zauważyć, że reguły wzorców statycznych nie są jedynym sposobem rozwiązania tego problemu. Musisz tylko sprawić, by te pliki 'bbl' były" znane ". Wymienienie ich (jawnie) jako celów lub wymagań _anywhere_ w pliku makefile jest wystarczająco dobre. Na przykład biorąc pod uwagę powyższe przypisanie zmiennych, możesz napisać nową regułę 'make_bbls: $ (BBL_FILES)' i to byłoby wystarczające. Nie potrzebujesz niczego, aby polegać na 'make_bbls'; samo posiadanie tej reguły jest wystarczające. – MadScientist