Suppose I have a folder structure as such:
|
| - src
|- file.c
|- folderOne
|- file2.c
|- file3.S
|- folderTwo
|-folderThree
|- file4.c
I currently have a makefile that will grab all my assembly and C files like so:
S_SRC = $(wildcard *.S) $(wildcard **/*.S)
C_SRC = $(wildcard *.c) $(wildcard **/*.c)
S_OBJS = $(patsubst %.S,%.o,$(filter %.S,$(S_SRC)))
C_OBJS = $(patsubst %.c,%.o,$(filter %.c,$(C_SRC)))
OBJS = $(S_OBJS) $(C_OBJS)
Those lines simply get all the .c and .S files, and also creates their equivalent .o values. My pipeline is running GCC on the source files and then manually linking them.
I run GCC with the following syntax:
$(OBJS): $(C_SRC) $(S_SRC)
$(CC) $(CC_F) $(S_SRC) $(C_SRC) -o $(OBJS)
Where I pass in my source files to GCC. The CC_F variable is my flags variable:
CC_F = -m32 -Wall -Wextra -Werror -g -c
And I would like to run my linker like this afterwards:
$(PROGR): $(OBJS) $(LINK_SRC)
$(LD) $(LD_F) -o $(PROGR) $(OBJS)
Again, LD_F are simply my linker flags.
The problem I am currently getting is that with more than once source file, GCC cannot parse the command, outputting something like:
gcc -m32 -Wall -Wextra -Werror -g -c src/file1.S src/file2.c -o src/file1.o src/file2.o
gcc: error: src/file2.o: No such file or directory
What I would like to be able to do is have GCC output the object files of each source file in the same directory as the source file. In the given example, running the makefile should result in this layout:
|
| - src
|- file.c
|- file.o
|- folderOne
|- file2.c
|- file2.o
|- file3.S
|- file3.o
|- folderTwo
|-folderThree
|- file4.c
|- file4.o
How is this possible with my current setup and perhaps a varying number of directories/files.
src/file2.ois treated as a source object but didn't exist. Change your Makefile to compile one source and output one object at a time.