diff --git a/GNUmakefile b/GNUmakefile
index f86fdfd8e..ba221a06b 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -16,6 +16,10 @@ o=o
 asm=nasm
 obj=obj
 
+define expandobjs
+$$(addprefix $1,$$(addsuffix .$$o,$$(basename $2)))
+endef
+
 COMPILERFLAGS += -I$(ENGINE_INC) -I$(MACT_INC) -I$(AUDIOLIB_INC) -I$(ENET_INC)
 
 
@@ -134,8 +138,8 @@ ifneq ($(USE_LIBVPX),0)
     ENGINE_OBJS+= animvpx.cpp
 endif
 
-ENGINE_OBJS_EXP:=$(addprefix $(ENGINE_OBJ)/,$(addsuffix .$o,$(basename $(ENGINE_OBJS))))
-ENGINE_EDITOR_OBJS_EXP:=$(addprefix $(ENGINE_OBJ)/,$(addsuffix .$o,$(basename $(ENGINE_EDITOR_OBJS))))
+ENGINE_OBJS_EXP:=$(call expandobjs,$(ENGINE_OBJ)/,$(ENGINE_OBJS))
+ENGINE_EDITOR_OBJS_EXP:=$(call expandobjs,$(ENGINE_OBJ)/,$(ENGINE_EDITOR_OBJS))
 
 
 # MACT
@@ -155,7 +159,7 @@ MACT_OBJS = \
     scriplib.cpp \
     animlib.cpp \
 
-MACT_OBJS_EXP:=$(addprefix $(MACT_OBJ)/,$(addsuffix .$o,$(basename $(MACT_OBJS))))
+MACT_OBJS_EXP:=$(call expandobjs,$(MACT_OBJ)/,$(MACT_OBJS))
 
 
 # AudioLib
@@ -198,7 +202,7 @@ ifeq ($(MIXERTYPE),SDL)
     AUDIOLIB_OBJS+= driver_sdl.cpp
 endif
 
-AUDIOLIB_OBJS_EXP:=$(addprefix $(AUDIOLIB_OBJ)/,$(addsuffix .$o,$(basename $(AUDIOLIB_OBJS))))
+AUDIOLIB_OBJS_EXP:=$(call expandobjs,$(AUDIOLIB_OBJ)/,$(AUDIOLIB_OBJS))
 
 
 # ENet
@@ -228,7 +232,7 @@ else
     ENET_CFLAGS += -DHAS_SOCKLEN_T
 endif
 
-ENET_OBJS_EXP:=$(addprefix $(ENET_OBJ)/,$(addsuffix .$o,$(basename $(ENET_OBJS))))
+ENET_OBJS_EXP:=$(call expandobjs,$(ENET_OBJ)/,$(ENET_OBJS))
 
 ifeq ($(NETCODE),0)
     ENET_TARGET=
@@ -287,7 +291,7 @@ ifeq ($(PLATFORM),DARWIN)
     TOOLS_OBJS += osxbits.mm
 endif
 
-TOOLS_OBJS_EXP:=$(addprefix $(TOOLS_OBJ)/,$(addsuffix .$o,$(basename $(TOOLS_OBJS)))) $(addprefix $(ENGINE_OBJ)/,$(addsuffix .$o,$(basename $(ENGINE_TOOLS_OBJS))))
+TOOLS_OBJS_EXP:=$(call expandobjs,$(TOOLS_OBJ)/,$(TOOLS_OBJS)) $(call expandobjs,$(ENGINE_OBJ)/,$(ENGINE_TOOLS_OBJS))
 
 
 # KenBuild (Test Game)
@@ -338,8 +342,8 @@ ifeq ($(PLATFORM),DARWIN)
     endif
 endif
 
-KENBUILD_GAME_OBJS_EXP:=$(addprefix $(KENBUILD_OBJ)/,$(addsuffix .$o,$(basename $(KENBUILD_GAME_OBJS))))
-KENBUILD_EDITOR_OBJS_EXP:=$(addprefix $(KENBUILD_OBJ)/,$(addsuffix .$o,$(basename $(KENBUILD_EDITOR_OBJS))))
+KENBUILD_GAME_OBJS_EXP:=$(call expandobjs,$(KENBUILD_OBJ)/,$(KENBUILD_GAME_OBJS))
+KENBUILD_EDITOR_OBJS_EXP:=$(call expandobjs,$(KENBUILD_OBJ)/,$(KENBUILD_EDITOR_OBJS))
 
 
 # Duke Nukem 3D
@@ -552,16 +556,16 @@ endif
 
 ## Construct file names of object files
 
-COMMON_EDITOR_OBJS_EXP:=$(addprefix $(DUKE3D_OBJ)/,$(addsuffix .$o,$(basename $(COMMON_EDITOR_OBJS)))) $(ENGINE_EDITOR_OBJS_EXP)
+COMMON_EDITOR_OBJS_EXP:=$(call expandobjs,$(DUKE3D_OBJ)/,$(COMMON_EDITOR_OBJS)) $(ENGINE_EDITOR_OBJS_EXP)
 
-MIDI_OBJS_EXP:=$(addprefix $(DUKE3D_OBJ)/,$(addsuffix .$o,$(basename $(MIDI_OBJS))))
+MIDI_OBJS_EXP:=$(call expandobjs,$(DUKE3D_OBJ)/,$(MIDI_OBJS))
 
-DUKE3D_GAME_OBJS_EXP:=$(addprefix $(DUKE3D_OBJ)/,$(addsuffix .$o,$(basename $(DUKE3D_GAME_OBJS)))) $(MIDI_OBJS_EXP) $(AUDIOLIB_OBJS_EXP) $(MACT_OBJS_EXP) $(ENET_TARGET)
-DUKE3D_EDITOR_OBJS_EXP:=$(addprefix $(DUKE3D_OBJ)/,$(addsuffix .$o,$(basename $(DUKE3D_EDITOR_OBJS)))) $(AUDIOLIB_OBJS_EXP)
+DUKE3D_GAME_OBJS_EXP:=$(call expandobjs,$(DUKE3D_OBJ)/,$(DUKE3D_GAME_OBJS)) $(MIDI_OBJS_EXP) $(AUDIOLIB_OBJS_EXP) $(MACT_OBJS_EXP) $(ENET_TARGET)
+DUKE3D_EDITOR_OBJS_EXP:=$(call expandobjs,$(DUKE3D_OBJ)/,$(DUKE3D_EDITOR_OBJS)) $(AUDIOLIB_OBJS_EXP)
 
 ifneq (0,$(LUNATIC))
-    DUKE3D_GAME_OBJS_EXP+= $(addprefix $(DUKE3D_OBJ)/,$(addsuffix .$o,$(basename $(LUNATIC_GAME_OBJS) $(addprefix $(LUNATIC_LUA_PREFIX),$(LUNATIC_LUA_OBJS) $(LUNATIC_GAME_LUA_OBJS)))))
-    DUKE3D_EDITOR_OBJS_EXP+= $(addprefix $(DUKE3D_OBJ)/,$(addsuffix .$o,$(basename $(LUNATIC_EDITOR_OBJS) $(addprefix $(LUNATIC_LUA_PREFIX),$(LUNATIC_LUA_OBJS) $(LUNATIC_EDITOR_LUA_OBJS)))))
+    DUKE3D_GAME_OBJS_EXP+= $(call expandobjs,$(DUKE3D_OBJ)/,$(LUNATIC_GAME_OBJS) $(addprefix $(LUNATIC_LUA_PREFIX),$(LUNATIC_LUA_OBJS) $(LUNATIC_GAME_LUA_OBJS)))
+    DUKE3D_EDITOR_OBJS_EXP+= $(call expandobjs,$(DUKE3D_OBJ)/,$(LUNATIC_EDITOR_OBJS) $(addprefix $(LUNATIC_LUA_PREFIX),$(LUNATIC_LUA_OBJS) $(LUNATIC_EDITOR_LUA_OBJS)))
 endif
 
 # Shadow Warrior
@@ -678,8 +682,8 @@ ifeq ($(PLATFORM),WINDOWS)
     SW_EDITOR_OBJS+= buildres.rc
 endif
 
-SW_GAME_OBJS_EXP:=$(addprefix $(SW_OBJ)/,$(addsuffix .$o,$(basename $(SW_GAME_OBJS)))) $(MIDI_OBJS_EXP) $(AUDIOLIB_OBJS_EXP) $(MACT_OBJS_EXP)
-SW_EDITOR_OBJS_EXP:=$(addprefix $(SW_OBJ)/,$(addsuffix .$o,$(basename $(SW_EDITOR_OBJS)))) $(AUDIOLIB_OBJS_EXP)
+SW_GAME_OBJS_EXP:=$(call expandobjs,$(SW_OBJ)/,$(SW_GAME_OBJS)) $(MIDI_OBJS_EXP) $(AUDIOLIB_OBJS_EXP) $(MACT_OBJS_EXP)
+SW_EDITOR_OBJS_EXP:=$(call expandobjs,$(SW_OBJ)/,$(SW_EDITOR_OBJS)) $(AUDIOLIB_OBJS_EXP)
 
 
 ### component definitions end