So, I'm trying to create my own make file to cross compile the code. I get C files from a wildcard folder, but when I have more than one C file in the csources folder, it will not create object files.
linux_compiler = gcc
win32_compiler = i686-w64-mingw32-gcc
win64_compiler = x86_64-w64-mingw32-gcc
program = main
cfolder = csources
headerfolder = hsources
objectfolder = osources
csources = $(wildcard $(cfolder)/*.c)
hsources = $(wildcard $(headerfolder)/*.h)
osources_linux = $(patsubst $(cfolder)/%.c,$(objectfolder)/%_linux.o,$(wildcard $(cfolder)/*.c))
osources_win32 = $(patsubst $(cfolder)/%.c,$(objectfolder)/%_win32.o,$(wildcard $(cfolder)/*.c))
osources_win64 = $(patsubst $(cfolder)/%.c,$(objectfolder)/%_win64.o,$(wildcard $(cfolder)/*.c))
all: clearscreen $(program)_win64 $(program)_win32 $(program)_linux
$(info $(program) created $(csources))
force: clean clearscreen $(program)_win64 $(program)_win32 $(program)_linux
$(info $(program) forcible created)
$(program)_linux: $(osources_linux) $(objectfolder)/$(program)_linux.o
$(linux_compiler) $(objectfolder)/$(program)_linux.o $(osources_linux) -o $(program)_linux
$(program)_win32: $(osources_win32) $(objectfolder)/$(program)_win32.o
$(win32_compiler) $(objectfolder)/$(program)_win32.o $(osources_win32) -o $(program)_win32
$(program)_win64: $(osources_win64) $(objectfolder)/$(program)_win64.o
$(win64_compiler) $(objectfolder)/$(program)_win64.o $(osources_win64) -o $(program)_win64
$(osources_linux): $(csources) $(hsources)
$(linux_compiler) -c $(csources) -o $(osources_linux)
$(osources_win32): $(csources) $(hsources)
$(win32_compiler) -c $(csources) -o $(osources_win32)
$(osources_win64): $(csources) $(hsources)
$(win64_compiler) -c $(csources) -o $(osources_win64)
$(objectfolder)/$(program)_linux.o: $(program).c
$(linux_compiler) -c $(program).c -o $(objectfolder)/$(program)_linux.o
$(objectfolder)/$(program)_win32.o: $(program).c
$(win32_compiler) -c $(program).c -o $(objectfolder)/$(program)_win32.o
$(objectfolder)/$(program)_win64.o: $(program).c
$(win64_compiler) -c $(program).c -o $(objectfolder)/$(program)_win64.o
clearscreen:
clear
clean:
rm $(objectfolder)/*.o
I don’t know much about makefiles, I thought this should work, but it doesn’t make any object files.
$(osources_win64): $(csources) $(hsources)
$(win64_compiler) -c $(csources) -o $(osources_win64)
And the error I received when I have more than one c file in the folder folder:
x86_64-w64-mingw32-gcc -c csources/log.c csources/SDL_add.c -o osources/log_win64.o osources/SDL_add_win64.o
x86_64-w64-mingw32-gcc: error: osources/SDL_add_win64.o: No such file or directory
makefile:132: recipe for target 'osources/SDL_add_win64.o' failed
make: *** [osources/SDL_add_win64.o] Error 1
Decision:
linux_compiler = gcc
win32_compiler = i686-w64-mingw32-gcc
win64_compiler = x86_64-w64-mingw32-gcc
linux_flags = -lSDL2
win32_flags = -lSDL2main -lSDL2
win64_flags = -lSDL2main -lSDL2
program = main
cfolder = csources/
headerfolder = hsources/
objectfolder = osources/
csources = $(wildcard $(cfolder)*.c)
hsources = $(wildcard $(headerfolder)*.h)
osources_linux = $(patsubst $(cfolder)%.c,$(objectfolder)%_linux.o,$(wildcard $(cfolder)*.c))
osources_win32 = $(patsubst $(cfolder)%.c,$(objectfolder)%_win32.o,$(wildcard $(cfolder)*.c))
osources_win64 = $(patsubst $(cfolder)%.c,$(objectfolder)%_win64.o,$(wildcard $(cfolder)*.c))
all: clearscreen $(objectfolder) $(program)_win64 $(program)_win32 $(program)_linux
$(info $(program) created)
force: clean clearscreen $(objectfolder) $(program)_win64 $(program)_win32 $(program)_linux
$(info $(program) forcible created)
$(program)_linux: $(osources_linux) $(objectfolder)$(program)_linux.o
$(linux_compiler) $(linux_flags) $(objectfolder)$(program)_linux.o $(osources_linux) -o $(program)_linux
$(program)_win32: $(osources_win32) $(objectfolder)$(program)_win32.o
$(win32_compiler) $(objectfolder)$(program)_win32.o $(osources_win32) -o $(program)_win32 $(win32_flags)
$(program)_win64: $(osources_win64) $(objectfolder)$(program)_win64.o
$(win64_compiler) $(objectfolder)$(program)_win64.o $(osources_win64) -o $(program)_win64 $(win64_flags)
$(objectfolder)%_linux.o: $(cfolder)%.c
$(linux_compiler) -c $? -D LINUX -o $@
$(objectfolder)%_win32.o: $(cfolder)%.c
$(win32_compiler) -c $? -D WIN32 -o $@
$(objectfolder)%_win64.o: $(cfolder)%.c
$(win64_compiler) -c $? -D WIN64 -o $@
$(objectfolder)$(program)_linux.o: $(program).c
$(linux_compiler) -c $(program).c -D LINUX -o $(objectfolder)$(program)_linux.o
$(objectfolder)$(program)_win32.o: $(program).c
$(win32_compiler) -c $(program).c -D WIN32 -o $(objectfolder)$(program)_win32.o
$(objectfolder)$(program)_win64.o: $(program).c
$(win64_compiler) -c $(program).c -D WIN64 -o $(objectfolder)$(program)_win64.o
$(objectfolder):
mkdir $(objectfolder)
clearscreen:
clear
clean:
rm $(objectfolder)*.o
source
share