mirror of
https://github.com/n64decomp/sm64
synced 2026-04-24 16:13:50 +00:00
make-4.4 changed the behaviour of .SECONDEXPANSION to only expand rules that were explicitly used by the currently built target. Because leveldata used .SECONDEXPANSION to override an implicit pattern rule with another implicit pattern rule, the override wasn't considered for expansion and never used. By replacing the implicit pattern override with a static pattern override, i.e. by explicitly listing the dependencies, the rule takes precedence over the implicit pattern rule ($(BUILD_DIR)/*.elf) and gets expanded. This patch fixes the build for make-4.4, and was also tested with make-4.3.
273 lines
14 KiB
Makefile
273 lines
14 KiB
Makefile
# --------------------------------------
|
|
# General Rules
|
|
# --------------------------------------
|
|
|
|
# obtain a list of segments from the *.c files in bin directory
|
|
SEGMENTS := \
|
|
$(notdir $(basename $(wildcard bin/*.c))) \
|
|
$(addprefix $(VERSION)/,$(notdir $(basename $(wildcard bin/$(VERSION)/*.c)))) \
|
|
$(addsuffix _skybox,$(notdir $(basename $(wildcard textures/skyboxes/*.png))))
|
|
|
|
# Directories containing PNG files
|
|
TEXTURE_DIRS := \
|
|
$(wildcard textures/*/) \
|
|
$(filter %/,$(wildcard actors/*/))
|
|
|
|
# NOTE: textures assume naming convention "texture.<encoding>.png" generates "texture.<encoding>"
|
|
|
|
ACTOR_GROUPS := \
|
|
group0 \
|
|
group1 \
|
|
group2 \
|
|
group3 \
|
|
group4 \
|
|
group5 \
|
|
group6 \
|
|
group7 \
|
|
group8 \
|
|
group9 \
|
|
group10 \
|
|
group11 \
|
|
group12 \
|
|
group13 \
|
|
group14 \
|
|
group15 \
|
|
group16 \
|
|
group17 \
|
|
common0 \
|
|
common1
|
|
|
|
LEVEL_FILES := $(addsuffix leveldata,$(LEVEL_DIRS))
|
|
|
|
LEVEL_ELF_FILES := $(foreach level_dir,$(LEVEL_DIRS),$(BUILD_DIR)/levels/$(level_dir)leveldata.elf)
|
|
|
|
SEG_FILES := \
|
|
$(SEGMENTS:%=$(BUILD_DIR)/bin/%.elf) \
|
|
$(ACTOR_GROUPS:%=$(BUILD_DIR)/actors/%.elf) \
|
|
$(LEVEL_FILES:%=$(BUILD_DIR)/levels/%.elf)
|
|
|
|
MIO0_FILES := \
|
|
$(SEGMENTS:%=$(BUILD_DIR)/bin/%.mio0) \
|
|
$(ACTOR_GROUPS:%=$(BUILD_DIR)/actors/%.mio0) \
|
|
$(LEVEL_FILES:%=$(BUILD_DIR)/levels/%.mio0)
|
|
|
|
MIO0_OBJ_FILES := $(MIO0_FILES:.mio0=.mio0.o)
|
|
|
|
|
|
# --------------------------------------
|
|
# Actor Rules
|
|
# --------------------------------------
|
|
|
|
# Actor Directories
|
|
KOOPA_DIRS := koopa_flag poundable_pole koopa piranha_plant whomp chain_ball chain_chomp
|
|
CAPSWITCH_DIRS := capswitch springboard
|
|
CHILLYCHIEF_DIRS := chillychief moneybag
|
|
BULLY_DIRS := bully blargg
|
|
SPINDRIFT_DIRS := spindrift penguin snowman
|
|
KING_BOBOMB_DIRS := king_bobomb water_bubble
|
|
BOO_DIRS := bookend book chair small_key mad_piano boo haunted_cage
|
|
MR_I_DIRS := mr_i_eyeball mr_i_iris swoop snufit dorrie scuttlebug
|
|
HOOT_DIRS := yellow_sphere_small hoot yoshi_egg thwomp bullet_bill heave_ho
|
|
COINS_DIRS := mist explosion butterfly coin warp_pipe door bowser_key flame blue_fish pebble leaves warp_collision mario_cap power_meter mushroom_1up star sand dirt transparent_star white_particle wooden_signpost tree
|
|
BUBBA_DIRS := bubba wiggler wiggler_body_part lakitu_enemy spiny_egg spiny
|
|
SKEETER_DIRS := skeeter seaweed water_mine cyan_fish bub water_ring treasure_chest
|
|
KLEPTO_DIRS := klepto eyerok pokey tornado
|
|
SEA_DIRS := clam_shell manta sushi unagi whirlpool
|
|
AMP_DIRS := blue_coin_switch amp cannon_lid cannon_base cannon_barrel chuckya purple_switch checkerboard_platform heart flyguy breakable_box exclamation_box goomba bobomb metal_box exclamation_box_outline test_platform koopa_shell
|
|
MOLE_DIRS := monty_mole_hole monty_mole smoke ukiki fwoosh
|
|
LAKITU_DIRS := lakitu_cameraman toad mips boo_castle
|
|
PEACH_DIRS := bird peach yoshi
|
|
BOWSER_DIRS := bowser_flame impact_ring yellow_sphere bowser bomb impact_smoke
|
|
MARIO_DIRS := mario bubble walk_smoke burn_smoke stomp_smoke water_wave sparkle water_splash white_particle_small sparkle_animation
|
|
|
|
# Actor Textures
|
|
AMP_CHUCKYA_TEXTURES := $(foreach dir,$(AMP_DIRS), $(wildcard actors/$(dir)/*.png))
|
|
BOBOMBS_BUBBLE_TEXTURES := $(foreach dir,$(KING_BOBOMB_DIRS),$(wildcard actors/$(dir)/*.png))
|
|
BOO_BOOKEND_TEXTURES := $(foreach dir,$(BOO_DIRS), $(wildcard actors/$(dir)/*.png))
|
|
CAPSWITCH_SPRINGBOARD_TEXTURES := $(foreach dir,$(CAPSWITCH_DIRS), $(wildcard actors/$(dir)/*.png))
|
|
COINS_PIPE_TEXTURES := $(foreach dir,$(COINS_DIRS), $(wildcard actors/$(dir)/*.png))
|
|
BOWSER_FLAMES_TEXTURES := $(foreach dir,$(BOWSER_DIRS), $(wildcard actors/$(dir)/*.png))
|
|
BUBBA_WIGGLER_TEXTURES := $(foreach dir,$(BUBBA_DIRS), $(wildcard actors/$(dir)/*.png))
|
|
BULLY_BLARGG_TEXTURES := $(foreach dir,$(BULLY_DIRS), $(wildcard actors/$(dir)/*.png))
|
|
CHILLYCHIEF_TEXTURES := $(foreach dir,$(CHILLYCHIEF_DIRS),$(wildcard actors/$(dir)/*.png))
|
|
HOOT_THWOMP_TEXTURES := $(foreach dir,$(HOOT_DIRS), $(wildcard actors/$(dir)/*.png))
|
|
KOOPA_LOG_TEXTURES := $(foreach dir,$(KOOPA_DIRS), $(wildcard actors/$(dir)/*.png))
|
|
KLEPTO_EYEROK_TEXTURES := $(foreach dir,$(KLEPTO_DIRS), $(wildcard actors/$(dir)/*.png))
|
|
LAKITU_TOAD_TEXTURES := $(foreach dir,$(LAKITU_DIRS), $(wildcard actors/$(dir)/*.png))
|
|
MARIO_WATER_TEXTURES := $(foreach dir,$(MARIO_DIRS), $(wildcard actors/$(dir)/*.png))
|
|
MOLE_UKIKI_TEXTURES := $(foreach dir,$(MOLE_DIRS), $(wildcard actors/$(dir)/*.png))
|
|
MR_I_SWOOP_TEXTURES := $(foreach dir,$(MR_I_DIRS), $(wildcard actors/$(dir)/*.png))
|
|
PEACH_TOADSTOOL_TEXTURES := $(foreach dir,$(PEACH_DIRS), $(wildcard actors/$(dir)/*.png))
|
|
SEA_CREATURES_TEXTURES := $(foreach dir,$(SEA_DIRS), $(wildcard actors/$(dir)/*.png))
|
|
SKEETER_FISH_TEXTURES := $(foreach dir,$(SKEETER_DIRS), $(wildcard actors/$(dir)/*.png))
|
|
SPINDRIFT_PENGUIN_TEXTURES := $(foreach dir,$(SPINDRIFT_DIRS), $(wildcard actors/$(dir)/*.png))
|
|
|
|
# Actor dependencies
|
|
$(BUILD_DIR)/actors/group0.o: $(MARIO_WATER_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/actors/group1.o: $(HOOT_THWOMP_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/actors/group2.o: $(BULLY_BLARGG_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/actors/group3.o: $(BOBOMBS_BUBBLE_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/actors/group4.o: $(SEA_CREATURES_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/actors/group5.o: $(KLEPTO_EYEROK_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/actors/group6.o: $(MOLE_UKIKI_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/actors/group7.o: $(SPINDRIFT_PENGUIN_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/actors/group8.o: $(CAPSWITCH_SPRINGBOARD_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/actors/group9.o: $(BOO_BOOKEND_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/actors/group10.o: $(PEACH_TOADSTOOL_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/actors/group11.o: $(BUBBA_WIGGLER_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/actors/group12.o: $(BOWSER_FLAMES_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/actors/group13.o: $(SKEETER_FISH_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/actors/group14.o: $(KOOPA_LOG_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/actors/group15.o: $(LAKITU_TOAD_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/actors/group16.o: $(CHILLYCHIEF_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/actors/group17.o: $(MR_I_SWOOP_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/actors/common0.o: $(AMP_CHUCKYA_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/actors/common1.o: $(COINS_PIPE_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
|
|
# Actor Elf Files
|
|
$(BUILD_DIR)/actors/group0.elf: SEGMENT_ADDRESS := 0x04000000
|
|
$(BUILD_DIR)/actors/group1.elf: SEGMENT_ADDRESS := 0x05000000
|
|
$(BUILD_DIR)/actors/group2.elf: SEGMENT_ADDRESS := 0x05000000
|
|
$(BUILD_DIR)/actors/group3.elf: SEGMENT_ADDRESS := 0x05000000
|
|
$(BUILD_DIR)/actors/group4.elf: SEGMENT_ADDRESS := 0x05000000
|
|
$(BUILD_DIR)/actors/group5.elf: SEGMENT_ADDRESS := 0x05000000
|
|
$(BUILD_DIR)/actors/group6.elf: SEGMENT_ADDRESS := 0x05000000
|
|
$(BUILD_DIR)/actors/group7.elf: SEGMENT_ADDRESS := 0x05000000
|
|
$(BUILD_DIR)/actors/group8.elf: SEGMENT_ADDRESS := 0x05000000
|
|
$(BUILD_DIR)/actors/group9.elf: SEGMENT_ADDRESS := 0x05000000
|
|
$(BUILD_DIR)/actors/group10.elf: SEGMENT_ADDRESS := 0x05000000
|
|
$(BUILD_DIR)/actors/group11.elf: SEGMENT_ADDRESS := 0x05000000
|
|
$(BUILD_DIR)/actors/group12.elf: SEGMENT_ADDRESS := 0x06000000
|
|
$(BUILD_DIR)/actors/group13.elf: SEGMENT_ADDRESS := 0x06000000
|
|
$(BUILD_DIR)/actors/group14.elf: SEGMENT_ADDRESS := 0x06000000
|
|
$(BUILD_DIR)/actors/group15.elf: SEGMENT_ADDRESS := 0x06000000
|
|
$(BUILD_DIR)/actors/group16.elf: SEGMENT_ADDRESS := 0x06000000
|
|
$(BUILD_DIR)/actors/group17.elf: SEGMENT_ADDRESS := 0x06000000
|
|
$(BUILD_DIR)/actors/common0.elf: SEGMENT_ADDRESS := 0x08000000
|
|
$(BUILD_DIR)/actors/common1.elf: SEGMENT_ADDRESS := 0x03000000
|
|
|
|
# --------------------------------------
|
|
# Level Rules
|
|
# --------------------------------------
|
|
|
|
$(BUILD_DIR)/levels/%/leveldata.elf: SEGMENT_ADDRESS := 0x07000000
|
|
|
|
# TODO: Generate these rules from the level configs?
|
|
|
|
define level_rules =
|
|
$(1)_SEG7_FILES := $$(patsubst %.png,%.inc.c,$$(wildcard levels/$(1)/*.png))
|
|
$$(BUILD_DIR)/levels/$(1)/leveldata.o: $$(addprefix $$(BUILD_DIR)/,$$($(1)_SEG7_FILES))
|
|
$$(BUILD_DIR)/levels/$(1)/leveldata.elf: TEXTURE_BIN := $(2)
|
|
endef
|
|
|
|
ifneq ($(MAKECMDGOALS),clean)
|
|
ifneq ($(MAKECMDGOALS),distclean)
|
|
$(BUILD_DIR)/level_rules.mk: levels/level_rules.mk levels/level_defines.h
|
|
$(call print,Preprocessing level make rules:,$<,$@)
|
|
$(V)$(CPP) $(CPPFLAGS) $(VERSION_CFLAGS) -I . -o $@ $<
|
|
include $(BUILD_DIR)/level_rules.mk
|
|
endif
|
|
endif
|
|
|
|
# --------------------------------------
|
|
# Extra Level Rules
|
|
# --------------------------------------
|
|
$(eval $(call level_rules,intro,generic)) # Intro (Super Mario 64 Logo)
|
|
$(eval $(call level_rules,menu,generic)) # Menu (File Select)
|
|
|
|
# --------------------------------------
|
|
# Cake Texture Rules
|
|
# --------------------------------------
|
|
|
|
# Ending cake textures are generated in a special way
|
|
$(BUILD_DIR)/levels/ending/cake_eu.inc.c: levels/ending/cake_eu.png
|
|
$(call print,Splitting:,$<,$@)
|
|
$(V)$(SKYCONV) --type cake-eu --split $^ $(BUILD_DIR)/levels/ending
|
|
$(BUILD_DIR)/levels/ending/cake.inc.c: levels/ending/cake.png
|
|
$(call print,Splitting:,$<,$@)
|
|
$(V)$(SKYCONV) --type cake --split $^ $(BUILD_DIR)/levels/ending
|
|
|
|
# --------------------------------------
|
|
# Texture Bin Rules
|
|
# --------------------------------------
|
|
|
|
# Others
|
|
SEGMENT2_TEXTURES := $(wildcard $(TEXTURE_DIR)/segment2/*.png)
|
|
TITLE_SCREEN_BG_TEXTURES := $(wildcard $(TEXTURE_DIR)/title_screen_bg/*.png)
|
|
SPOOKY_TEXTURES := $(wildcard $(TEXTURE_DIR)/spooky/*.png)
|
|
GENERIC_TEXTURES := $(wildcard $(TEXTURE_DIR)/generic/*.png)
|
|
OUTSIDE_TEXTURES := $(wildcard $(TEXTURE_DIR)/outside/*.png)
|
|
SNOW_TEXTURES := $(wildcard $(TEXTURE_DIR)/snow/*.png)
|
|
EFFECT_TEXTURES := $(wildcard $(TEXTURE_DIR)/effect/*.png)
|
|
CAVE_TEXTURES := $(wildcard $(TEXTURE_DIR)/cave/*.png)
|
|
INSIDE_TEXTURES := $(wildcard $(TEXTURE_DIR)/inside/*.png)
|
|
WATER_TEXTURES := $(wildcard $(TEXTURE_DIR)/water/*.png)
|
|
FIRE_TEXTURES_TEXTURES := $(wildcard $(TEXTURE_DIR)/fire/*.png)
|
|
SKY_TEXTURES := $(wildcard $(TEXTURE_DIR)/sky/*.png)
|
|
MACHINE_TEXTURES := $(wildcard $(TEXTURE_DIR)/machine/*.png)
|
|
MOUNTAIN_TEXTURES := $(wildcard $(TEXTURE_DIR)/mountain/*.png)
|
|
GRASS_TEXTURES := $(wildcard $(TEXTURE_DIR)/grass/*.png)
|
|
|
|
# Texture Files
|
|
$(BUILD_DIR)/bin/segment2.o: $(SEGMENT2_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/bin/title_screen_bg.o: $(TITLE_SCREEN_BG_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/bin/spooky.o: $(SPOOKY_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/bin/generic.o: $(GENERIC_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/bin/outside.o: $(OUTSIDE_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/bin/snow.o: $(SNOW_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/bin/effect.o: $(EFFECT_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/bin/cave.o: $(CAVE_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/bin/inside.o: $(INSIDE_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/bin/water.o: $(WATER_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/bin/fire.o: $(FIRE_TEXTURES_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/bin/sky.o: $(SKY_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/bin/machine.o: $(MACHINE_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/bin/mountain.o: $(MOUNTAIN_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
$(BUILD_DIR)/bin/grass.o: $(GRASS_TEXTURES:%.png=$(BUILD_DIR)/%.inc.c)
|
|
|
|
# Others
|
|
$(BUILD_DIR)/bin/segment2.elf: SEGMENT_ADDRESS := 0x02000000
|
|
$(BUILD_DIR)/bin/title_screen_bg.elf: SEGMENT_ADDRESS := 0x0A000000
|
|
$(BUILD_DIR)/bin/debug_level_select.elf: SEGMENT_ADDRESS := 0x07000000
|
|
$(BUILD_DIR)/bin/effect.elf: SEGMENT_ADDRESS := 0x0B000000
|
|
$(BUILD_DIR)/bin/spooky.elf: SEGMENT_ADDRESS := 0x09000000
|
|
$(BUILD_DIR)/bin/generic.elf: SEGMENT_ADDRESS := 0x09000000
|
|
$(BUILD_DIR)/bin/outside.elf: SEGMENT_ADDRESS := 0x09000000
|
|
$(BUILD_DIR)/bin/snow.elf: SEGMENT_ADDRESS := 0x09000000
|
|
$(BUILD_DIR)/bin/cave.elf: SEGMENT_ADDRESS := 0x09000000
|
|
$(BUILD_DIR)/bin/inside.elf: SEGMENT_ADDRESS := 0x09000000
|
|
$(BUILD_DIR)/bin/water.elf: SEGMENT_ADDRESS := 0x09000000
|
|
$(BUILD_DIR)/bin/fire.elf: SEGMENT_ADDRESS := 0x09000000
|
|
$(BUILD_DIR)/bin/sky.elf: SEGMENT_ADDRESS := 0x09000000
|
|
$(BUILD_DIR)/bin/machine.elf: SEGMENT_ADDRESS := 0x09000000
|
|
$(BUILD_DIR)/bin/mountain.elf: SEGMENT_ADDRESS := 0x09000000
|
|
$(BUILD_DIR)/bin/grass.elf: SEGMENT_ADDRESS := 0x09000000
|
|
# EU segment 19 translations
|
|
$(BUILD_DIR)/bin/eu/translation_de.elf: SEGMENT_ADDRESS := 0x19000000
|
|
$(BUILD_DIR)/bin/eu/translation_en.elf: SEGMENT_ADDRESS := 0x19000000
|
|
$(BUILD_DIR)/bin/eu/translation_fr.elf: SEGMENT_ADDRESS := 0x19000000
|
|
|
|
# --------------------------------------
|
|
# Skybox Rules
|
|
# --------------------------------------
|
|
|
|
$(BUILD_DIR)/bin/%_skybox.c: textures/skyboxes/%.png
|
|
$(call print,Splitting:,$<,$@)
|
|
$(V)$(SKYCONV) --type sky --split $^ $(BUILD_DIR)/bin
|
|
|
|
$(BUILD_DIR)/bin/%_skybox.elf: SEGMENT_ADDRESS := 0x0A000000
|
|
|
|
# --------------------------------------
|
|
# Misc Rules
|
|
# --------------------------------------
|
|
|
|
# intro and ipl3 textures are not compressed
|
|
INTRO_RAW_FILES := $(wildcard $(TEXTURE_DIR)/intro_raw/*.png)
|
|
$(BUILD_DIR)/src/goddard/renderer.o: $(addprefix $(BUILD_DIR)/,$(patsubst %.png,%.inc.c,$(INTRO_RAW_FILES)))
|
|
|
|
IPL3_TEXTURE_FILES := $(wildcard $(TEXTURE_DIR)/ipl3_raw/*.png)
|
|
IPL3_RAW_FILES := $(addprefix $(BUILD_DIR)/,$(patsubst %.png,%,$(IPL3_TEXTURE_FILES)))
|
|
|
|
CRASH_TEXTURE_FILES := $(wildcard $(TEXTURE_DIR)/crash_screen/*.png)
|
|
CRASH_TEXTURE_C_FILES := $(addprefix $(BUILD_DIR)/,$(patsubst %.png,%.inc.c,$(CRASH_TEXTURE_FILES)))
|