Reguła Makefile pattern dla no extension?

Mam kilka aplikacji, które są zbudowane z tego samego typu reguły make:

apps = foo bar baz

all: $(apps)

foo: foo.o $(objects)
    $(link)

bar: bar.o $(objects)
    $(link)

baz: baz.o $(objects)
    $(link)

Gdyby miały rozszerzenie (na przykład .x), mógłbym utworzyć regułę wzorca w stylu:

%.x: %.o $(objects)
    $(link)

I nie musiałbym wypisywać nowej reguły dla każdej aplikacji.

Ale nie mają rozszerzenia, i jestem prawie pewien, że:

%: %.o $(objects)
    $(link)

Nie zadziała (ponieważ określa, że do zbudowania dowolnego pliku można użyć tej reguły).

Czy jest i tak sprecyzowanie jednej zasady, która będzie obejmuje wszystkie $(apps) zasady budowania?

Author: Andrew Tomazos, 2013-03-30

3 answers

To wygląda jak zadanie dla reguła wzorca statycznego :

$(apps) : % : %.o $(objects)
    $(link)
 26
Author: Beta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-30 12:49:56
%: %.o $(objects)
    $(link)

Powyższe powinno zadziałać.

Możesz ograniczyć zakres reguły, przekształcając ją w reguła wzorca statycznego , tak aby była brana pod uwagę tylko dla Twojej listy celów:

$(apps) : % : %.o $(objects) # only consider this for $(apps) targets
    $(link)
 7
Author: Maxim Egorushkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-30 12:51:21

Nie jest to odpowiedź na to, czego szukasz , ale powód, który może wyjaśniać, dlaczego taki poziom generycznego kodu może nie przynieść dobrych wyników. ....

Statyczne wzorce polegają na obecności łodygi, aby dopasować i zbudować łańcuch zależności. prawie w taki sam sposób jak reguły Ukryte (które są używane dla celów, które nie mają recipie.)

Widzę, co chciałeś osiągnąć, tworząc ogólną regułę, która spełni wszystkie docelowe kontrole dla obiektu i linku w Twoim kod.

Coś takiego::

 % : % : $(rule1)
         echo / generic code ;

Tak, że jest wywoływany dla wszystkich aplikacji w różnych scenariuszach

Ponieważ nie chcesz dodawać rozszerzenia (staje się to źródłem niektórych problemów ) problem polega na tym, że cel zostanie odzwierciedlony również w zależności, ponieważ nie będzie możliwości rozróżnienia zależności od celów.

/ Align = "center" bgcolor = "# e0ffe0 " / cesarz chin / / align = center / ..
 $ make -nf mk.t
   mk.t:18: *** mixed implicit and static pattern rules.  Stop.

:), spróbuję jeszcze raz jutro zobaczę, czy uda mi się to jakoś załatwić. Ładne pytanie.

 0
Author: nsd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-30 20:39:38