2 Commits

Author SHA1 Message Date
8564d55149 [examples] Release source images in image rotate example (#6145)
Co-authored-by: Hugohong258 <282228220+Hugohong258@users.noreply.github.com>
2026-09-12 20:30:59 +02:00
a414da391b Fix make shell detection (#6146)
* Detect the recipe shell in Makefiles

GNU Make on Windows may use sh even when invoked from cmd. Probe how
echo handles quotes instead of choosing shell syntax from the target OS.

Apply this to the library, examples and tools, preserving explicit
PLATFORM_SHELL overrides. Stop forcing cmd for library cleanup and fix
Win32 recipe indentation.

* Pass rlparser variables directly to recursive make

The form FORMAT=JSON EXTENSION=json $(MAKE) parse uses sh environment
assignments. Under cmd, FORMAT=JSON is treated as a command and fails.

Use $(MAKE) parse FORMAT=JSON EXTENSION=json instead. This passes the
variables directly to make and works under both shells.
2026-09-12 20:28:57 +02:00
5 changed files with 71 additions and 33 deletions

View File

@ -122,6 +122,14 @@ BUILD_WEB_RESOURCES_PATH ?= $(dir $<)resources@resources
# WARNING: Requires raylib compiled with GRAPHICS_API_OPENGL_ES3 # WARNING: Requires raylib compiled with GRAPHICS_API_OPENGL_ES3
BUILD_WEB_WEBGL2 ?= FALSE BUILD_WEB_WEBGL2 ?= FALSE
# Detect the shell used by make: cmd preserves quotes, while sh removes them.
ifndef PLATFORM_SHELL
PLATFORM_SHELL = sh
ifeq ($(shell echo "test"),"test")
PLATFORM_SHELL = cmd
endif
endif
# Determine PLATFORM_OS when required # Determine PLATFORM_OS when required
ifeq ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_DESKTOP_GLFW PLATFORM_DESKTOP_SDL PLATFORM_DESKTOP_RGFW PLATFORM_WEB PLATFORM_WEB_RGFW)) ifeq ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_DESKTOP_GLFW PLATFORM_DESKTOP_SDL PLATFORM_DESKTOP_RGFW PLATFORM_WEB PLATFORM_WEB_RGFW))
# No uname.exe on MinGW!, but OS=Windows_NT on Windows! # No uname.exe on MinGW!, but OS=Windows_NT on Windows!
@ -784,7 +792,11 @@ endif
clean: clean:
ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_GLFW) ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_GLFW)
ifeq ($(PLATFORM_OS),WINDOWS) ifeq ($(PLATFORM_OS),WINDOWS)
ifeq ($(PLATFORM_SHELL),cmd)
del *.o *.exe /s del *.o *.exe /s
else
find . -type f '(' -name '*.o' -o -name '*.exe' ')' -exec rm -f {} +
endif
endif endif
ifeq ($(PLATFORM_OS),BSD) ifeq ($(PLATFORM_OS),BSD)
find . -type f -perm -ugo+x -delete find . -type f -perm -ugo+x -delete
@ -801,7 +813,11 @@ ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_GLFW)
endif endif
ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_WIN32) ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_WIN32)
ifeq ($(PLATFORM_OS),WINDOWS) ifeq ($(PLATFORM_OS),WINDOWS)
ifeq ($(PLATFORM_SHELL),cmd)
del *.o *.exe /s del *.o *.exe /s
else
find . -type f '(' -name '*.o' -o -name '*.exe' ')' -exec rm -f {} +
endif
endif endif
ifeq ($(PLATFORM_OS),BSD) ifeq ($(PLATFORM_OS),BSD)
find . -type f -perm -ugo+x -delete find . -type f -perm -ugo+x -delete
@ -821,7 +837,7 @@ ifeq ($(TARGET_PLATFORM),PLATFORM_DRM)
rm -fv *.o rm -fv *.o
endif endif
ifeq ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_WEB PLATFORM_WEB_RGFW)) ifeq ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_WEB PLATFORM_WEB_RGFW))
ifeq ($(PLATFORM_OS),WINDOWS) ifeq ($(PLATFORM_SHELL),cmd)
del *.wasm *.html *.js *.data del *.wasm *.html *.js *.data
else else
rm -f */*.wasm */*.html */*.js */*.data rm -f */*.wasm */*.html */*.js */*.data

View File

@ -44,6 +44,10 @@ int main(void)
textures[1] = LoadTextureFromImage(image90); textures[1] = LoadTextureFromImage(image90);
textures[2] = LoadTextureFromImage(imageNeg90); textures[2] = LoadTextureFromImage(imageNeg90);
UnloadImage(image45);
UnloadImage(image90);
UnloadImage(imageNeg90);
int currentTexture = 0; int currentTexture = 0;
SetTargetFPS(60); // Set our game to run at 60 frames-per-second SetTargetFPS(60); // Set our game to run at 60 frames-per-second

View File

@ -141,15 +141,20 @@ ROOT = $(shell whoami)
HOST_PLATFORM_OS ?= WINDOWS HOST_PLATFORM_OS ?= WINDOWS
PLATFORM_OS ?= WINDOWS PLATFORM_OS ?= WINDOWS
# Detect the shell used by make: cmd preserves quotes, while sh removes them.
ifndef PLATFORM_SHELL
PLATFORM_SHELL = sh
ifeq ($(shell echo "test"),"test")
PLATFORM_SHELL = cmd
endif
endif
# Determine PLATFORM_OS when required # Determine PLATFORM_OS when required
ifeq ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_DESKTOP_GLFW PLATFORM_DESKTOP_SDL PLATFORM_DESKTOP_RGFW PLATFORM_DESKTOP_WIN32 PLATFORM_WEB PLATFORM_WEB_RGFW PLATFORM_ANDROID)) ifeq ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_DESKTOP_GLFW PLATFORM_DESKTOP_SDL PLATFORM_DESKTOP_RGFW PLATFORM_DESKTOP_WIN32 PLATFORM_WEB PLATFORM_WEB_RGFW PLATFORM_ANDROID))
# No uname.exe on MinGW!, but OS=Windows_NT on Windows! # No uname.exe on MinGW!, but OS=Windows_NT on Windows!
# ifeq ($(UNAME),Msys) -> Windows # ifeq ($(UNAME),Msys) -> Windows
ifeq ($(OS),Windows_NT) ifeq ($(OS),Windows_NT)
PLATFORM_OS = WINDOWS PLATFORM_OS = WINDOWS
ifndef PLATFORM_SHELL
PLATFORM_SHELL = cmd
endif
else else
UNAMEOS = $(shell uname) UNAMEOS = $(shell uname)
ifeq ($(UNAMEOS),Linux) ifeq ($(UNAMEOS),Linux)
@ -170,9 +175,6 @@ ifeq ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_DESKTOP_GLFW PLATF
ifeq ($(UNAMEOS),Darwin) ifeq ($(UNAMEOS),Darwin)
PLATFORM_OS = OSX PLATFORM_OS = OSX
endif endif
ifndef PLATFORM_SHELL
PLATFORM_SHELL = sh
endif
endif endif
endif endif
ifeq ($(TARGET_PLATFORM),PLATFORM_DRM) ifeq ($(TARGET_PLATFORM),PLATFORM_DRM)
@ -180,16 +182,6 @@ ifeq ($(TARGET_PLATFORM),PLATFORM_DRM)
ifeq ($(UNAMEOS),Linux) ifeq ($(UNAMEOS),Linux)
PLATFORM_OS = LINUX PLATFORM_OS = LINUX
endif endif
ifndef PLATFORM_SHELL
PLATFORM_SHELL = sh
endif
endif
ifeq ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_WEB PLATFORM_WEB_RGFW))
ifeq ($(PLATFORM_OS),LINUX)
ifndef PLATFORM_SHELL
PLATFORM_SHELL = sh
endif
endif
endif endif
ifeq ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_WEB PLATFORM_WEB_RGFW)) ifeq ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_WEB PLATFORM_WEB_RGFW))
@ -992,8 +984,6 @@ ifeq ($(TARGET_PLATFORM),PLATFORM_ANDROID)
rm -fv $(NATIVE_APP_GLUE)/android_native_app_glue.o rm -fv $(NATIVE_APP_GLUE)/android_native_app_glue.o
endif endif
# Set specific target variable
clean_shell_cmd: SHELL=cmd
clean_shell_cmd: clean_shell_cmd:
del *.o /s del *.o /s
cd $(RAYLIB_RELEASE_PATH) & \ cd $(RAYLIB_RELEASE_PATH) & \

View File

@ -57,6 +57,14 @@ BUILD_WEB_ASYNCIFY_STACK_SIZE ?= 1048576
BUILD_WEB_RESOURCES ?= FALSE BUILD_WEB_RESOURCES ?= FALSE
BUILD_WEB_RESOURCES_PATH ?= resources BUILD_WEB_RESOURCES_PATH ?= resources
# Detect the shell used by make: cmd preserves quotes, while sh removes them.
ifndef PLATFORM_SHELL
PLATFORM_SHELL = sh
ifeq ($(shell echo "test"),"test")
PLATFORM_SHELL = cmd
endif
endif
# Determine PLATFORM_OS in case PLATFORM_DESKTOP selected # Determine PLATFORM_OS in case PLATFORM_DESKTOP selected
ifeq ($(PLATFORM),PLATFORM_DESKTOP) ifeq ($(PLATFORM),PLATFORM_DESKTOP)
# No uname.exe on MinGW!, but OS=Windows_NT on Windows! # No uname.exe on MinGW!, but OS=Windows_NT on Windows!
@ -345,7 +353,11 @@ $(PROJECT_NAME): $(OBJS)
clean: clean:
ifeq ($(PLATFORM),PLATFORM_DESKTOP) ifeq ($(PLATFORM),PLATFORM_DESKTOP)
ifeq ($(PLATFORM_OS),WINDOWS) ifeq ($(PLATFORM_OS),WINDOWS)
rm *.o *.exe ifeq ($(PLATFORM_SHELL),cmd)
del /q *.o *.exe
else
rm -f *.o *.exe
endif
endif endif
ifeq ($(PLATFORM_OS),LINUX) ifeq ($(PLATFORM_OS),LINUX)
find . -type f -executable -delete find . -type f -executable -delete
@ -360,6 +372,10 @@ ifeq ($(PLATFORM),PLATFORM_DRM)
rm -fv *.o rm -fv *.o
endif endif
ifeq ($(PLATFORM),PLATFORM_WEB) ifeq ($(PLATFORM),PLATFORM_WEB)
ifeq ($(PLATFORM_SHELL),cmd)
del *.o *.html *.js del *.o *.html *.js
else
rm -f *.o *.html *.js
endif
endif endif
@echo Cleaning done @echo Cleaning done

View File

@ -2,6 +2,14 @@ EXTENSION?=txt
FORMAT?=DEFAULT FORMAT?=DEFAULT
.PHONY: all parse clean raylib_api .PHONY: all parse clean raylib_api
# Detect the shell used by make: cmd preserves quotes, while sh removes them.
ifndef PLATFORM_SHELL
PLATFORM_SHELL = sh
ifeq ($(shell echo "test"),"test")
PLATFORM_SHELL = cmd
endif
endif
# Determine PLATFORM_OS # Determine PLATFORM_OS
# No uname.exe on MinGW!, but OS=Windows_NT on Windows! # No uname.exe on MinGW!, but OS=Windows_NT on Windows!
# ifeq ($(UNAME),Msys) -> Windows # ifeq ($(UNAME),Msys) -> Windows
@ -109,12 +117,16 @@ parse: raylib_api.$(EXTENSION) raymath_api.$(EXTENSION) rlgl_api.$(EXTENSION) ra
# API files for individual headers can be created likeso, provided the relevant header exists: # API files for individual headers can be created likeso, provided the relevant header exists:
# FORMAT=JSON EXTENSION=json make raygui_api.json # FORMAT=JSON EXTENSION=json make raygui_api.json
all: rlparser all: rlparser
FORMAT=DEFAULT EXTENSION=txt $(MAKE) parse $(MAKE) parse FORMAT=DEFAULT EXTENSION=txt
FORMAT=JSON EXTENSION=json $(MAKE) parse $(MAKE) parse FORMAT=JSON EXTENSION=json
FORMAT=XML EXTENSION=xml $(MAKE) parse $(MAKE) parse FORMAT=XML EXTENSION=xml
FORMAT=LUA EXTENSION=lua $(MAKE) parse $(MAKE) parse FORMAT=LUA EXTENSION=lua
FORMAT=SEXPR EXTENSION=sexpr $(MAKE) parse $(MAKE) parse FORMAT=SEXPR EXTENSION=sexpr
# Clean rlparser and generated output files # Clean rlparser and generated output files
clean: clean:
rm -f rlparser *.json *.txt *.xml *.lua *.sexpr ifeq ($(PLATFORM_SHELL),cmd)
del /q rlparser.exe *.json *.txt *.xml *.lua *.sexpr
else
rm -f rlparser rlparser.exe *.json *.txt *.xml *.lua *.sexpr
endif