Tinchu
Tinchu

Reputation: 99

Makefile recursive method issue

Below is my code structure with Makefile and source codes

work
├── code
|     | 
|     └── main.h and test.h files here
│     └── main.c and test.c files here
|     └── subdir.mk
|
├── _build/
      └── Makefile here

Makefile looks like below

all : ../code/target_file

../code/target_file : ../code/main.o ../code/test.o
    @echo Building ...
    @echo Linking files ...
    gcc -Llib ../code/main.o ../code/test.o -lm -o ../code/target_file  

.PHONY:subdir
../code/main.o ../code/test.o:subdir;
subdir:
    @echo Building object files ...
    cd ../code && $(MAKE) -f subdir.mk 

clean:
    rm -rv ../code/*.o ../code/*.exe

subdir.mk code is

main.o : main.c main.h test.h
    @echo Building main.c ...
    gcc -Werror -Wall -c main.c -o main.o

test.o : test.c test.h
    @echo Building test.c ...
    gcc -Werror -Wall -c test.c -o test.o

I am trying to use recursive make as per the tutorials and suggestions in the forum.

The error I am getting is

Building object files ... 

cd ../code && make -f subdir.mk

make[1]: Entering directory '/f/My_Work/C/VSC/makefile_test/Recursive/test_mulltiple_2020_09_19/code'

Building main.c ...

gcc -Werror -Wall -c main.c -o main.o

make[1]: Leaving directory '/f/My_Work/C/VSC/makefile_test/Recursive/test_mulltiple_2020_09_19/code'

Building ...

Linking files ...

gcc -Llib ../code/main.o ../code/test.o -lm -o ../code/target_file
____________________________________________________________
gcc.exe: error: ../code/test.o: No such file or directory   |
                                                            |
make: *** [Makefile:7: ../code/target_file] Error 1         |
____________________________________________________________|

main.o is generated but test.o didn't.

Any suggestions for removing the error?

Upvotes: 0

Views: 48

Answers (1)

MadScientist
MadScientist

Reputation: 100856

Your subdir.mk file lists two targets. Make will always build either the target(s) you give on the command line, or else the first target in the makefile if you don't specify.

So you either have to create an initial target in your subdir.mk like this:

all: main.o test.o

so that it will build both, or else tell the recursive make invocation you want to build them both:

subdir:
        @echo Building object files ...
        cd ../code && $(MAKE) -f subdir.mk test.o main.o

Upvotes: 1

Related Questions