Błąd „wielu wzorców docelowych” Makefile

82

Mój plik makefile kończy się niepowodzeniem z błędem:

Makefile:34: *** multiple target patterns.  Stop.

Co to naprawdę oznacza, jak mogę to naprawić?

( Podręcznik GNU make , napisany przez Kapitana Oczywistego, nie pomaga).


Znalazłem to. Miałem regułę w formie:

$(FOO): bar

gdzie FOOzostało ustawione z polecenia powłoki, które zanieczyściło go komunikatem o błędzie zawierającym dwukropek.

Kornel
źródło
Te odpowiedzi to tylko parafrazy „masz wiele wzorców docelowych”. Myślę, że nie. Jak mogę to sprawdzić? Co może to wywołać? Jakie środki ostrożności są potrzebne, aby zapobiec temu problemowi?
Kornel
2
Wszystko działało przez minutę, a potem mój skrypt kichnął (pół) okrężnicę ... heheh. Pociłem się próbując znaleźć problem przez co najmniej 3 godziny, zanim znalazłem odpowiedź twoją i @mcr. Właśnie uratowałeś mi wiadro potu !!
GuruM,
Prawdziwą przyczyną tego problemu jest GNU Make będący okropnym kawałkiem gnoju, który powinien był umrzeć dziesiątki lat temu.
antred

Odpowiedzi:

62

Miałem to w Makefile

MAPS+=reverse/db.901:550:2001.ip6.arpa 
lastserial:  ${MAPS}
    ./updateser ${MAPS}

To z powodu :w nazwie pliku. Rozwiązałem to z

                      -------- ogłoszenie
                     / /
                    vv
MAPS + = reverse / db.901 \: 550 \: 2001.ip6.arpa
ostatnia seria: $ {MAPS}
    ./updateser $ {MAPS}
mcr
źródło
1
mam ten sam problem, ale nie rozumiem twojej odpowiedzi, czy rozwiniesz to dla mnie dalej,
Pir Fahim Shah
4
@PirFahimShah Odpowiedzią jest stwierdzenie, że dwukropki w nazwie pliku (db.901: 550: 2001.ip6.arpa) muszą zostać zmienione. mcr ucieka przed dwukropkami, umieszczając przed nimi ukośnik odwrotny. W ten sposób make nie interpretuje dwukropków jako specjalnego symbolu.
Loduwijk
1
Dzięki, u mnie zadziałało. C:/Qt/5.8/mingw53_32/bin/rcc.exeW jednej z reguł Makefile miałem jakąś starą ścieżkę systemu Windows z dwukropkiem ( ). Usuń te automatycznie generowane pliki makefile, jeśli tworzysz na komputerze z systemem Linux
Vadim Kotov,
Windows make przełączył się na wsl (ubuntu) i dostał ten błąd, make cleana następnie go makerozwiązał. _build/nrf52840_xxaa/app_mpu.c.o: ../../../app_mpu.c \
Błędna
22

Oprócz konieczności opuszczania dwukropków, jak w oryginalnej odpowiedzi, odkryłem, że jeśli wcięcie jest wyłączone, możesz potencjalnie napotkać ten sam problem. W jednym pliku makefile musiałem zamienić spacje na tabulator, co pozwoliło mi ominąć błąd.

demongolem
źródło
W tym przypadku marka GNU może również zgłosić „Brak reguły dla celu”.
davenpcj
4

Chcę tylko dodać, jeśli pojawi się ten błąd, ponieważ używasz plików Cygwin i generowanych automatycznie, możesz to naprawić za pomocą następującego seda,

sed -e 's@\\\([^ ]\)@/\1@g' -e 's@[cC]:@/cygdrive/c@' -i filename.d

Być może będziesz musiał dodać więcej znaków niż tylko spację do listy ucieczki w pierwszym podstawieniu, ale masz pomysł. Koncepcja jest taka, że ​​/ cygdrive / c jest aliasem dla c:, które marka cygwin rozpozna.

I równie dobrze może wrzucić

-e 's@^ \+@\t@'

na wypadek, gdybyś przypadkowo zaczął od spacji (chociaż myślę, że będzie to zwykle błąd „brakującego separatora”).

Sean McClain
źródło
3

Spotkałem się z tym samym błędem. Po zmaganiach stwierdziłem, że jest to spowodowane „spacją” w nazwie folderu.

Na przykład :

Wcześniej nazwa mojego folderu brzmiała: „Projekty Qt”

Później zmieniłem to na: „QtProjects”

i mój problem został rozwiązany.

Jest to bardzo proste, ale czasami poważny problem.

skg
źródło
0

Miałem ten problem (dwukropki w nazwie docelowej), ponieważ miałem -nw swojej GREP_OPTIONSzmiennej środowiskowej. Najwyraźniej spowodowało configureto Makefileniepoprawne wygenerowanie pliku.

Trebor Rude
źródło
0

Moje IDE pozostawiło kombinację spacji i tabulatorów w moim Makefile.

Ustawienie mojego Makefile tak, aby używał tylko zakładek, naprawiło ten błąd.

Paul Wenzel
źródło
0

Otrzymałem również ten błąd (w STM32CubeIDE opartym na Eclipse w systemie Windows).

Po dwukrotnym kliknięciu błędu „wiele wzorców docelowych” pokazywała ścieżkę do .ldpliku. Okazuje się, że jest to kolejny problem z „nielegalnymi postaciami”. Obrażającą postacią był (czekaj na to): =

Heurystyka tygodnia: używaj tylko [a..z] na swoich ścieżkach, ponieważ na pewno będą inne niedozwolone znaki </vomit>.

Podręcznik GNU make nie dokumentuje tego wprost.

user103185
źródło