gb-starter-kit
gb-starter-kit copied to clipboard
Make never stops making
...
rgbasm -p 0xFE -isrc/ -isrc/include/ -Wall -Wextra -h -M dep/vectors.mk -MG -MP -MQ obj/vectors.o -MQ dep/vectors.mk -o obj/vectors.o src/vectors.asm
rgbasm -p 0xFE -isrc/ -isrc/include/ -Wall -Wextra -h -M dep/sgb.mk -MG -MP -MQ obj/sgb.o -MQ dep/sgb.mk -o obj/sgb.o src/sgb.asm
rgbasm -p 0xFE -isrc/ -isrc/include/ -Wall -Wextra -h -M dep/misc.mk -MG -MP -MQ obj/misc.o -MQ dep/misc.mk -o obj/misc.o src/misc.asm
rgbasm -p 0xFE -isrc/ -isrc/include/ -Wall -Wextra -h -M dep/header.mk -MG -MP -MQ obj/header.o -MQ dep/header.mk -o obj/header.o src/header.asm
rgbasm -p 0xFE -isrc/ -isrc/include/ -Wall -Wextra -h -M dep/crash_handler.mk -MG -MP -MQ obj/crash_handler.o -MQ dep/crash_handler.mk -o obj/crash_handler.o src/crash_handler.asm
rgbasm -p 0xFE -isrc/ -isrc/include/ -Wall -Wextra -h -M dep/vectors.mk -MG -MP -MQ obj/vectors.o -MQ dep/vectors.mk -o obj/vectors.o src/vectors.asm
rgbasm -p 0xFE -isrc/ -isrc/include/ -Wall -Wextra -h -M dep/sgb.mk -MG -MP -MQ obj/sgb.o -MQ dep/sgb.mk -o obj/sgb.o src/sgb.asm
rgbasm -p 0xFE -isrc/ -isrc/include/ -Wall -Wextra -h -M dep/misc.mk -MG -MP -MQ obj/misc.o -MQ dep/misc.mk -o obj/misc.o src/misc.asm
rgbasm -p 0xFE -isrc/ -isrc/include/ -Wall -Wextra -h -M dep/header.mk -MG -MP -MQ obj/header.o -MQ dep/header.mk -o obj/header.o src/header.asm
rgbasm -p 0xFE -isrc/ -isrc/include/ -Wall -Wextra -h -M dep/crash_handler.mk -MG -MP -MQ obj/crash_handler.o -MQ dep/crash_handler.mk -o obj/crash_handler.o src/crash_handler.asm
rgbasm -p 0xFE -isrc/ -isrc/include/ -Wall -Wextra -h -M dep/vectors.mk -MG -MP -MQ obj/vectors.o -MQ dep/vectors.mk -o obj/vectors.o src/vectors.asm
rgbasm -p 0xFE -isrc/ -isrc/include/ -Wall -Wextra -h -M dep/sgb.mk -MG -MP -MQ obj/sgb.o -MQ dep/sgb.mk -o obj/sgb.o src/sgb.asm
rgbasm -p 0xFE -isrc/ -isrc/include/ -Wall -Wextra -h -M dep/misc.mk -MG -MP -MQ obj/misc.o -MQ dep/misc.mk -o obj/misc.o src/misc.asm
rgbasm -p 0xFE -isrc/ -isrc/include/ -Wall -Wextra -h -M dep/header.mk -MG -MP -MQ obj/header.o -MQ dep/header.mk -o obj/header.o src/header.asm
rgbasm -p 0xFE -isrc/ -isrc/include/ -Wall -Wextra -h -M dep/crash_handler.mk -MG -MP -MQ obj/crash_handler.o -MQ dep/crash_handler.mk -o obj/crash_handler.o src/crash_handler.asm
rgbasm -p 0xFE -isrc/ -isrc/include/ -Wall -Wextra -h -M dep/vectors.mk -MG -MP -MQ obj/vectors.o -MQ dep/vectors.mk -o obj/vectors.o src/vectors.asm
rgbasm -p 0xFE -isrc/ -isrc/include/ -Wall -Wextra -h -M dep/sgb.mk -MG -MP -MQ obj/sgb.o -MQ dep/sgb.mk -o obj/sgb.o src/sgb.asm
rgbasm -p 0xFE -isrc/ -isrc/include/ -Wall -Wextra -h -M dep/misc.mk -MG -MP -MQ obj/misc.o -MQ dep/misc.mk -o obj/misc.o src/misc.asm
rgbasm -p 0xFE -isrc/ -isrc/include/ -Wall -Wextra -h -M dep/header.mk -MG -MP -MQ obj/header.o -MQ dep/header.mk -o obj/header.o src/header.asm
rgbasm -p 0xFE -isrc/ -isrc/include/ -Wall -Wextra -h -M dep/crash_handler.mk -MG -MP -MQ obj/crash_handler.o -MQ dep/crash_handler.mk -o obj/crash_handler.o src/crash_handler.asm
rgbasm -p 0xFE -isrc/ -isrc/include/ -Wall -Wextra -h -M dep/vectors.mk -MG -MP -MQ obj/vectors.o -MQ dep/vectors.mk -o obj/vectors.o src/vectors.asm
rgbasm -p 0xFE -isrc/ -isrc/include/ -Wall -Wextra -h -M dep/sgb.mk -MG -MP -MQ obj/sgb.o -MQ dep/sgb.mk -o obj/sgb.o src/sgb.asm
rgbasm -p 0xFE -isrc/ -isrc/include/ -Wall -Wextra -h -M dep/misc.mk -MG -MP -MQ obj/misc.o -MQ dep/misc.mk -o obj/misc.o src/misc.asm
rgbasm -p 0xFE -isrc/ -isrc/include/ -Wall -Wextra -h -M dep/header.mk -MG -MP -MQ obj/header.o -MQ dep/header.mk -o obj/header.o src/header.asm
^Cmake: *** Deleting file 'dep/header.mk'
I imagine it's suppost to stop at some point? ^^
This happens when some file needs to be made (INCLUDE
ed or INCBIN
ed file), but Make doesn't know how to.
Here's what happens:
- Make invokes RGBASM to generate dependency lists
- RGBASM tries to
INCLUDE
orINCBIN
file X, which doesn't exist, so it stops there (but outputs it as a dependency) - Make sees the dependency lists have been updated, and restarts from the beginning
- Make sees the missing file, but doesn't know how to make it
- GOTO 1
(Pinning this because it's a common problem, so others are likely to encounter it)
The problem hasn't gone away, actually, but Make 4.4 introduced a warning that may explain it.
I believe I have a fix, but I'd like someone affected by this problem to help test it. Any volunteers?
gb-starter-kit incorrectly specified its dependencies, which could cause build failures like the above on all OSes. This was fixed in 8d6deab8f9f33e8e5657954920382cbb962e05f7.
Unfortunately, investigation reveals a new, OS-dependent build issue with due to insufficient timestamp resolution.
This only occurs on Windows for all current[^fix] versions of Make, and on macOS with the default Make 3.81 (I have tested, and using Homebrew's Make 4.4.1 does not present the issue).
[^fix]: I will be asking the Make maintainers about enabling high-resolution timestamps on Windows, so maybe a future version of Make will fix this.
Workaround
Disable parallel building on Windows and Make prior to 4.0.
This should slow down the build enough to not trigger this issue.
That didn't work.
Technical details
This issue causes output like:
CreateProcess(C:\Program Files\Git\usr\bin\stat.exe,stat -c "%Y %y" assets/crash_font.1bpp.pb8.size,...)
Live child 0000000002382550 (assets/crash_font.1bpp.pb8.size) PID 37241680
1699191197 2023-11-05 13:33:17.332802800 +0000
Reaping winning child 0000000002382550 PID 37241680
stat -c '%Y %y' obj/crash_handler.mk
CreateProcess(C:\Program Files\Git\usr\bin\stat.exe,stat -c "%Y %y" obj/crash_handler.mk,...)
Live child 0000000002382550 (assets/crash_font.1bpp.pb8.size) PID 37241680
1699191197 2023-11-05 13:33:17.222649000 +0000
Prerequisite 'assets/crash_font.1bpp.pb8.size' is older than target 'obj/crash_handler.mk'.
Notice that the mtime is higher for the .size
file than the .mk
, but Make still considers the former to be older than the latter. This appears to be because Make only considers timestamps up to the second (FILE_TIMESTAMP_HI_RES
in its source code), at least on Windows, and ties are resolved as "prerequisite is older".
A tentative patch that disabled parallelism on Windows and Make 3.81 did not resolve the issue, it only made it slightly less common. There is a fix for macOS—use a more recent Make—but nothing for Windows.