2023-11-06 23:23:22 +01:00
AppName = $( notdir $( CURDIR) )
2023-11-08 23:46:18 +01:00
AppAssets = ../CHARS.png
2023-10-31 18:06:39 +01:00
AppSources = $( wildcard *.c)
AppHeaders = $( wildcard *.h)
SpaccSources = $( wildcard ../../LibMultiSpacc/*.c)
SpaccHeaders = $( wildcard ../../LibMultiSpacc/*.h)
2023-11-01 13:58:22 +01:00
CFlags = -Os -Werror -Wpedantic -Wdeclaration-after-statement
2023-07-20 00:51:16 +02:00
2023-11-04 16:49:35 +01:00
# TODO: handle other unixes
i f e q ( $( shell uname --operating -system ) , M s y s )
Host = Windows
e l s e
Host = Linux
e n d i f
# When no user-specified target, build for the host system
2023-07-20 00:51:16 +02:00
i f n d e f T a r g e t
2023-11-04 16:49:35 +01:00
ifeq ( $( Host) , Windows)
2023-10-07 16:51:29 +02:00
Target = WindowsPC
2023-11-04 16:49:35 +01:00
else ifeq ( $( Host) , Linux)
2023-10-07 16:51:29 +02:00
Target = LinuxPC
endif
2023-07-20 00:51:16 +02:00
e n d i f
2023-11-04 16:49:35 +01:00
i f e q ( $( Target ) , L i n u x P C )
ExeSuffix = .run
Defines += -DTarget_LinuxPC
MultiSpacc_Target = SDL20
e l s e i f e q ( $( Target ) , W i n d o w s P C )
ExeSuffix = .exe
Defines += -DTarget_WindowsPC
MultiSpacc_Target = SDL20
ifneq ( $( Host) , Windows)
ToolsSuffix = -mingw-w64
endif
e l s e i f e q ( $( Target ) , W i n d o w s 9 x )
ExeSuffix = .exe
Defines += -DTarget_Windows9x
MultiSpacc_Target = SDL12
LdFlags += -lmingw32 -static-libgcc
ifeq ( $( Host) , Windows)
ToolsSyspath = /c/Files/Sdk/mingw32/bin
2023-11-03 15:57:40 +01:00
export PATH = $$ PATH:$( ToolsSyspath)
2023-11-04 16:49:35 +01:00
else
ToolsSyspath = /opt/Sdk/mingw32/bin
ToolsWrapper = wine
2023-11-06 23:23:22 +01:00
LdFlags += -LZ:/opt/Sdk/mingw32/lib
2023-07-20 00:51:16 +02:00
endif
2023-11-04 16:49:35 +01:00
ToolsPrefix = $( ToolsSyspath) /
e l s e i f e q ( $( Target ) , W e b )
Defines += -DTarget_Web
MultiSpacc_Target = Web
e l s e i f e q ( $( Target ) , N D S )
Defines += -DTarget_NDS
MultiSpacc_Target = NDS
e l s e i f e q ( $( Target ) , N E S )
Defines += -DTarget_NES
MultiSpacc_Target = NES
2023-07-20 00:51:16 +02:00
e n d i f
i f e q ( $( MultiSpacc_Target ) , S D L 1 2 )
2023-11-04 16:49:35 +01:00
Defines += -DMultiSpacc_Target_SDL12 -DMultiSpacc_Target_SDLCom -DMultiSpacc_Target_SDLStandard
2023-10-07 16:51:29 +02:00
CFlags += $( shell sdl-config --cflags)
2023-11-03 15:57:40 +01:00
LdFlags += $( shell sdl-config --libs) -lSDLmain -lSDL -lSDL_image -lSDL_mixer -lSDL_ttf
2023-11-01 13:58:22 +01:00
BuildProcess = __Normal__
2023-07-20 00:51:16 +02:00
e l s e i f e q ( $( MultiSpacc_Target ) , S D L 2 0 )
2023-11-04 16:49:35 +01:00
Defines += -DMultiSpacc_Target_SDL20 -DMultiSpacc_Target_SDLCom -DMultiSpacc_Target_SDLStandard
2023-10-07 16:51:29 +02:00
CFlags += $( shell sdl2-config --cflags)
2023-11-03 15:57:40 +01:00
LdFlags += $( shell sdl2-config --libs) -lSDL2main -lSDL2 -lSDL2_image -lSDL2_mixer -lSDL2_ttf
2023-11-01 13:58:22 +01:00
BuildProcess = __Normal__
2023-11-04 16:49:35 +01:00
e l s e i f e q ( $( MultiSpacc_Target ) , W e b )
Defines += -DMultiSpacc_Target_Web -DMultiSpacc_Target_SDL20 -DMultiSpacc_Target_SDLCom
2023-11-06 23:23:22 +01:00
LdFlags += -sWASM= 1 -sUSE_SDL= 2 -sUSE_SDL_IMAGE= 2 -sSDL2_IMAGE_FORMATS= '["png"]' -sUSE_SDL_TTF= 2 -sUSE_SDL_MIXER= 2
2023-11-04 16:49:35 +01:00
BuildProcess = __Web__
2023-10-07 16:51:29 +02:00
e l s e i f e q ( $( MultiSpacc_Target ) , N D S )
Defines += -DMultiSpacc_Target_NDS
2023-11-01 13:58:22 +01:00
BuildProcess = __NDS__
2023-10-31 18:06:39 +01:00
e l s e i f e q ( $( MultiSpacc_Target ) , N E S )
Defines += -DMultiSpacc_Target_NES
2023-11-01 13:58:22 +01:00
BuildProcess = __NES__
2023-07-20 00:51:16 +02:00
e n d i f
2023-11-01 23:22:11 +01:00
BuildSources = $( AppSources) $( SpaccSources)
BuildObjects = $( BuildSources:.c= .o)
2023-07-20 00:51:16 +02:00
2023-11-04 16:49:35 +01:00
i f e q ( $( BuildProcess ) , _ _ N o r m a l _ _ )
CC = $( ToolsWrapper) $( ToolsPrefix) gcc$( ToolsSuffix) $( CFlags) $( Defines)
e n d i f
2023-10-08 02:09:09 +02:00
All all : $( BuildProcess )
2023-07-20 00:51:16 +02:00
2023-11-03 15:57:40 +01:00
# TODO: use virtual build dirs even for normals to allow linking against different libraries without recleaning
2023-11-01 13:58:22 +01:00
__Normal__ : $( BuildObjects )
2023-10-07 16:51:29 +02:00
$( CC) $^ $( LdFlags) -o $( AppName) $( ExeSuffix)
2023-07-20 00:51:16 +02:00
2023-11-04 16:49:35 +01:00
__Web__ :
2023-11-06 23:23:22 +01:00
mkdir -p ./Build/Web
emcc $( BuildSources) $( CFlags) $( Defines) $( LdFlags) --preload-file $( AppAssets) -o ./Build/Web/Emscripten.js
cp ../Emscripten.html ./Build/Web/$( AppName) .html
2023-11-04 16:49:35 +01:00
# TODO: bundle JS, WASM, and assets package in HTML file
2023-11-01 13:58:22 +01:00
# TODO: Fix include substitutions properly in non-standard build processes
__NDS__ :
2023-10-08 02:09:09 +02:00
$( eval VirtualBuildDir = ./Build/NDS)
mkdir -p $( VirtualBuildDir) /source/.tmp
cp ../NDS.mk $( VirtualBuildDir) /Makefile
2023-10-31 18:06:39 +01:00
cp $( SpaccSources) $( SpaccHeaders) $( VirtualBuildDir) /source/.tmp/
cd $( VirtualBuildDir) /source/.tmp; for i in *; do mv ./$$ i ../LibMultiSpacc_$$ i; done
cp $( AppSources) $( AppHeaders) $( VirtualBuildDir) /source/
2023-11-01 23:22:11 +01:00
for i in $( VirtualBuildDir) /source/*.c $( VirtualBuildDir) /source/*.h; do sed -i 's|#include[ \t]"../../LibMultiSpacc/|#include "LibMultiSpacc_|g' $$ i; done
for i in $( VirtualBuildDir) /source/*.c $( VirtualBuildDir) /source/*.h; do sed -i 's|#include[ \t]"../MultiSpacc|#include "LibMultiSpacc_MultiSpacc|g' $$ i; done
for i in $( VirtualBuildDir) /source/*.c $( VirtualBuildDir) /source/*.h; do sed -i 's|#include[ \t]"./|#include "LibMultiSpacc_|g' $$ i; done
2023-10-08 02:09:09 +02:00
cd $( VirtualBuildDir) ; make
2023-11-01 13:58:22 +01:00
__NES__ :
cd ../../neslib; make
$( eval VirtualBuildDir = ./Build/NES)
mkdir -p $( VirtualBuildDir) /.tmp
cp $( SpaccSources) $( SpaccHeaders) $( VirtualBuildDir) /.tmp/
cd $( VirtualBuildDir) /.tmp; for i in *; do mv ./$$ i ../LibMultiSpacc_$$ i; done
cp $( AppSources) $( AppHeaders) $( VirtualBuildDir) /
2023-11-01 23:22:11 +01:00
for i in $( VirtualBuildDir) /*.c $( VirtualBuildDir) /*.h; do sed -i 's|#include[ \t]"../../LibMultiSpacc/|#include "LibMultiSpacc_|g' $$ i; done
for i in $( VirtualBuildDir) /*.c $( VirtualBuildDir) /*.h; do sed -i 's|#include[ \t]"../MultiSpacc|#include "LibMultiSpacc_MultiSpacc|g' $$ i; done
for i in $( VirtualBuildDir) /*.c $( VirtualBuildDir) /*.h; do sed -i 's|#include[ \t]"./|#include "LibMultiSpacc_|g' $$ i; done
cp ../../neslib/*.cfg ../../neslib/crt0.o ../../neslib/*.lib ../../neslib/*.h $( VirtualBuildDir) /
printf ".segment \"CHARS\"\n\t.incbin \"CHARS.chr\"" > $( VirtualBuildDir) /CHARS.s
2023-11-08 23:46:18 +01:00
echo " ProjectRoot=../..; AppName=' $( AppName) '; AppAssets=' $( AppAssets) '; Defines=' $( Defines) '; " > $( VirtualBuildDir) /Make.sh
2023-11-01 13:58:22 +01:00
cat ../NES.mk.sh >> $( VirtualBuildDir) /Make.sh
2023-11-01 23:22:11 +01:00
cd $( VirtualBuildDir) ; sh ./Make.sh
2023-10-31 18:06:39 +01:00
2023-10-07 16:51:29 +02:00
Run run : All
2023-07-20 00:51:16 +02:00
./$( AppName) $( ExeSuffix)
2023-10-08 02:09:09 +02:00
Clean clean Clear clear :
2023-07-20 00:51:16 +02:00
find -L . -name "*.o" -type f -delete
2023-10-07 16:51:29 +02:00
find -L ../../LibMultiSpacc -name "*.o" -type f -delete
2023-11-01 13:58:22 +01:00
rm -f ./$( AppName) $( ExeSuffix)
2023-10-08 02:09:09 +02:00
rm -rf ./Build