diff --git a/Makefile.in b/Makefile.in
index 0d9a68fe..c735f336 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -83,6 +83,7 @@ J = $(patsubst -j%,%,$(filter -j%,$(MAKEFLAGS)))
 include $(SRC)/make/utility.mk
 include $(SRC)/make/rules-source.mk
 include $(SRC)/make/rules-common.mk
+include $(SRC)/make/rules-makedep.mk
 include $(SRC)/make/rules-meson.mk
 include $(SRC)/make/rules-cmake.mk
 include $(SRC)/make/rules-autoconf.mk
@@ -305,24 +306,13 @@ $(eval $(call rules-cmake,glslang,64))
 ## lsteamclient
 ##
 
-LSTEAMCLIENT_CFLAGS = -Wno-attributes
-LSTEAMCLIENT_CXXFLAGS = -Wno-attributes
-LSTEAMCLIENT_LDFLAGS = -static-libgcc -static-libstdc++ -ldl
-
-LSTEAMCLIENT_WINEMAKER_ARGS = \
-	-DSTEAM_API_EXPORTS \
-	-Dprivate=public \
-	-Dprotected=public
-
 LSTEAMCLIENT_DEPENDS = wine
 
 $(eval $(call rules-source,lsteamclient,$(SRCDIR)/lsteamclient))
-$(eval $(call rules-winemaker,lsteamclient,32,lsteamclient.dll))
-$(eval $(call rules-winemaker,lsteamclient,64,lsteamclient.dll))
+$(eval $(call rules-makedep,lsteamclient,32))
+$(eval $(call rules-makedep,lsteamclient,64))
 
 
-##
-
 ##
 ## openxr
 ## Note 32-bit is not supported by SteamVR, so we don't build it.
diff --git a/lsteamclient/Makefile.in b/lsteamclient/Makefile.in
new file mode 100644
index 00000000..2a30b94b
--- /dev/null
+++ b/lsteamclient/Makefile.in
@@ -0,0 +1,320 @@
+MODULE    = lsteamclient.dll
+IMPORTS   = user32
+
+EXTRADLLFLAGS = -mcygwin -static-libgcc -static-libstdc++ -ldl
+EXTRADEFS = -DWINE_NO_LONG_TYPES -DSTEAM_API_EXPORTS -Dprivate=public -Dprotected=public
+
+C_SRCS = \
+	steamclient_main.c \
+	steamclient_wrappers.c \
+	winISteamAppList.c \
+	winISteamApps.c \
+	winISteamAppTicket.c \
+	winISteamClient.c \
+	winISteamController.c \
+	winISteamFriends.c \
+	winISteamGameCoordinator.c \
+	winISteamGameSearch.c \
+	winISteamGameServer.c \
+	winISteamGameServerStats.c \
+	winISteamGameStats.c \
+	winISteamHTMLSurface.c \
+	winISteamHTTP.c \
+	winISteamInput.c \
+	winISteamInventory.c \
+	winISteamMasterServerUpdater.c \
+	winISteamMatchmaking.c \
+	winISteamMatchmakingServers.c \
+	winISteamMusic.c \
+	winISteamMusicRemote.c \
+	winISteamNetworking.c \
+	winISteamNetworkingFakeUDPPort.c \
+	winISteamNetworkingMessages.c \
+	winISteamNetworkingSockets.c \
+	winISteamNetworkingSocketsSerialized.c \
+	winISteamNetworkingUtils.c \
+	winISteamParentalSettings.c \
+	winISteamParties.c \
+	winISteamRemotePlay.c \
+	winISteamRemoteStorage.c \
+	winISteamScreenshots.c \
+	winISteamUGC.c \
+	winISteamUnifiedMessages.c \
+	winISteamUser.c \
+	winISteamUserStats.c \
+	winISteamUtils.c \
+	winISteamVideo.c \
+
+CXX_SRCS = \
+	cppISteamAppList_STEAMAPPLIST_INTERFACE_VERSION001.cpp \
+	cppISteamApps_STEAMAPPS_INTERFACE_VERSION001.cpp \
+	cppISteamApps_STEAMAPPS_INTERFACE_VERSION002.cpp \
+	cppISteamApps_STEAMAPPS_INTERFACE_VERSION003.cpp \
+	cppISteamApps_STEAMAPPS_INTERFACE_VERSION004.cpp \
+	cppISteamApps_STEAMAPPS_INTERFACE_VERSION005.cpp \
+	cppISteamApps_STEAMAPPS_INTERFACE_VERSION006.cpp \
+	cppISteamApps_STEAMAPPS_INTERFACE_VERSION007.cpp \
+	cppISteamApps_STEAMAPPS_INTERFACE_VERSION008.cpp \
+	cppISteamAppTicket_STEAMAPPTICKET_INTERFACE_VERSION001.cpp \
+	cppISteamClient_SteamClient006.cpp \
+	cppISteamClient_SteamClient007.cpp \
+	cppISteamClient_SteamClient008.cpp \
+	cppISteamClient_SteamClient009.cpp \
+	cppISteamClient_SteamClient010.cpp \
+	cppISteamClient_SteamClient011.cpp \
+	cppISteamClient_SteamClient012.cpp \
+	cppISteamClient_SteamClient013.cpp \
+	cppISteamClient_SteamClient014.cpp \
+	cppISteamClient_SteamClient015.cpp \
+	cppISteamClient_SteamClient016.cpp \
+	cppISteamClient_SteamClient017.cpp \
+	cppISteamClient_SteamClient018.cpp \
+	cppISteamClient_SteamClient019.cpp \
+	cppISteamClient_SteamClient020.cpp \
+	cppISteamController_SteamController003.cpp \
+	cppISteamController_SteamController004.cpp \
+	cppISteamController_SteamController005.cpp \
+	cppISteamController_SteamController006.cpp \
+	cppISteamController_SteamController007.cpp \
+	cppISteamController_SteamController008.cpp \
+	cppISteamController_STEAMCONTROLLER_INTERFACE_VERSION.cpp \
+	cppISteamFriends_SteamFriends001.cpp \
+	cppISteamFriends_SteamFriends002.cpp \
+	cppISteamFriends_SteamFriends003.cpp \
+	cppISteamFriends_SteamFriends004.cpp \
+	cppISteamFriends_SteamFriends005.cpp \
+	cppISteamFriends_SteamFriends006.cpp \
+	cppISteamFriends_SteamFriends007.cpp \
+	cppISteamFriends_SteamFriends008.cpp \
+	cppISteamFriends_SteamFriends009.cpp \
+	cppISteamFriends_SteamFriends010.cpp \
+	cppISteamFriends_SteamFriends011.cpp \
+	cppISteamFriends_SteamFriends012.cpp \
+	cppISteamFriends_SteamFriends013.cpp \
+	cppISteamFriends_SteamFriends014.cpp \
+	cppISteamFriends_SteamFriends015.cpp \
+	cppISteamFriends_SteamFriends017.cpp \
+	cppISteamGameCoordinator_SteamGameCoordinator001.cpp \
+	cppISteamGameSearch_SteamMatchGameSearch001.cpp \
+	cppISteamGameServer_SteamGameServer002.cpp \
+	cppISteamGameServer_SteamGameServer003.cpp \
+	cppISteamGameServer_SteamGameServer004.cpp \
+	cppISteamGameServer_SteamGameServer005.cpp \
+	cppISteamGameServer_SteamGameServer008.cpp \
+	cppISteamGameServer_SteamGameServer009.cpp \
+	cppISteamGameServer_SteamGameServer010.cpp \
+	cppISteamGameServer_SteamGameServer011.cpp \
+	cppISteamGameServer_SteamGameServer012.cpp \
+	cppISteamGameServer_SteamGameServer013.cpp \
+	cppISteamGameServer_SteamGameServer014.cpp \
+	cppISteamGameServer_SteamGameServer015.cpp \
+	cppISteamGameServerStats_SteamGameServerStats001.cpp \
+	cppISteamGameStats_SteamGameStats001.cpp \
+	cppISteamHTMLSurface_STEAMHTMLSURFACE_INTERFACE_VERSION_001.cpp \
+	cppISteamHTMLSurface_STEAMHTMLSURFACE_INTERFACE_VERSION_002.cpp \
+	cppISteamHTMLSurface_STEAMHTMLSURFACE_INTERFACE_VERSION_003.cpp \
+	cppISteamHTMLSurface_STEAMHTMLSURFACE_INTERFACE_VERSION_004.cpp \
+	cppISteamHTMLSurface_STEAMHTMLSURFACE_INTERFACE_VERSION_005.cpp \
+	cppISteamHTTP_STEAMHTTP_INTERFACE_VERSION001.cpp \
+	cppISteamHTTP_STEAMHTTP_INTERFACE_VERSION002.cpp \
+	cppISteamHTTP_STEAMHTTP_INTERFACE_VERSION003.cpp \
+	cppISteamInput_SteamInput001.cpp \
+	cppISteamInput_SteamInput002.cpp \
+	cppISteamInput_SteamInput005.cpp \
+	cppISteamInput_SteamInput006.cpp \
+	cppISteamInventory_STEAMINVENTORY_INTERFACE_V001.cpp \
+	cppISteamInventory_STEAMINVENTORY_INTERFACE_V002.cpp \
+	cppISteamInventory_STEAMINVENTORY_INTERFACE_V003.cpp \
+	cppISteamMasterServerUpdater_SteamMasterServerUpdater001.cpp \
+	cppISteamMatchmaking_SteamMatchMaking001.cpp \
+	cppISteamMatchmaking_SteamMatchMaking002.cpp \
+	cppISteamMatchmaking_SteamMatchMaking003.cpp \
+	cppISteamMatchmaking_SteamMatchMaking004.cpp \
+	cppISteamMatchmaking_SteamMatchMaking005.cpp \
+	cppISteamMatchmaking_SteamMatchMaking006.cpp \
+	cppISteamMatchmaking_SteamMatchMaking007.cpp \
+	cppISteamMatchmaking_SteamMatchMaking008.cpp \
+	cppISteamMatchmaking_SteamMatchMaking009.cpp \
+	cppISteamMatchmakingServers_SteamMatchMakingServers001.cpp \
+	cppISteamMatchmakingServers_SteamMatchMakingServers002.cpp \
+	cppISteamMusic_STEAMMUSIC_INTERFACE_VERSION001.cpp \
+	cppISteamMusicRemote_STEAMMUSICREMOTE_INTERFACE_VERSION001.cpp \
+	cppISteamNetworking_SteamNetworking001.cpp \
+	cppISteamNetworking_SteamNetworking002.cpp \
+	cppISteamNetworking_SteamNetworking003.cpp \
+	cppISteamNetworking_SteamNetworking004.cpp \
+	cppISteamNetworking_SteamNetworking005.cpp \
+	cppISteamNetworking_SteamNetworking006.cpp \
+	cppISteamNetworkingFakeUDPPort_SteamNetworkingFakeUDPPort001.cpp \
+	cppISteamNetworkingMessages_SteamNetworkingMessages002.cpp \
+	cppISteamNetworkingSockets_SteamNetworkingSockets002.cpp \
+	cppISteamNetworkingSockets_SteamNetworkingSockets004.cpp \
+	cppISteamNetworkingSockets_SteamNetworkingSockets006.cpp \
+	cppISteamNetworkingSockets_SteamNetworkingSockets008.cpp \
+	cppISteamNetworkingSockets_SteamNetworkingSockets009.cpp \
+	cppISteamNetworkingSockets_SteamNetworkingSockets012.cpp \
+	cppISteamNetworkingSocketsSerialized_SteamNetworkingSocketsSerialized002.cpp \
+	cppISteamNetworkingSocketsSerialized_SteamNetworkingSocketsSerialized003.cpp \
+	cppISteamNetworkingUtils_SteamNetworkingUtils001.cpp \
+	cppISteamNetworkingUtils_SteamNetworkingUtils002.cpp \
+	cppISteamNetworkingUtils_SteamNetworkingUtils003.cpp \
+	cppISteamNetworkingUtils_SteamNetworkingUtils004.cpp \
+	cppISteamParentalSettings_STEAMPARENTALSETTINGS_INTERFACE_VERSION001.cpp \
+	cppISteamParties_SteamParties002.cpp \
+	cppISteamRemotePlay_STEAMREMOTEPLAY_INTERFACE_VERSION001.cpp \
+	cppISteamRemotePlay_STEAMREMOTEPLAY_INTERFACE_VERSION002.cpp \
+	cppISteamRemoteStorage_STEAMREMOTESTORAGE_INTERFACE_VERSION001.cpp \
+	cppISteamRemoteStorage_STEAMREMOTESTORAGE_INTERFACE_VERSION002.cpp \
+	cppISteamRemoteStorage_STEAMREMOTESTORAGE_INTERFACE_VERSION003.cpp \
+	cppISteamRemoteStorage_STEAMREMOTESTORAGE_INTERFACE_VERSION004.cpp \
+	cppISteamRemoteStorage_STEAMREMOTESTORAGE_INTERFACE_VERSION005.cpp \
+	cppISteamRemoteStorage_STEAMREMOTESTORAGE_INTERFACE_VERSION006.cpp \
+	cppISteamRemoteStorage_STEAMREMOTESTORAGE_INTERFACE_VERSION007.cpp \
+	cppISteamRemoteStorage_STEAMREMOTESTORAGE_INTERFACE_VERSION008.cpp \
+	cppISteamRemoteStorage_STEAMREMOTESTORAGE_INTERFACE_VERSION009.cpp \
+	cppISteamRemoteStorage_STEAMREMOTESTORAGE_INTERFACE_VERSION010.cpp \
+	cppISteamRemoteStorage_STEAMREMOTESTORAGE_INTERFACE_VERSION011.cpp \
+	cppISteamRemoteStorage_STEAMREMOTESTORAGE_INTERFACE_VERSION012.cpp \
+	cppISteamRemoteStorage_STEAMREMOTESTORAGE_INTERFACE_VERSION013.cpp \
+	cppISteamRemoteStorage_STEAMREMOTESTORAGE_INTERFACE_VERSION014.cpp \
+	cppISteamRemoteStorage_STEAMREMOTESTORAGE_INTERFACE_VERSION016.cpp \
+	cppISteamScreenshots_STEAMSCREENSHOTS_INTERFACE_VERSION001.cpp \
+	cppISteamScreenshots_STEAMSCREENSHOTS_INTERFACE_VERSION002.cpp \
+	cppISteamScreenshots_STEAMSCREENSHOTS_INTERFACE_VERSION003.cpp \
+	cppISteamUGC_STEAMUGC_INTERFACE_VERSION001.cpp \
+	cppISteamUGC_STEAMUGC_INTERFACE_VERSION002.cpp \
+	cppISteamUGC_STEAMUGC_INTERFACE_VERSION003.cpp \
+	cppISteamUGC_STEAMUGC_INTERFACE_VERSION004.cpp \
+	cppISteamUGC_STEAMUGC_INTERFACE_VERSION005.cpp \
+	cppISteamUGC_STEAMUGC_INTERFACE_VERSION006.cpp \
+	cppISteamUGC_STEAMUGC_INTERFACE_VERSION007.cpp \
+	cppISteamUGC_STEAMUGC_INTERFACE_VERSION008.cpp \
+	cppISteamUGC_STEAMUGC_INTERFACE_VERSION009.cpp \
+	cppISteamUGC_STEAMUGC_INTERFACE_VERSION010.cpp \
+	cppISteamUGC_STEAMUGC_INTERFACE_VERSION012.cpp \
+	cppISteamUGC_STEAMUGC_INTERFACE_VERSION013.cpp \
+	cppISteamUGC_STEAMUGC_INTERFACE_VERSION014.cpp \
+	cppISteamUGC_STEAMUGC_INTERFACE_VERSION015.cpp \
+	cppISteamUGC_STEAMUGC_INTERFACE_VERSION016.cpp \
+	cppISteamUGC_STEAMUGC_INTERFACE_VERSION017.cpp \
+	cppISteamUGC_STEAMUGC_INTERFACE_VERSION018.cpp \
+	cppISteamUnifiedMessages_STEAMUNIFIEDMESSAGES_INTERFACE_VERSION001.cpp \
+	cppISteamUser_SteamUser004.cpp \
+	cppISteamUser_SteamUser005.cpp \
+	cppISteamUser_SteamUser006.cpp \
+	cppISteamUser_SteamUser007.cpp \
+	cppISteamUser_SteamUser008.cpp \
+	cppISteamUser_SteamUser009.cpp \
+	cppISteamUser_SteamUser010.cpp \
+	cppISteamUser_SteamUser011.cpp \
+	cppISteamUser_SteamUser012.cpp \
+	cppISteamUser_SteamUser013.cpp \
+	cppISteamUser_SteamUser014.cpp \
+	cppISteamUser_SteamUser015.cpp \
+	cppISteamUser_SteamUser016.cpp \
+	cppISteamUser_SteamUser017.cpp \
+	cppISteamUser_SteamUser018.cpp \
+	cppISteamUser_SteamUser019.cpp \
+	cppISteamUser_SteamUser020.cpp \
+	cppISteamUser_SteamUser021.cpp \
+	cppISteamUser_SteamUser022.cpp \
+	cppISteamUser_SteamUser023.cpp \
+	cppISteamUserStats_STEAMUSERSTATS_INTERFACE_VERSION001.cpp \
+	cppISteamUserStats_STEAMUSERSTATS_INTERFACE_VERSION002.cpp \
+	cppISteamUserStats_STEAMUSERSTATS_INTERFACE_VERSION003.cpp \
+	cppISteamUserStats_STEAMUSERSTATS_INTERFACE_VERSION004.cpp \
+	cppISteamUserStats_STEAMUSERSTATS_INTERFACE_VERSION005.cpp \
+	cppISteamUserStats_STEAMUSERSTATS_INTERFACE_VERSION006.cpp \
+	cppISteamUserStats_STEAMUSERSTATS_INTERFACE_VERSION007.cpp \
+	cppISteamUserStats_STEAMUSERSTATS_INTERFACE_VERSION008.cpp \
+	cppISteamUserStats_STEAMUSERSTATS_INTERFACE_VERSION009.cpp \
+	cppISteamUserStats_STEAMUSERSTATS_INTERFACE_VERSION010.cpp \
+	cppISteamUserStats_STEAMUSERSTATS_INTERFACE_VERSION011.cpp \
+	cppISteamUserStats_STEAMUSERSTATS_INTERFACE_VERSION012.cpp \
+	cppISteamUtils_SteamUtils002.cpp \
+	cppISteamUtils_SteamUtils004.cpp \
+	cppISteamUtils_SteamUtils005.cpp \
+	cppISteamUtils_SteamUtils006.cpp \
+	cppISteamUtils_SteamUtils007.cpp \
+	cppISteamUtils_SteamUtils008.cpp \
+	cppISteamUtils_SteamUtils009.cpp \
+	cppISteamUtils_SteamUtils010.cpp \
+	cppISteamVideo_STEAMVIDEO_INTERFACE_V001.cpp \
+	cppISteamVideo_STEAMVIDEO_INTERFACE_V002.cpp \
+	steamclient_manual_099y.cpp \
+	steamclient_manual_141.cpp \
+	steamclient_manual_142.cpp \
+	steamclient_manual_144.cpp \
+	steamclient_manual_146.cpp \
+	steamclient_manual_147.cpp \
+	steamclient_manual_148a.cpp \
+	steamclient_manual_150.cpp \
+	steamclient_manual_151.cpp \
+	steamclient_manual_152.cpp \
+	steamclient_manual_153a.cpp \
+	steamclient_manual_common.cpp \
+	struct_converters_111x.cpp \
+	struct_converters_112.cpp \
+	struct_converters_112x.cpp \
+	struct_converters_113.cpp \
+	struct_converters_114.cpp \
+	struct_converters_115.cpp \
+	struct_converters_116.cpp \
+	struct_converters_116x.cpp \
+	struct_converters_117.cpp \
+	struct_converters_118.cpp \
+	struct_converters_119.cpp \
+	struct_converters_119x.cpp \
+	struct_converters_120.cpp \
+	struct_converters_121.cpp \
+	struct_converters_121x.cpp \
+	struct_converters_122.cpp \
+	struct_converters_123.cpp \
+	struct_converters_123a.cpp \
+	struct_converters_124.cpp \
+	struct_converters_125.cpp \
+	struct_converters_126.cpp \
+	struct_converters_126a.cpp \
+	struct_converters_127.cpp \
+	struct_converters_128.cpp \
+	struct_converters_128x.cpp \
+	struct_converters_129.cpp \
+	struct_converters_129a.cpp \
+	struct_converters_130.cpp \
+	struct_converters_130x.cpp \
+	struct_converters_131.cpp \
+	struct_converters_132.cpp \
+	struct_converters_132x.cpp \
+	struct_converters_133.cpp \
+	struct_converters_133a.cpp \
+	struct_converters_133b.cpp \
+	struct_converters_133x.cpp \
+	struct_converters_134.cpp \
+	struct_converters_135.cpp \
+	struct_converters_135a.cpp \
+	struct_converters_136.cpp \
+	struct_converters_137.cpp \
+	struct_converters_138.cpp \
+	struct_converters_138a.cpp \
+	struct_converters_139.cpp \
+	struct_converters_140.cpp \
+	struct_converters_141.cpp \
+	struct_converters_142.cpp \
+	struct_converters_143.cpp \
+	struct_converters_143x.cpp \
+	struct_converters_143y.cpp \
+	struct_converters_144.cpp \
+	struct_converters_145.cpp \
+	struct_converters_146.cpp \
+	struct_converters_147.cpp \
+	struct_converters_148a.cpp \
+	struct_converters_149.cpp \
+	struct_converters_150.cpp \
+	struct_converters_151.cpp \
+	struct_converters_152.cpp \
+	struct_converters_153a.cpp \
+	struct_converters_154.cpp \
+	struct_converters_155.cpp \
+	struct_converters_156.cpp \
+	struct_converters_157.cpp \
+	struct_converters_158.cpp \
diff --git a/lsteamclient/steamclient_main.c b/lsteamclient/steamclient_main.c
index 7ad0ed20..55354b92 100644
--- a/lsteamclient/steamclient_main.c
+++ b/lsteamclient/steamclient_main.c
@@ -48,12 +48,13 @@ static void * (WINAPI *p_NtCurrentTeb)(void);
 
 static void init_ntdll_so_funcs(void)
 {
+    static const WCHAR ntdllW[] = {'n','t','d','l','l','.','d','l','l',0};
     Dl_info info;
     UINT64 unix_funcs;
     unsigned int status;
     void *ntdll;
 
-    status = NtQueryVirtualMemory(GetCurrentProcess(), GetModuleHandleW(L"ntdll.dll"), (MEMORY_INFORMATION_CLASS)1000 /*MemoryWineUnixFuncs*/,
+    status = NtQueryVirtualMemory(GetCurrentProcess(), GetModuleHandleW(ntdllW), (MEMORY_INFORMATION_CLASS)1000 /*MemoryWineUnixFuncs*/,
             &unix_funcs, sizeof(unix_funcs), NULL);
     if (status)
     {
@@ -253,7 +254,7 @@ bool steamclient_dos_path_to_unix_path(const char *src, char *dst, int is_url)
             return 0;
         }
 
-        strncpy(dst, unix_path, PATH_MAX);
+        lstrcpynA(dst, unix_path, PATH_MAX);
 
         HeapFree(GetProcessHeap(), 0, unix_path);
     }else{
@@ -380,11 +381,12 @@ static void *get_mem_from_steamclient_dll(size_t size, unsigned int version, voi
 
     if (!alloc_base)
     {
+        static const WCHAR steamclientW[] = {'s','t','e','a','m','c','l','i','e','n','t','.','d','l','l',0};
         const IMAGE_SECTION_HEADER *sec;
         const IMAGE_NT_HEADERS *nt;
         HMODULE mod;
 
-        if (!(mod = GetModuleHandleW(L"steamclient.dll")))
+        if (!(mod = GetModuleHandleW(steamclientW)))
         {
             /* That is steamclient64.dll for x64 but no known use cases on x64.*/
             WARN("Module not found, err %u.\n", GetLastError());
@@ -845,7 +847,7 @@ static int load_steamclient(void)
     snprintf(path, PATH_MAX, "%s/.steam/sdk32/steamclient.so", getenv("HOME"));
 #endif
     if (realpath(path, resolved_path)){
-        strncpy(path, resolved_path, PATH_MAX);
+        lstrcpynA(path, resolved_path, PATH_MAX);
         path[PATH_MAX - 1] = 0;
     }
 #endif
diff --git a/lsteamclient/steamclient_manual_099y.cpp b/lsteamclient/steamclient_manual_099y.cpp
index 153e3b2b..4275c266 100644
--- a/lsteamclient/steamclient_manual_099y.cpp
+++ b/lsteamclient/steamclient_manual_099y.cpp
@@ -11,8 +11,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(steamclient);
 #include "steam_defs.h"
 #pragma push_macro("__cdecl")
 #undef __cdecl
+#pragma push_macro("strncpy")
+#undef strncpy
 #include "steamworks_sdk_099y/steam_api.h"
 #pragma pop_macro("__cdecl")
+#pragma pop_macro("strncpy")
 #include "steamclient_private.h"
 
 #define SDK_VERSION 992
diff --git a/lsteamclient/steamclient_manual_141.cpp b/lsteamclient/steamclient_manual_141.cpp
index 91fbe8d1..e7290c6c 100644
--- a/lsteamclient/steamclient_manual_141.cpp
+++ b/lsteamclient/steamclient_manual_141.cpp
@@ -11,8 +11,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(steamclient);
 #include "steam_defs.h"
 #pragma push_macro("__cdecl")
 #undef __cdecl
+#pragma push_macro("strncpy")
+#undef strncpy
 #include "steamworks_sdk_141/steam_api.h"
 #pragma pop_macro("__cdecl")
+#pragma pop_macro("strncpy")
 #include "steamclient_private.h"
 
 #define SDK_VERSION 1410
diff --git a/lsteamclient/steamclient_manual_142.cpp b/lsteamclient/steamclient_manual_142.cpp
index 0488f2c5..bc6a971a 100644
--- a/lsteamclient/steamclient_manual_142.cpp
+++ b/lsteamclient/steamclient_manual_142.cpp
@@ -11,8 +11,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(steamclient);
 #include "steam_defs.h"
 #pragma push_macro("__cdecl")
 #undef __cdecl
+#pragma push_macro("strncpy")
+#undef strncpy
 #include "steamworks_sdk_142/steam_api.h"
 #pragma pop_macro("__cdecl")
+#pragma pop_macro("strncpy")
 #include "steamclient_private.h"
 
 #define SDK_VERSION 1420
diff --git a/lsteamclient/steamclient_manual_144.cpp b/lsteamclient/steamclient_manual_144.cpp
index b06cc2fa..1fd5ee03 100644
--- a/lsteamclient/steamclient_manual_144.cpp
+++ b/lsteamclient/steamclient_manual_144.cpp
@@ -11,10 +11,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(steamclient);
 #include "steam_defs.h"
 #pragma push_macro("__cdecl")
 #undef __cdecl
+#pragma push_macro("strncpy")
+#undef strncpy
 #include "steamworks_sdk_144/steam_api.h"
 #include "steamworks_sdk_144/isteamnetworkingsockets.h"
 #include "steamworks_sdk_144/steamnetworkingtypes.h"
 #pragma pop_macro("__cdecl")
+#pragma pop_macro("strncpy")
 #include "steamclient_private.h"
 
 extern "C" {
diff --git a/lsteamclient/steamclient_manual_146.cpp b/lsteamclient/steamclient_manual_146.cpp
index 466498d7..08ac2f1e 100644
--- a/lsteamclient/steamclient_manual_146.cpp
+++ b/lsteamclient/steamclient_manual_146.cpp
@@ -11,11 +11,14 @@ WINE_DEFAULT_DEBUG_CHANNEL(steamclient);
 #include "steam_defs.h"
 #pragma push_macro("__cdecl")
 #undef __cdecl
+#pragma push_macro("strncpy")
+#undef strncpy
 #include "steamworks_sdk_146/steam_api.h"
 #include "steamworks_sdk_146/isteamnetworkingsockets.h"
 #include "steamworks_sdk_146/isteamnetworkingutils.h"
 #include "steamworks_sdk_146/steamnetworkingtypes.h"
 #pragma pop_macro("__cdecl")
+#pragma pop_macro("strncpy")
 #include "steamclient_private.h"
 
 extern "C" {
diff --git a/lsteamclient/steamclient_manual_147.cpp b/lsteamclient/steamclient_manual_147.cpp
index 91c3dd00..3304f29c 100644
--- a/lsteamclient/steamclient_manual_147.cpp
+++ b/lsteamclient/steamclient_manual_147.cpp
@@ -11,11 +11,14 @@ WINE_DEFAULT_DEBUG_CHANNEL(steamclient);
 #include "steam_defs.h"
 #pragma push_macro("__cdecl")
 #undef __cdecl
+#pragma push_macro("strncpy")
+#undef strncpy
 #include "steamworks_sdk_147/steam_api.h"
 #include "steamworks_sdk_147/isteamnetworkingsockets.h"
 #include "steamworks_sdk_147/isteamnetworkingutils.h"
 #include "steamworks_sdk_147/steamnetworkingtypes.h"
 #pragma pop_macro("__cdecl")
+#pragma pop_macro("strncpy")
 #include "steamclient_private.h"
 
 extern "C" {
diff --git a/lsteamclient/steamclient_manual_148a.cpp b/lsteamclient/steamclient_manual_148a.cpp
index fca410a5..a1752301 100644
--- a/lsteamclient/steamclient_manual_148a.cpp
+++ b/lsteamclient/steamclient_manual_148a.cpp
@@ -11,11 +11,14 @@ WINE_DEFAULT_DEBUG_CHANNEL(steamclient);
 #include "steam_defs.h"
 #pragma push_macro("__cdecl")
 #undef __cdecl
+#pragma push_macro("strncpy")
+#undef strncpy
 #include "steamworks_sdk_148a/steam_api.h"
 #include "steamworks_sdk_148a/isteamnetworkingsockets.h"
 #include "steamworks_sdk_148a/isteamnetworkingutils.h"
 #include "steamworks_sdk_148a/steamnetworkingtypes.h"
 #pragma pop_macro("__cdecl")
+#pragma pop_macro("strncpy")
 #include "steamclient_private.h"
 
 extern "C" {
diff --git a/lsteamclient/steamclient_manual_150.cpp b/lsteamclient/steamclient_manual_150.cpp
index f3b83477..17535528 100644
--- a/lsteamclient/steamclient_manual_150.cpp
+++ b/lsteamclient/steamclient_manual_150.cpp
@@ -11,11 +11,14 @@ WINE_DEFAULT_DEBUG_CHANNEL(steamclient);
 #include "steam_defs.h"
 #pragma push_macro("__cdecl")
 #undef __cdecl
+#pragma push_macro("strncpy")
+#undef strncpy
 #include "steamworks_sdk_150/steam_api.h"
 #include "steamworks_sdk_150/isteamnetworkingsockets.h"
 #include "steamworks_sdk_150/isteamnetworkingutils.h"
 #include "steamworks_sdk_150/steamnetworkingtypes.h"
 #pragma pop_macro("__cdecl")
+#pragma pop_macro("strncpy")
 #include "steamclient_private.h"
 
 extern "C" {
diff --git a/lsteamclient/steamclient_manual_151.cpp b/lsteamclient/steamclient_manual_151.cpp
index ccdb82f6..788eba54 100644
--- a/lsteamclient/steamclient_manual_151.cpp
+++ b/lsteamclient/steamclient_manual_151.cpp
@@ -11,8 +11,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(steamclient);
 #include "steam_defs.h"
 #pragma push_macro("__cdecl")
 #undef __cdecl
+#pragma push_macro("strncpy")
+#undef strncpy
 #include "steamworks_sdk_151/steam_api.h"
 #pragma pop_macro("__cdecl")
+#pragma pop_macro("strncpy")
 #include "steamclient_private.h"
 
 extern "C" {
diff --git a/lsteamclient/steamclient_manual_152.cpp b/lsteamclient/steamclient_manual_152.cpp
index 7e475112..d99c315b 100644
--- a/lsteamclient/steamclient_manual_152.cpp
+++ b/lsteamclient/steamclient_manual_152.cpp
@@ -11,9 +11,12 @@ WINE_DEFAULT_DEBUG_CHANNEL(steamclient);
 #include "steam_defs.h"
 #pragma push_macro("__cdecl")
 #undef __cdecl
+#pragma push_macro("strncpy")
+#undef strncpy
 #include "steamworks_sdk_152/steam_api.h"
 #include "steamworks_sdk_152/isteaminput.h"
 #pragma pop_macro("__cdecl")
+#pragma pop_macro("strncpy")
 #include "steamclient_private.h"
 
 #include <unordered_map>
diff --git a/lsteamclient/steamclient_manual_153a.cpp b/lsteamclient/steamclient_manual_153a.cpp
index de8aa5e3..7db7c94e 100644
--- a/lsteamclient/steamclient_manual_153a.cpp
+++ b/lsteamclient/steamclient_manual_153a.cpp
@@ -11,12 +11,15 @@ WINE_DEFAULT_DEBUG_CHANNEL(steamclient);
 #include "steam_defs.h"
 #pragma push_macro("__cdecl")
 #undef __cdecl
+#pragma push_macro("strncpy")
+#undef strncpy
 #include "steamworks_sdk_153a/steam_api.h"
 #include "steamworks_sdk_153a/isteamnetworkingsockets.h"
 #include "steamworks_sdk_153a/isteamnetworkingutils.h"
 #include "steamworks_sdk_153a/steamnetworkingtypes.h"
 #include "steamworks_sdk_153a/steamnetworkingfakeip.h"
 #pragma pop_macro("__cdecl")
+#pragma pop_macro("strncpy")
 #include "steamclient_private.h"
 
 extern "C" {
diff --git a/lsteamclient/steamclient_manual_common.cpp b/lsteamclient/steamclient_manual_common.cpp
index fddcb09d..c7d5f2fc 100644
--- a/lsteamclient/steamclient_manual_common.cpp
+++ b/lsteamclient/steamclient_manual_common.cpp
@@ -12,10 +12,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(steamclient);
 #include "steam_defs.h"
 #pragma push_macro("__cdecl")
 #undef __cdecl
+#pragma push_macro("strncpy")
+#undef strncpy
 #include "steamworks_sdk_153a/steam_api.h"
 #include "steamworks_sdk_153a/steamnetworkingtypes.h"
 
 #pragma pop_macro("__cdecl")
+#pragma pop_macro("strncpy")
 #include "steamclient_private.h"
 
 extern "C" {
diff --git a/make/rules-makedep.mk b/make/rules-makedep.mk
new file mode 100644
index 00000000..afca1a24
--- /dev/null
+++ b/make/rules-makedep.mk
@@ -0,0 +1,51 @@
+# parameters:
+#   $(1): lowercase package name
+#   $(2): uppercase package name
+#   $(3): 32/64, build type
+#
+define create-rules-makedep
+$(call create-rules-common,$(1),$(2),$(3))
+
+$$(OBJ)/.$(1)-configure$(3):
+	@echo ":: configuring $(3)bit $(1)..." >&2
+
+	sed -e '/^all:$$$$/,$$$$c all:' \
+	    -e '/^SUBDIRS/,/[^\\]$$$$/c SUBDIRS = $$($(2)_SRC)' \
+	    \
+	    -e '/^srcdir/a objdir = $$(WINE_OBJ$(3))' \
+	    -e '/^prefix/c prefix = $$($(2)_DST$(3))' \
+	    -e '/^libdir/c libdir = $$($(2)_LIBDIR$(3))' \
+	    -e '/^toolsdir/c toolsdir = $$(WINE_OBJ$(3))' \
+	    \
+	    -e '/^CFLAGS/c CFLAGS = $$($(2)_INCFLAGS$(3)) $$($(2)_CFLAGS) $$(COMMON_FLAGS) $$(COMMON_FLAGS$(3))' \
+	    -e '/^CPPFLAGS/c CPPFLAGS = $$($(2)_INCFLAGS$(3)) $$($(2)_CPPFLAGS) $$(COMMON_FLAGS) $$(COMMON_FLAGS$(3))' \
+	    -e '/^CXXFLAGS/c CXXFLAGS = $$($(2)_INCFLAGS$(3)) $$($(2)_CXXFLAGS) $$(COMMON_FLAGS) $$(COMMON_FLAGS$(3)) -std=c++17' \
+	    -e '/^LDFLAGS/c LDFLAGS = $$($(2)_LIBFLAGS$(3)) $$($(2)_LDFLAGS$(3)) $$($(2)_LDFLAGS) $$($(4)LDFLAGS)' \
+	    \
+	    -e '/^x86_64_CFLAGS/c x86_64_CFLAGS = $$($(2)_INCFLAGS$(3)) $$($(2)_CFLAGS) $$(COMMON_FLAGS) $$(COMMON_FLAGS$(3))' \
+	    -e '/^x86_64_CPPFLAGS/c x86_64_CPPFLAGS = $$($(2)_INCFLAGS$(3)) $$($(2)_CPPFLAGS) $$(COMMON_FLAGS) $$(COMMON_FLAGS$(3))' \
+	    -e '/^x86_64_CXXFLAGS/c x86_64_CXXFLAGS = $$($(2)_INCFLAGS$(3)) $$($(2)_CXXFLAGS) $$(COMMON_FLAGS) $$(COMMON_FLAGS$(3)) -std=c++17' \
+	    -e '/^x86_64_LDFLAGS/c x86_64_LDFLAGS = $$($(2)_LIBFLAGS$(3)) $$($(2)_LDFLAGS$(3)) $$($(2)_LDFLAGS) $$(CROSSLDFLAGS)' \
+	    \
+	    -e '/^i386_CFLAGS/c i386_CFLAGS = $$($(2)_INCFLAGS$(3)) $$($(2)_CFLAGS) $$(COMMON_FLAGS) $$(COMMON_FLAGS$(3))' \
+	    -e '/^i386_CPPFLAGS/c i386_CPPFLAGS = $$($(2)_INCFLAGS$(3)) $$($(2)_CPPFLAGS) $$(COMMON_FLAGS) $$(COMMON_FLAGS$(3))' \
+	    -e '/^i386_CXXFLAGS/c i386_CXXFLAGS = $$($(2)_INCFLAGS$(3)) $$($(2)_CXXFLAGS) $$(COMMON_FLAGS) $$(COMMON_FLAGS$(3)) -std=c++17' \
+	    -e '/^i386_LDFLAGS/c i386_LDFLAGS = $$($(2)_LIBFLAGS$(3)) $$($(2)_LDFLAGS$(3)) $$($(2)_LDFLAGS) $$(CROSSLDFLAGS)' \
+	    \
+	    $$(WINE_OBJ$(3))/Makefile > $$($(2)_OBJ$(3))/Makefile
+
+	cd "$$($(2)_OBJ$(3))" && env $$($(2)_ENV$(3)) \
+	$$(WINE_OBJ$(3))/tools/makedep
+
+	touch $$@
+
+$$(OBJ)/.$(1)-build$(3):
+	@echo ":: building $(3)bit $(1)..." >&2
+	+cd "$$($(2)_OBJ$(3))" && env $$($(2)_ENV$(3)) \
+	$$(BEAR) $$(MAKE)
+	cd "$$($(2)_OBJ$(3))" && env $$($(2)_ENV$(3)) \
+	$$(MAKE) install
+	touch $$@
+endef
+
+rules-makedep = $(call create-rules-makedep,$(1),$(call toupper,$(1)),$(2))