Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

No rule to make target '%.o'

For unknown reason, GNU Make doesn't do the job for me. I have this MAKE file, I did ensure for every recipe, I use tab, not space. however I look at it, I just couldn't spot anywhere that would cause the error message.

OS: Ubuntu 17.10 / GNU Make: 4.1 / GCC: Cross compile to i686-elf-gcc.

Running it with: make (in the same directory) give me

make: *** No rule to make target '%.o', needed by 'kernel.elf'.  Stop.

I have a bash script that does exactly the same thing and it works like charm. Can any one tell what am I doing wrong?

Makefile:

NASM=nasm
QEMU=qemu-system-i386
GCC=~/opt/cross/bin/i686-elf-gcc
CFLAGS=-std=c11 -ffreestanding -Wall -Wextra -Werror -masm=intel -g -O0
ASFLAGS=-felf32 -g

.PHONY: all clean
all:boot.iso

%.o : %.c
    $(GCC) -c $< $(CFLAGS) -o $@

%.so : %.asm
    $(NASM) $(ASFLAGS) -o $@ $<

kernel.elf : %.o
    $(GCC) -T link.ld -o $@ -ffreestanding -O0 -nostdlib -lgcc --verbose $^
    grub-file --is-x86-multiboot2 kernel.elf

boot.iso : kernel.elf grub.cfg
    mkdir -p ./iso/boot/grub
    cp kernel.elf ./iso/boot
    cp grub.cfg ./iso/boot/grub
    grub-mkrescue -o $@ ./iso

run: boot.iso
    $(QEMU) -cdrom $< -D log/qemu.log -d guest_errors -m 2048M -daemonize -serial file:log/boot.log

debug: boot.iso
    $(QEMU) -cdrom $< -D log/qemu.log -d guest_errors -m 2048M -daemonize -serial file:log/boot.log -s -S
    gdb ./kernel.elf -ex "target remote :1234" --tui

clean:
    rm -f ./*.o
    rm -f ./kernel.elf
    rm -rf ./iso

Running make with -d option output this:

GNU Make 4.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Reading makefiles...
Reading makefile 'Makefile'...
Updating makefiles....
 Considering target file 'Makefile'.
  Looking for an implicit rule for 'Makefile'.

  ... a bunch of ...
  Trying pattern rule with stem 'Makefile'.
  Trying implicit prerequisite 'Makefile.o'. <-- last line
  ... end a bunch of ...

  Looking for a rule with intermediate file 'Makefile.o'.
   Avoiding implicit rule recursion.

   ... a bunch of ...
   Trying pattern rule with stem 'Makefile'.
   Trying implicit prerequisite 'Makefile.c'. <--- last line
   ... end a bunch of ...

   Looking for a rule with intermediate file 'Makefile.c'.
    Avoiding implicit rule recursion.
    Avoiding implicit rule recursion.

    ... a bunch of ...
    Trying pattern rule with stem 'Makefile'.
    Trying implicit prerequisite 'Makefile.y'.
    ... end a bunch of ...

    Looking for a rule with intermediate file 'Makefile.y'.
     Avoiding implicit rule recursion.
     Avoiding implicit rule recursion.
     Avoiding implicit rule recursion.

     ... a bunch of ...
     Trying pattern rule with stem 'Makefile.y'.
     Trying implicit prerequisite 'SCCS/s.Makefile.y'. <-- last line
     ... end a bunch of ...
     ... I'm too tired to clean it up ....
     ... is all the same thing for Makefile

Updating goal targets....
Considering target file 'all'.
 File 'all' does not exist.
  Considering target file 'boot.iso'.
   File 'boot.iso' does not exist.
    Considering target file 'kernel.elf'.
     File 'kernel.elf' does not exist.
      Considering target file '%.o'.
       File '%.o' does not exist.
       Looking for an implicit rule for '%.o'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.c'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.cc'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.C'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.cpp'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.p'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.f'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.F'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.m'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.r'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.s'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.S'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.mod'.
       Trying pattern rule with stem '%.o'.
       Trying implicit prerequisite '%.o,v'.
       Trying pattern rule with stem '%.o'.
       Trying implicit prerequisite 'RCS/%.o,v'.
       Trying pattern rule with stem '%.o'.
       Trying implicit prerequisite 'RCS/%.o'.
       Trying pattern rule with stem '%.o'.
       Trying implicit prerequisite 's.%.o'.
       Trying pattern rule with stem '%.o'.
       Trying implicit prerequisite 'SCCS/s.%.o'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.c'.
       Looking for a rule with intermediate file '%.c'.
        Avoiding implicit rule recursion.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.y'.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.l'.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.w'.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.w'.
        Trying pattern rule with stem '%.c'.
        Trying implicit prerequisite '%.c,v'.
        Trying pattern rule with stem '%.c'.
        Trying implicit prerequisite 'RCS/%.c,v'.
        Trying pattern rule with stem '%.c'.
        Trying implicit prerequisite 'RCS/%.c'.
        Trying pattern rule with stem '%.c'.
        Trying implicit prerequisite 's.%.c'.
        Trying pattern rule with stem '%.c'.
        Trying implicit prerequisite 'SCCS/s.%.c'.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.y'.
        Looking for a rule with intermediate file '%.y'.
         Avoiding implicit rule recursion.
         Avoiding implicit rule recursion.
         Trying pattern rule with stem '%.y'.
         Trying implicit prerequisite '%.y,v'.
         Trying pattern rule with stem '%.y'.
         Trying implicit prerequisite 'RCS/%.y,v'.
         Trying pattern rule with stem '%.y'.
         Trying implicit prerequisite 'RCS/%.y'.
         Trying pattern rule with stem '%.y'.
         Trying implicit prerequisite 's.%.y'.
         Trying pattern rule with stem '%.y'.
         Trying implicit prerequisite 'SCCS/s.%.y'.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.l'.
        Looking for a rule with intermediate file '%.l'.
         Avoiding implicit rule recursion.
         Avoiding implicit rule recursion.
         Trying pattern rule with stem '%.l'.
         Trying implicit prerequisite '%.l,v'.
         Trying pattern rule with stem '%.l'.
         Trying implicit prerequisite 'RCS/%.l,v'.
         Trying pattern rule with stem '%.l'.
         Trying implicit prerequisite 'RCS/%.l'.
         Trying pattern rule with stem '%.l'.
         Trying implicit prerequisite 's.%.l'.
         Trying pattern rule with stem '%.l'.
         Trying implicit prerequisite 'SCCS/s.%.l'.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.w'.
        Looking for a rule with intermediate file '%.w'.
         Avoiding implicit rule recursion.
         Avoiding implicit rule recursion.
         Trying pattern rule with stem '%.w'.
         Trying implicit prerequisite '%.w,v'.
         Trying pattern rule with stem '%.w'.
         Trying implicit prerequisite 'RCS/%.w,v'.
         Trying pattern rule with stem '%.w'.
         Trying implicit prerequisite 'RCS/%.w'.
         Trying pattern rule with stem '%.w'.
         Trying implicit prerequisite 's.%.w'.
         Trying pattern rule with stem '%.w'.
         Trying implicit prerequisite 'SCCS/s.%.w'.
        Trying pattern rule with stem '%'.
        Rejecting impossible rule prerequisite '%.w'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.cc'.
       Looking for a rule with intermediate file '%.cc'.
        Avoiding implicit rule recursion.
        Trying pattern rule with stem '%.cc'.
        Trying implicit prerequisite '%.cc,v'.
        Trying pattern rule with stem '%.cc'.
        Trying implicit prerequisite 'RCS/%.cc,v'.
        Trying pattern rule with stem '%.cc'.
        Trying implicit prerequisite 'RCS/%.cc'.
        Trying pattern rule with stem '%.cc'.
        Trying implicit prerequisite 's.%.cc'.
        Trying pattern rule with stem '%.cc'.
        Trying implicit prerequisite 'SCCS/s.%.cc'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.C'.
       Looking for a rule with intermediate file '%.C'.
        Avoiding implicit rule recursion.
        Trying pattern rule with stem '%.C'.
        Trying implicit prerequisite '%.C,v'.
        Trying pattern rule with stem '%.C'.
        Trying implicit prerequisite 'RCS/%.C,v'.
        Trying pattern rule with stem '%.C'.
        Trying implicit prerequisite 'RCS/%.C'.
        Trying pattern rule with stem '%.C'.
        Trying implicit prerequisite 's.%.C'.
        Trying pattern rule with stem '%.C'.
        Trying implicit prerequisite 'SCCS/s.%.C'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.cpp'.
       Looking for a rule with intermediate file '%.cpp'.
        Avoiding implicit rule recursion.
        Trying pattern rule with stem '%.cpp'.
        Trying implicit prerequisite '%.cpp,v'.
        Trying pattern rule with stem '%.cpp'.
        Trying implicit prerequisite 'RCS/%.cpp,v'.
        Trying pattern rule with stem '%.cpp'.
        Trying implicit prerequisite 'RCS/%.cpp'.
        Trying pattern rule with stem '%.cpp'.
        Trying implicit prerequisite 's.%.cpp'.
        Trying pattern rule with stem '%.cpp'.
        Trying implicit prerequisite 'SCCS/s.%.cpp'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.p'.
       Looking for a rule with intermediate file '%.p'.
        Avoiding implicit rule recursion.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.web'.
        Trying pattern rule with stem '%.p'.
        Trying implicit prerequisite '%.p,v'.
        Trying pattern rule with stem '%.p'.
        Trying implicit prerequisite 'RCS/%.p,v'.
        Trying pattern rule with stem '%.p'.
        Trying implicit prerequisite 'RCS/%.p'.
        Trying pattern rule with stem '%.p'.
        Trying implicit prerequisite 's.%.p'.
        Trying pattern rule with stem '%.p'.
        Trying implicit prerequisite 'SCCS/s.%.p'.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.web'.
        Looking for a rule with intermediate file '%.web'.
         Avoiding implicit rule recursion.
         Avoiding implicit rule recursion.
         Trying pattern rule with stem '%.web'.
         Trying implicit prerequisite '%.web,v'.
         Trying pattern rule with stem '%.web'.
         Trying implicit prerequisite 'RCS/%.web,v'.
         Trying pattern rule with stem '%.web'.
         Trying implicit prerequisite 'RCS/%.web'.
         Trying pattern rule with stem '%.web'.
         Trying implicit prerequisite 's.%.web'.
         Trying pattern rule with stem '%.web'.
         Trying implicit prerequisite 'SCCS/s.%.web'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.f'.
       Looking for a rule with intermediate file '%.f'.
        Avoiding implicit rule recursion.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.F'.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.r'.
        Trying pattern rule with stem '%.f'.
        Trying implicit prerequisite '%.f,v'.
        Trying pattern rule with stem '%.f'.
        Trying implicit prerequisite 'RCS/%.f,v'.
        Trying pattern rule with stem '%.f'.
        Trying implicit prerequisite 'RCS/%.f'.
        Trying pattern rule with stem '%.f'.
        Trying implicit prerequisite 's.%.f'.
        Trying pattern rule with stem '%.f'.
        Trying implicit prerequisite 'SCCS/s.%.f'.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.F'.
        Looking for a rule with intermediate file '%.F'.
         Avoiding implicit rule recursion.
         Avoiding implicit rule recursion.
         Trying pattern rule with stem '%.F'.
         Trying implicit prerequisite '%.F,v'.
         Trying pattern rule with stem '%.F'.
         Trying implicit prerequisite 'RCS/%.F,v'.
         Trying pattern rule with stem '%.F'.
         Trying implicit prerequisite 'RCS/%.F'.
         Trying pattern rule with stem '%.F'.
         Trying implicit prerequisite 's.%.F'.
         Trying pattern rule with stem '%.F'.
         Trying implicit prerequisite 'SCCS/s.%.F'.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.r'.
        Looking for a rule with intermediate file '%.r'.
         Avoiding implicit rule recursion.
         Avoiding implicit rule recursion.
         Trying pattern rule with stem '%'.
         Rejecting impossible rule prerequisite '%.l'.
         Trying pattern rule with stem '%.r'.
         Trying implicit prerequisite '%.r,v'.
         Trying pattern rule with stem '%.r'.
         Trying implicit prerequisite 'RCS/%.r,v'.
         Trying pattern rule with stem '%.r'.
         Trying implicit prerequisite 'RCS/%.r'.
         Trying pattern rule with stem '%.r'.
         Trying implicit prerequisite 's.%.r'.
         Trying pattern rule with stem '%.r'.
         Trying implicit prerequisite 'SCCS/s.%.r'.
       Trying pattern rule with stem '%'.
       Rejecting impossible rule prerequisite '%.F'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.m'.
       Looking for a rule with intermediate file '%.m'.
        Avoiding implicit rule recursion.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.ym'.
        Trying pattern rule with stem '%.m'.
        Trying implicit prerequisite '%.m,v'.
        Trying pattern rule with stem '%.m'.
        Trying implicit prerequisite 'RCS/%.m,v'.
        Trying pattern rule with stem '%.m'.
        Trying implicit prerequisite 'RCS/%.m'.
        Trying pattern rule with stem '%.m'.
        Trying implicit prerequisite 's.%.m'.
        Trying pattern rule with stem '%.m'.
        Trying implicit prerequisite 'SCCS/s.%.m'.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.ym'.
        Looking for a rule with intermediate file '%.ym'.
         Avoiding implicit rule recursion.
         Avoiding implicit rule recursion.
         Trying pattern rule with stem '%.ym'.
         Trying implicit prerequisite '%.ym,v'.
         Trying pattern rule with stem '%.ym'.
         Trying implicit prerequisite 'RCS/%.ym,v'.
         Trying pattern rule with stem '%.ym'.
         Trying implicit prerequisite 'RCS/%.ym'.
         Trying pattern rule with stem '%.ym'.
         Trying implicit prerequisite 's.%.ym'.
         Trying pattern rule with stem '%.ym'.
         Trying implicit prerequisite 'SCCS/s.%.ym'.
       Trying pattern rule with stem '%'.
       Rejecting impossible rule prerequisite '%.r'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.s'.
       Looking for a rule with intermediate file '%.s'.
        Avoiding implicit rule recursion.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.S'.
        Trying pattern rule with stem '%.s'.
        Trying implicit prerequisite '%.s,v'.
        Trying pattern rule with stem '%.s'.
        Trying implicit prerequisite 'RCS/%.s,v'.
        Trying pattern rule with stem '%.s'.
        Trying implicit prerequisite 'RCS/%.s'.
        Trying pattern rule with stem '%.s'.
        Trying implicit prerequisite 's.%.s'.
        Trying pattern rule with stem '%.s'.
        Trying implicit prerequisite 'SCCS/s.%.s'.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.S'.
        Looking for a rule with intermediate file '%.S'.
         Avoiding implicit rule recursion.
         Avoiding implicit rule recursion.
         Trying pattern rule with stem '%.S'.
         Trying implicit prerequisite '%.S,v'.
         Trying pattern rule with stem '%.S'.
         Trying implicit prerequisite 'RCS/%.S,v'.
         Trying pattern rule with stem '%.S'.
         Trying implicit prerequisite 'RCS/%.S'.
         Trying pattern rule with stem '%.S'.
         Trying implicit prerequisite 's.%.S'.
         Trying pattern rule with stem '%.S'.
         Trying implicit prerequisite 'SCCS/s.%.S'.
       Trying pattern rule with stem '%'.
       Rejecting impossible rule prerequisite '%.S'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.mod'.
       Looking for a rule with intermediate file '%.mod'.
        Avoiding implicit rule recursion.
        Trying pattern rule with stem '%.mod'.
        Trying implicit prerequisite '%.mod,v'.
        Trying pattern rule with stem '%.mod'.
        Trying implicit prerequisite 'RCS/%.mod,v'.
        Trying pattern rule with stem '%.mod'.
        Trying implicit prerequisite 'RCS/%.mod'.
        Trying pattern rule with stem '%.mod'.
        Trying implicit prerequisite 's.%.mod'.
        Trying pattern rule with stem '%.mod'.
        Trying implicit prerequisite 'SCCS/s.%.mod'.
       No implicit rule found for '%.o'.
       Finished prerequisites of target file '%.o'.
      Must remake target '%.o'.
make: *** No rule to make target '%.o', needed by 'kernel.elf'.  Stop.
like image 338
tongko Avatar asked Dec 23 '22 12:12

tongko


1 Answers

The problem is in the following rule:

kernel.elf : %.o

GNU Make is actually treating %.o as a prerequisite, and not a pattern.

I would suggest you to define an obj variable which includes the names of the object files and rewrite the rule as:

kernel.elf: $(obj)

A definition of such an obj variable could be:

obj := $(patsubst %.c,%.o,$(wildcard *.c))
obj += $(patsubst %.asm,%.so,$(wildcard *.asm))
like image 85
ネロク・ゴ Avatar answered Dec 30 '22 15:12

ネロク・ゴ