2015-03-03 18 views
5

Daha özel bir kural kullanmak için make'u zorlayamıyorum. supposed to use the first rule it comes to olan 3.81 sürümü ile çalışıyorum, ancak bu daha özel kural başka bir kural ile oluşturulmuş bir bağımlılık bağımlı olduğunda bu işe yaramaz. İşte temel resmim:Daha özel bir kural kullanmak için zorla

#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> 

Böylece temelde .bbl dosya ile pdf inşa etmek make istiyorum aksi daha genel kural kullanabilirsiniz, some_prefix eşleşirse. Ne yazık ki, .bbl dosyasına bağımlılığı kaldırmazsam, ikinci kural asla çağrılmaz.

ben genel kurala yazarlardan ekleyerek bu çalışma elde edebilmek görünmektedir:

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

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

Bu iş gibi görünüyor ve .hack dosyalar otomatik olarak silinir, ancak adından da anlaşılacağı gibi, bu korkunç bir hack. Belirli bir kuralın kullanımını zorlamak için daha iyi bir yol olmalı gibi görünüyor.

Daha belirli bir kuralı kullanmaya nasıl zorlanabilirim? İlk önce ona yardım etmek işe yaramıyor. Sen implicit rule search algorithm çok önemli bir yanını göz ardı edilir

+0

Bu ".bbl" kuralı doğru şekilde çalışıyor mu? Yani "some_prefix_something.tex" ve rastgele '* .bib' dosyaları var ve düzgün çalıştığı zaman 'make some_prefix_something.bbl' komutunu çalıştırabilirsiniz? -d, kuralınızı beklediğiniz gibi kullanmadığında ne yaptığının ne olduğunu söyler? –

+0

@EtanReisner, bu ilginç: Eğer '.bbl' dosyasını ilk yaptıktan sonra' .pdf'yi çalıştırırsam çalışır. '.bbl' dosyası normalde çalıştırdıktan sonra silinir, ancak (istediğim de budur), bu yüzden ilk önce' .bbl' yi açıkça oluşturmadan çalışmaz. – Shep

+1

Tam olarak benim yanıtımdan beklediğim şey şu: bbl dosyaları varken, önkoşul dosyası zaten mevcut olduğundan algoritmanın 5. adımı geçerlidir. Sadece dosyalar henüz mevcut değilken, bunları oluşturmak için kural zincirleme kullanmayı denemek gerekiyor. – MadScientist

cevap

4

: önkoşul desen biri bilinen bir hedef eşleşmiyor ve inşa edilmelidir nerede makehep açık hedefler örtük bir kuralın üzerine vardır önkoşullar var örtük kurallar tercih kural zincirleme ile. Algoritmada # 5 numaralı adıma bakın. Bu, desen maketlerinin sıralamasında "makefile'deki ilk" den başka bir şey değildir.

Bunu yapmak isterseniz, bbl kuralını bir kural dışı desen kuralı olarak değil, bir statik desen kuralı olarak yazmanız gerekir, böylece bbl dosyaları örtülü hedefler değildir.

+0

"bbl" kuralını statik desen kuralı olarak nasıl yazarım? – Shep

+3

'bbl' dosyalarının bir listesine ihtiyacınız vardır:' BBL_FILES = foo.bbl bar.bbl biz.bbl' sonra desen kuralı girişini '$ (BBL_FILES) olarak değiştirirsiniz:% .bbl:% .tex * .bib' (ve kuralın geri kalanı). Şimdi statik bir desen kuralı. – MadScientist

+3

Statik örüntü kurallarının bunu çözmenin tek yolu olmadığını belirtmeliyim. Sadece bu "bbl" dosyalarının bir şekilde "bilinen" olmasını sağlamanız gerekiyor. Makefile'de hedefleri veya önkoşulları _anywhere_ olarak onları (açıkça) listelemek yeterlidir. Örneğin yukarıdaki değişken atamasıyla yeni bir kural yazabilirsiniz: make_bbls: $ (BBL_FILES) 've bu yeterli olacaktır. Make_bbls'na bağlı olmak için hiçbir şeye ihtiyacınız yok; sadece bu kurala sahip olmak yeterlidir. – MadScientist

İlgili konular