mirror of
https://github.com/ValveSoftware/Proton.git
synced 2024-12-27 07:05:46 +03:00
1191 lines
39 KiB
Makefile
1191 lines
39 KiB
Makefile
# Enable secondary expansions, needed for font compilation rules
|
|
.SECONDEXPANSION:
|
|
|
|
SRC := $(abspath $(SRCDIR))
|
|
OBJ := $(abspath $(CURDIR))
|
|
|
|
ifeq ($(filter s,$(MAKEFLAGS)),s)
|
|
MAKEFLAGS += --quiet --no-print-directory
|
|
--quiet? := --quiet
|
|
CARGO_BUILD_ARGS := --quiet
|
|
else
|
|
MFLAGS += V=1 VERBOSE=1
|
|
-v? := -v
|
|
--verbose? := --verbose
|
|
endif
|
|
|
|
SHELL := /bin/bash
|
|
|
|
##
|
|
## General/global config
|
|
##
|
|
|
|
# We expect the configure script to conditionally set the following:
|
|
# SRCDIR - Path to source
|
|
# BUILD_NAME - Name of the build for manifests etc.
|
|
# STEAMRT_IMAGE - Name of the docker image to use for building
|
|
|
|
STEAMRT_IMAGE ?= registry.gitlab.steamos.cloud/proton/sniper/sdk:0.20230905.59202-0
|
|
ifeq ($(SRCDIR),)
|
|
foo := $(error SRCDIR not set, do not include Makefile.in directly, run ./configure.sh to generate Makefile)
|
|
endif
|
|
|
|
DST_BASE := $(OBJ)/dist
|
|
DST_DIR := $(DST_BASE)/files
|
|
DST_LIBDIR32 := $(DST_DIR)/lib
|
|
DST_LIBDIR64 := $(DST_DIR)/lib64
|
|
DIST_PREFIX := $(DST_DIR)/share/default_pfx/
|
|
DIST_VERSION := $(DST_BASE)/version
|
|
DEPLOY_DIR := ./deploy
|
|
REDIST_DIR := ./redist
|
|
|
|
ifneq ($(UNSTRIPPED_BUILD),)
|
|
STRIP :=
|
|
INSTALL_PROGRAM_FLAGS :=
|
|
MESON_STRIP_ARG :=
|
|
else
|
|
STRIP := strip
|
|
INSTALL_PROGRAM_FLAGS := -s
|
|
MESON_STRIP_ARG := --strip
|
|
endif
|
|
|
|
CROSSLDFLAGS += -Wl,--file-alignment,4096
|
|
OPTIMIZE_FLAGS := -O2 -march=nocona -mtune=core-avx2 -mfpmath=sse
|
|
SANITY_FLAGS := -fwrapv -fno-strict-aliasing
|
|
DEBUG_FLAGS := -ggdb -ffunction-sections -fdata-sections -fno-omit-frame-pointer
|
|
COMMON_FLAGS = $(DEBUG_FLAGS) $(OPTIMIZE_FLAGS) $(SANITY_FLAGS) -ffile-prefix-map=$(CCACHE_BASEDIR)=.
|
|
COMMON_FLAGS32 := -mstackrealign
|
|
COMMON_FLAGS64 := -mcmodel=small
|
|
CARGO_BUILD_ARGS += --release
|
|
|
|
ifneq ($(SUPPRESS_WARNINGS),)
|
|
COMMON_FLAGS += -w
|
|
endif
|
|
|
|
ifeq ($(ENABLE_BEAR),1)
|
|
BEAR := bear --append --
|
|
else
|
|
BEAR :=
|
|
endif
|
|
|
|
$(DST_DIR):
|
|
mkdir -p $@
|
|
|
|
ifeq ($(CONTAINER),1) # inside the container
|
|
# all, all-dist and dist are basically synonyms
|
|
.PHONY: all all-dist dist
|
|
all: all-dist | $(DST_DIR)
|
|
all-dist: | $(DST_DIR)
|
|
dist: all
|
|
|
|
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
|
|
include $(SRC)/make/rules-configure.mk
|
|
include $(SRC)/make/rules-winemaker.mk
|
|
include $(SRC)/make/rules-cargo.mk
|
|
|
|
|
|
##
|
|
## dav1d
|
|
##
|
|
|
|
DAV1D_MESON_ARGS = \
|
|
-Denable_tools=false \
|
|
-Denable_tests=false
|
|
|
|
$(eval $(call rules-source,dav1d,$(SRCDIR)/dav1d))
|
|
$(eval $(call rules-meson,dav1d,32))
|
|
$(eval $(call rules-meson,dav1d,64))
|
|
|
|
|
|
##
|
|
## gst-orc
|
|
##
|
|
|
|
GST_ORC_MESON_ARGS := \
|
|
-Dorc-test=disabled
|
|
|
|
$(eval $(call rules-source,gst_orc,$(SRCDIR)/gst-orc))
|
|
$(eval $(call rules-meson,gst_orc,32))
|
|
$(eval $(call rules-meson,gst_orc,64))
|
|
|
|
|
|
##
|
|
## gstreamer
|
|
##
|
|
|
|
GSTREAMER_MESON_ARGS := \
|
|
-Dgst_parse=false \
|
|
-Dbenchmarks=disabled \
|
|
-Dtools=disabled \
|
|
-Dbash-completion=disabled
|
|
|
|
GSTREAMER_DEPENDS = gst_orc
|
|
|
|
$(eval $(call rules-source,gstreamer,$(SRCDIR)/gstreamer/subprojects/gstreamer))
|
|
$(eval $(call rules-meson,gstreamer,32))
|
|
$(eval $(call rules-meson,gstreamer,64))
|
|
|
|
|
|
##
|
|
## graphene
|
|
##
|
|
|
|
$(eval $(call rules-source,graphene,$(SRCDIR)/graphene))
|
|
$(eval $(call rules-meson,graphene,32))
|
|
$(eval $(call rules-meson,graphene,64))
|
|
|
|
|
|
##
|
|
## gst-plugins-base
|
|
##
|
|
|
|
GST_BASE_MESON_ARGS := \
|
|
-Dauto_features=disabled \
|
|
-Dadder=enabled \
|
|
-Dapp=enabled \
|
|
-Daudioconvert=enabled \
|
|
-Daudioresample=enabled \
|
|
-Dogg=enabled \
|
|
-Dopus=enabled \
|
|
-Dpbtypes=enabled \
|
|
-Dplayback=enabled \
|
|
-Dtheora=enabled \
|
|
-Dtypefind=enabled \
|
|
-Dvideoconvertscale=enabled \
|
|
-Dvorbis=enabled \
|
|
-Dorc=enabled \
|
|
-Dx11=enabled \
|
|
-Dgl=enabled \
|
|
-Dgl-graphene=enabled \
|
|
-Dgl_platform=glx,egl \
|
|
--wrap-mode nodownload \
|
|
|
|
GST_BASE_DEPENDS = gst_orc graphene gstreamer
|
|
|
|
$(eval $(call rules-source,gst_base,$(SRCDIR)/gstreamer/subprojects/gst-plugins-base))
|
|
$(eval $(call rules-meson,gst_base,32))
|
|
$(eval $(call rules-meson,gst_base,64))
|
|
|
|
|
|
##
|
|
## gst-plugins-good
|
|
##
|
|
|
|
GST_GOOD_MESON_ARGS := \
|
|
-Dauto_features=disabled \
|
|
-Daudioparsers=enabled \
|
|
-Dautodetect=enabled \
|
|
-Davi=enabled \
|
|
-Ddebugutils=enabled \
|
|
-Ddeinterlace=enabled \
|
|
-Disomp4=enabled \
|
|
-Dmatroska=enabled \
|
|
-Dmpg123=enabled \
|
|
-Dvideobox=enabled \
|
|
-Dvideofilter=enabled \
|
|
-Dvpx=enabled \
|
|
-Dwavparse=enabled \
|
|
-Did3demux=enabled \
|
|
-Dmpg123=enabled \
|
|
-Dsoup=enabled \
|
|
-Dorc=enabled
|
|
|
|
GST_GOOD_DEPENDS = gst_orc gstreamer gst_base
|
|
|
|
$(eval $(call rules-source,gst_good,$(SRCDIR)/gstreamer/subprojects/gst-plugins-good/))
|
|
$(eval $(call rules-meson,gst_good,32))
|
|
$(eval $(call rules-meson,gst_good,64))
|
|
|
|
##
|
|
## FFmpeg
|
|
##
|
|
|
|
FFMPEG_CONFIGURE_ARGS := \
|
|
--enable-shared \
|
|
--disable-static \
|
|
--disable-everything \
|
|
--disable-programs \
|
|
--disable-doc \
|
|
|
|
$(eval $(call rules-source,ffmpeg,$(SRCDIR)/ffmpeg))
|
|
$(eval $(call rules-configure,ffmpeg,32))
|
|
$(eval $(call rules-configure,ffmpeg,64))
|
|
|
|
## Only use ffmpeg to build gst-libav; we don't ship it.
|
|
$(OBJ)/.ffmpeg-dist32:
|
|
touch $@
|
|
$(OBJ)/.ffmpeg-dist64:
|
|
touch $@
|
|
|
|
##
|
|
## gst-libav
|
|
##
|
|
|
|
GST_LIBAV_DEPENDS = gst_orc gstreamer gst_base ffmpeg
|
|
|
|
$(eval $(call rules-source,gst_libav,$(SRCDIR)/gstreamer/subprojects/gst-libav))
|
|
$(eval $(call rules-meson,gst_libav,32))
|
|
$(eval $(call rules-meson,gst_libav,64))
|
|
|
|
|
|
##
|
|
## gst-plugins-rs
|
|
##
|
|
|
|
GST_PLUGINS_RS_CARGO_ARGS = \
|
|
-p gst-plugin-dav1d
|
|
|
|
GST_PLUGINS_RS_DEPENDS = gst_orc gstreamer gst_base dav1d
|
|
|
|
$(eval $(call rules-source,gst_plugins_rs,$(SRCDIR)/gst-plugins-rs))
|
|
$(eval $(call rules-cargo,gst_plugins_rs,32))
|
|
$(eval $(call rules-cargo,gst_plugins_rs,64))
|
|
|
|
$(OBJ)/.gst_plugins_rs-post-build64:
|
|
mkdir -p $(GST_PLUGINS_RS_DST64)/lib64/gstreamer-1.0/
|
|
cp -a $(GST_PLUGINS_RS_OBJ64)/x86_64-unknown-linux-gnu/release/libgstdav1d.so $(GST_PLUGINS_RS_DST64)/lib64/gstreamer-1.0/
|
|
touch $@
|
|
|
|
$(OBJ)/.gst_plugins_rs-post-build32:
|
|
mkdir -p $(GST_PLUGINS_RS_DST32)/lib/gstreamer-1.0/
|
|
cp -a $(GST_PLUGINS_RS_OBJ32)/i686-unknown-linux-gnu/release/libgstdav1d.so $(GST_PLUGINS_RS_DST32)/lib/gstreamer-1.0/
|
|
touch $@
|
|
|
|
|
|
##
|
|
## Vulkan-Headers
|
|
##
|
|
|
|
$(eval $(call rules-source,vulkan-headers,$(SRCDIR)/Vulkan-Headers))
|
|
$(eval $(call rules-cmake,vulkan-headers,32,CROSS))
|
|
$(eval $(call rules-cmake,vulkan-headers,64,CROSS))
|
|
|
|
|
|
##
|
|
## SPIRV-Headers
|
|
##
|
|
|
|
$(eval $(call rules-source,spirv-headers,$(SRCDIR)/SPIRV-Headers))
|
|
$(eval $(call rules-cmake,spirv-headers,32,CROSS))
|
|
$(eval $(call rules-cmake,spirv-headers,64,CROSS))
|
|
|
|
|
|
##
|
|
## Vulkan-Loader
|
|
##
|
|
|
|
VULKAN_LOADER_CMAKE_ARGS = -DUSE_MASM=OFF
|
|
VULKAN_LOADER_CMAKE_ARGS64 = -DVULKAN_HEADERS_INSTALL_DIR=$(VULKAN_HEADERS_DST64)
|
|
VULKAN_LOADER_CMAKE_ARGS32 = -DVULKAN_HEADERS_INSTALL_DIR=$(VULKAN_HEADERS_DST32)
|
|
VULKAN_LOADER_CFLAGS = -DWINVER=0x0A00 -D_WIN32_WINNT=0x0A00 # 0x0A00 is _WIN32_WINNT_WIN10
|
|
VULKAN_LOADER_DEPENDS = vulkan-headers spirv-headers
|
|
|
|
$(eval $(call rules-source,vulkan-loader,$(SRCDIR)/Vulkan-Loader))
|
|
$(eval $(call rules-cmake,vulkan-loader,32,CROSS))
|
|
$(eval $(call rules-cmake,vulkan-loader,64,CROSS))
|
|
|
|
|
|
##
|
|
## glslang
|
|
##
|
|
|
|
$(eval $(call rules-source,glslang,$(SRCDIR)/glslang))
|
|
$(eval $(call rules-cmake,glslang,32))
|
|
$(eval $(call rules-cmake,glslang,64))
|
|
|
|
|
|
##
|
|
## lsteamclient
|
|
##
|
|
|
|
LSTEAMCLIENT_DEPENDS = wine
|
|
LSTEAMCLIENT_LDFLAGS = -static-libgcc -static-libstdc++
|
|
|
|
$(eval $(call rules-source,lsteamclient,$(SRCDIR)/lsteamclient))
|
|
$(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.
|
|
##
|
|
|
|
OPENXR_CMAKE_ARGS = -DHAVE_FILESYSTEM_WITHOUT_LIB=0
|
|
|
|
$(eval $(call rules-source,openxr,$(SRCDIR)/OpenXR-SDK))
|
|
# $(eval $(call rules-cmake,openxr,32))
|
|
$(eval $(call rules-cmake,openxr,64))
|
|
|
|
|
|
##
|
|
## wineopenxr
|
|
## Note 32-bit is not supported by SteamVR, so we don't build it.
|
|
##
|
|
|
|
WINEOPENXR_LDFLAGS = -lopenxr_loader
|
|
WINEOPENXR_DEPENDS = wine openxr
|
|
|
|
$(eval $(call rules-source,wineopenxr,$(SRCDIR)/wineopenxr))
|
|
$(eval $(call rules-makedep,wineopenxr,64))
|
|
|
|
DIST_WINEOPENXR_JSON64 := $(DIST_PREFIX)/drive_c/openxr/wineopenxr64.json
|
|
$(WINEOPENXR_SRC)/wineopenxr64.json: wineopenxr
|
|
$(DIST_WINEOPENXR_JSON64): $(WINEOPENXR_SRC)/wineopenxr64.json default_pfx
|
|
mkdir -p $(dir $@)
|
|
cp -a $< $@
|
|
|
|
all-dist: $(DIST_WINEOPENXR_JSON64)
|
|
|
|
|
|
##
|
|
## steam.exe
|
|
##
|
|
|
|
STEAMEXE_CPPFLAGS = \
|
|
-I$(SRC)/lsteamclient/steamworks_sdk_142/ \
|
|
-I$(SRC)/openvr/headers/ \
|
|
|
|
STEAMEXE_LDFLAGS = \
|
|
-L$(SRC)/steam_helper/32/ \
|
|
-L$(SRC)/steam_helper/64/ \
|
|
-lsteam_api
|
|
|
|
STEAMEXE_DEPENDS = wine
|
|
|
|
$(eval $(call rules-source,steamexe,$(SRCDIR)/steam_helper))
|
|
$(eval $(call rules-makedep,steamexe,64))
|
|
$(eval $(call rules-makedep,steamexe,32))
|
|
|
|
$(OBJ)/.steamexe-post-build32:
|
|
cp $(SRC)/steam_helper/32/libsteam_api.so $(DST_LIBDIR32)/
|
|
touch $@
|
|
|
|
$(OBJ)/.steamexe-post-build64:
|
|
cp $(SRC)/steam_helper/64/libsteam_api.so $(DST_LIBDIR64)/
|
|
touch $@
|
|
|
|
|
|
##
|
|
## wine
|
|
##
|
|
|
|
WINE_SOURCE_ARGS = \
|
|
--exclude configure \
|
|
--exclude autom4te.cache \
|
|
--exclude include/config.h.in \
|
|
--exclude include/config.h.ink \
|
|
--exclude include/wine/vulkan.h \
|
|
--exclude include/wine/vulkan_driver.h \
|
|
--exclude dlls/vulkan-1/vulkan-1.spec \
|
|
--exclude dlls/winevulkan/loader_thunks.c \
|
|
--exclude dlls/winevulkan/loader_thunks.h \
|
|
--exclude dlls/winevulkan/vulkan_thunks.c \
|
|
--exclude dlls/winevulkan/vulkan_thunks.h \
|
|
--exclude dlls/winevulkan/winevulkan.json \
|
|
--exclude dlls/winevulkan/winevulkan.spec
|
|
|
|
WINE_CONFIGURE_ARGS = \
|
|
--enable-werror \
|
|
--with-mingw \
|
|
--disable-tests
|
|
|
|
WINE_CONFIGURE_ARGS32 = \
|
|
VKD3D_PE_CFLAGS="-I$(VULKAN_HEADERS_DST32)/include -I$(VKD3D_DST32)/include/vkd3d" \
|
|
VKD3D_PE_LIBS="-L$(VKD3D_DST32)/bin -l:libvkd3d-1.dll -l:libvkd3d-shader-1.dll"
|
|
|
|
WINE_CONFIGURE_ARGS64 = --enable-win64 \
|
|
VKD3D_PE_CFLAGS="-I$(VULKAN_HEADERS_DST64)/include -I$(VKD3D_DST64)/include/vkd3d" \
|
|
VKD3D_PE_LIBS="-L$(VKD3D_DST64)/bin -l:libvkd3d-1.dll -l:libvkd3d-shader-1.dll"
|
|
|
|
WINE_DEPENDS = gst_orc gstreamer gst_base vkd3d
|
|
|
|
$(eval $(call rules-source,wine,$(SRCDIR)/wine))
|
|
$(eval $(call rules-autoconf,wine,32))
|
|
$(eval $(call rules-autoconf,wine,64))
|
|
|
|
$(OBJ)/.wine-post-source:
|
|
-cd $(WINE_SRC) && tools/make_specfiles
|
|
cd $(WINE_SRC) && tools/make_requests
|
|
cd $(WINE_SRC) && dlls/winevulkan/make_vulkan -x vk.xml
|
|
touch $@
|
|
|
|
$(OBJ)/.wine-post-build64:
|
|
mkdir -p $(DST_DIR)/{bin,share}
|
|
$(call install-strip,$(WINE_DST64)/bin/wine64,$(DST_DIR)/bin)
|
|
$(call install-strip,$(WINE_DST64)/bin/wine64-preloader,$(DST_DIR)/bin)
|
|
$(call install-strip,$(WINE_DST64)/bin/wineserver,$(DST_DIR)/bin)
|
|
cp -a $(WINE_DST64)/share/wine $(DST_DIR)/share
|
|
cp -a $(WINE_DST64)/bin/msidb $(DST_DIR)/bin
|
|
touch $@
|
|
|
|
$(OBJ)/.wine-post-build32:
|
|
mkdir -p $(DST_DIR)/bin
|
|
$(call install-strip,$(WINE_DST32)/bin/wine,$(DST_DIR)/bin)
|
|
$(call install-strip,$(WINE_DST32)/bin/wine-preloader,$(DST_DIR)/bin)
|
|
touch $@
|
|
|
|
|
|
##
|
|
## vrclient
|
|
##
|
|
|
|
VRCLIENT_LDFLAGS = -static-libgcc -static-libstdc++
|
|
VRCLIENT_DEPENDS = vulkan-headers wine
|
|
|
|
$(eval $(call rules-source,vrclient,$(SRCDIR)/vrclient_x64))
|
|
$(eval $(call rules-makedep,vrclient,32))
|
|
$(eval $(call rules-makedep,vrclient,64))
|
|
|
|
|
|
##
|
|
## dxvk
|
|
##
|
|
|
|
DXVK_MESON_ARGS32 = --bindir=$(DXVK_DST32)/lib/wine/dxvk
|
|
DXVK_MESON_ARGS64 = --bindir=$(DXVK_DST64)/lib64/wine/dxvk
|
|
DXVK_DEPENDS = glslang
|
|
|
|
$(eval $(call rules-source,dxvk,$(SRCDIR)/dxvk))
|
|
$(eval $(call rules-meson,dxvk,32,CROSS))
|
|
$(eval $(call rules-meson,dxvk,64,CROSS))
|
|
|
|
$(OBJ)/.dxvk-post-source:
|
|
sed -re 's#@VCS_TAG@#$(shell git -C $(SRCDIR)/dxvk describe --always --abbrev=15 --dirty=0)#' \
|
|
$(SRCDIR)/dxvk/version.h.in > $(DXVK_SRC)/version.h.in
|
|
touch $@
|
|
|
|
$(OBJ)/.dxvk-post-build64:
|
|
mkdir -p "$(DST_DIR)"/lib64/wine/dxvk
|
|
rm -f "$(DST_DIR)"/lib64/wine/dxvk/version && if test -e $(SRCDIR)/.git; then ( cd $(SRCDIR) && git submodule status -- dxvk ) > "$(DST_DIR)"/lib64/wine/dxvk/version; fi
|
|
touch $@
|
|
|
|
$(OBJ)/.dxvk-post-build32:
|
|
mkdir -p "$(DST_DIR)"/lib/wine/dxvk
|
|
rm -f "$(DST_DIR)"/lib/wine/dxvk/version && if test -e $(SRCDIR)/.git; then ( cd $(SRCDIR) && git submodule status -- dxvk ) > "$(DST_DIR)"/lib/wine/dxvk/version; fi
|
|
touch $@
|
|
|
|
|
|
##
|
|
## dxvk-nvapi
|
|
##
|
|
|
|
DXVK_NVAPI_MESON_ARGS32 = --bindir=$(DXVK_NVAPI_DST32)/lib/wine/nvapi
|
|
DXVK_NVAPI_MESON_ARGS64 = --bindir=$(DXVK_NVAPI_DST64)/lib64/wine/nvapi
|
|
|
|
$(eval $(call rules-source,dxvk-nvapi,$(SRCDIR)/dxvk-nvapi))
|
|
$(eval $(call rules-meson,dxvk-nvapi,32,CROSS))
|
|
$(eval $(call rules-meson,dxvk-nvapi,64,CROSS))
|
|
|
|
$(OBJ)/.dxvk-nvapi-post-build64:
|
|
mkdir -p "$(DST_DIR)"/lib64/wine/nvapi
|
|
rm -f "$(DST_DIR)"/lib64/wine/nvapi/version && if test -e $(SRCDIR)/.git; then ( cd $(SRCDIR) && git submodule status -- dxvk-nvapi ) > "$(DST_DIR)"/lib64/wine/nvapi/version; fi
|
|
touch $@
|
|
|
|
$(OBJ)/.dxvk-nvapi-post-build32:
|
|
mkdir -p "$(DST_DIR)"/lib/wine/nvapi
|
|
rm -f "$(DST_DIR)"/lib/wine/nvapi/version && if test -e $(SRCDIR)/.git; then ( cd $(SRCDIR) && git submodule status -- dxvk-nvapi ) > "$(DST_DIR)"/lib/wine/nvapi/version; fi
|
|
touch $@
|
|
|
|
|
|
##
|
|
## vkd3d
|
|
##
|
|
|
|
VKD3D_SOURCE_ARGS = \
|
|
--exclude aclocal.m4 \
|
|
--exclude autom4te.cache \
|
|
--exclude bin/ \
|
|
--exclude configure \
|
|
--exclude include/config.h.in \
|
|
--exclude Makefile.in \
|
|
--exclude m4/libtool.m4 \
|
|
--exclude m4/ltoptions.m4 \
|
|
--exclude m4/ltsugar.m4 \
|
|
--exclude m4/ltversion.m4 \
|
|
--exclude m4/lt~obsolete.m4 \
|
|
|
|
VKD3D_CONFIGURE_ARGS = \
|
|
--enable-silent-rules \
|
|
--disable-doxygen-doc \
|
|
--disable-tests \
|
|
--disable-demos \
|
|
--without-ncurses \
|
|
|
|
VKD3D_LDFLAGS = -static-libgcc $(CROSSLDFLAGS)
|
|
VKD3D_DEPENDS = vulkan-loader vulkan-headers spirv-headers
|
|
|
|
$(eval $(call rules-source,vkd3d,$(SRCDIR)/vkd3d))
|
|
$(eval $(call rules-autoconf,vkd3d,32,CROSS))
|
|
$(eval $(call rules-autoconf,vkd3d,64,CROSS))
|
|
|
|
$(OBJ)/.vkd3d-post-build64:
|
|
mkdir -p $(DST_DIR)/lib64/vkd3d/
|
|
$(call install-strip,$(VKD3D_DST64)/bin/libvkd3d-1.dll,$(DST_LIBDIR64)/vkd3d)
|
|
$(call install-strip,$(VKD3D_DST64)/bin/libvkd3d-shader-1.dll,$(DST_LIBDIR64)/vkd3d)
|
|
touch $@
|
|
|
|
$(OBJ)/.vkd3d-post-build32:
|
|
mkdir -p $(DST_DIR)/lib/vkd3d/
|
|
$(call install-strip,$(VKD3D_DST32)/bin/libvkd3d-1.dll,$(DST_LIBDIR32)/vkd3d)
|
|
$(call install-strip,$(VKD3D_DST32)/bin/libvkd3d-shader-1.dll,$(DST_LIBDIR32)/vkd3d)
|
|
touch $@
|
|
|
|
##
|
|
## vkd3d-proton
|
|
##
|
|
|
|
VKD3D_PROTON_SOURCE_ARGS = \
|
|
--exclude vkd3d_build.h.in \
|
|
--exclude vkd3d_version.h.in \
|
|
|
|
VKD3D_PROTON_MESON_ARGS32 = --bindir=$(VKD3D_PROTON_DST32)/lib/wine/vkd3d-proton
|
|
VKD3D_PROTON_MESON_ARGS64 = --bindir=$(VKD3D_PROTON_DST64)/lib64/wine/vkd3d-proton
|
|
VKD3D_PROTON_DEPENDS = glslang
|
|
|
|
ifneq ($(UNSTRIPPED_BUILD),)
|
|
VKD3D_PROTON_MESON_ARGS = -Denable_trace=true
|
|
endif
|
|
|
|
$(eval $(call rules-source,vkd3d-proton,$(SRCDIR)/vkd3d-proton))
|
|
$(eval $(call rules-meson,vkd3d-proton,32,CROSS))
|
|
$(eval $(call rules-meson,vkd3d-proton,64,CROSS))
|
|
|
|
$(OBJ)/.vkd3d-proton-post-source:
|
|
sed -re 's#@VCS_TAG@#$(shell git -C $(SRCDIR)/vkd3d-proton describe --always --exclude=* --abbrev=15 --dirty=0)#' \
|
|
$(SRCDIR)/vkd3d-proton/vkd3d_build.h.in > $(VKD3D_PROTON_SRC)/vkd3d_build.h.in
|
|
sed -re 's#@VCS_TAG@#$(shell git -C $(SRCDIR)/vkd3d-proton describe --always --tags --dirty=+)#' \
|
|
$(SRCDIR)/vkd3d-proton/vkd3d_version.h.in > $(VKD3D_PROTON_SRC)/vkd3d_version.h.in
|
|
touch $@
|
|
|
|
$(OBJ)/.vkd3d-proton-post-build32:
|
|
mkdir -p "$(DST_DIR)"/lib/wine/vkd3d-proton
|
|
rm -f "$(DST_DIR)"/lib/wine/vkd3d-proton/version && if test -e $(SRCDIR)/.git; then ( cd $(SRCDIR) && git submodule status -- vkd3d-proton ) > "$(DST_DIR)"/lib/wine/vkd3d-proton/version; fi
|
|
touch $@
|
|
|
|
$(OBJ)/.vkd3d-proton-post-build64:
|
|
mkdir -p "$(DST_DIR)"/lib64/wine/vkd3d-proton
|
|
rm -f "$(DST_DIR)"/lib64/wine/vkd3d-proton/version && if test -e $(SRCDIR)/.git; then ( cd $(SRCDIR) && git submodule status -- vkd3d-proton ) > "$(DST_DIR)"/lib64/wine/vkd3d-proton/version; fi
|
|
touch $@
|
|
|
|
|
|
|
|
##
|
|
## mediaconv
|
|
##
|
|
|
|
MEDIACONV_DEPENDS = gst_orc gstreamer gst_base
|
|
|
|
$(eval $(call rules-source,mediaconv,$(SRCDIR)/media-converter))
|
|
$(eval $(call rules-cargo,mediaconv,32))
|
|
$(eval $(call rules-cargo,mediaconv,64))
|
|
|
|
$(OBJ)/.mediaconv-post-build64:
|
|
mkdir -p $(MEDIACONV_DST64)/lib64/gstreamer-1.0/
|
|
cp -a $(MEDIACONV_OBJ64)/x86_64-unknown-linux-gnu/release/libprotonmediaconverter.so $(MEDIACONV_DST64)/lib64/gstreamer-1.0/
|
|
touch $@
|
|
|
|
$(OBJ)/.mediaconv-post-build32:
|
|
mkdir -p $(MEDIACONV_DST32)/lib/gstreamer-1.0/
|
|
cp -a $(MEDIACONV_OBJ32)/i686-unknown-linux-gnu/release/libprotonmediaconverter.so $(MEDIACONV_DST32)/lib/gstreamer-1.0/
|
|
touch $@
|
|
|
|
|
|
##
|
|
## BattlEye Bridge
|
|
##
|
|
|
|
ifneq ($(wildcard $(SRCDIR)/battleye-bridge/.*),)
|
|
|
|
BATTLEYE_LDFLAGS = -static-libgcc -static-libstdc++ -ldl
|
|
|
|
BATTLEYE_DEPENDS = wine
|
|
|
|
$(eval $(call rules-source,battleye,$(SRCDIR)/battleye-bridge))
|
|
$(eval $(call rules-winemaker,battleye,32,beclient.dll))
|
|
$(eval $(call rules-winemaker,battleye,64,beclient_x64.dll))
|
|
|
|
$(OBJ)/.battleye-post-source:
|
|
mkdir -p $(BATTLEYE_OBJ32) && cp -a $(BATTLEYE_SRC)/beclient.spec $(BATTLEYE_OBJ32)/beclient.spec
|
|
mkdir -p $(BATTLEYE_OBJ64) && cp -a $(BATTLEYE_SRC)/beclient.spec $(BATTLEYE_OBJ64)/beclient_x64.spec
|
|
touch $@
|
|
|
|
$(OBJ)/.battleye-post-build64:
|
|
mkdir -p $(OBJ)/dist-battleye/v1
|
|
cp -r $(BATTLEYE_DST64)/* $(OBJ)/dist-battleye/v1/
|
|
rm -rf $(BATTLEYE_DST64)/*
|
|
touch $@
|
|
|
|
$(OBJ)/.battleye-post-build32:
|
|
mkdir -p $(OBJ)/dist-battleye/v1
|
|
cp -r $(BATTLEYE_DST32)/* $(OBJ)/dist-battleye/v1/
|
|
rm -rf $(BATTLEYE_DST32)/*
|
|
touch $@
|
|
|
|
endif
|
|
|
|
##
|
|
## EasyAntiCheat Bridge
|
|
##
|
|
|
|
ifneq ($(wildcard $(SRCDIR)/eac-bridge/.*),)
|
|
|
|
EAC_DEPENDS = wine
|
|
|
|
$(eval $(call rules-source,eac,$(SRCDIR)/eac-bridge))
|
|
$(eval $(call create-rules-common,eac,EAC,64))
|
|
$(eval $(call create-rules-common,eac,EAC,32))
|
|
|
|
|
|
$(OBJ)/.eac-build64:
|
|
@echo ":: building 64bit eac..." >&2
|
|
rsync -arx "$(EAC_SRC)/" "$(EAC_OBJ64)/"
|
|
env $(EAC_ENV64) \
|
|
$(MAKE) -C "$(EAC_OBJ64)" WINE_OBJ="$(WINE_OBJ64)" HOST="x86_64-w64-mingw32" CROSSCXX="x86_64-w64-mingw32-g++" BIT="64"
|
|
mkdir -p $(OBJ)/dist-eac/v2/lib64
|
|
$(call install-strip,$(EAC_OBJ64)/easyanticheat.so,$(OBJ)/dist-eac/v2/lib64)
|
|
$(call install-strip,$(EAC_OBJ64)/easyanticheat.dll,$(OBJ)/dist-eac/v2/lib64)
|
|
cp $(OBJ)/dist-eac/v2/lib64/easyanticheat.so $(OBJ)/dist-eac/v2/lib64/easyanticheat_x64.so
|
|
cp $(OBJ)/dist-eac/v2/lib64/easyanticheat.dll $(OBJ)/dist-eac/v2/lib64/easyanticheat_x64.dll
|
|
touch $@
|
|
|
|
$(OBJ)/.eac-build32:
|
|
@echo ":: building 32bit eac..." >&2
|
|
rsync -arx "$(EAC_SRC)/" "$(EAC_OBJ32)/"
|
|
env $(EAC_ENV32) \
|
|
$(MAKE) -C "$(EAC_OBJ32)" WINE_OBJ="$(WINE_OBJ32)" HOST="i686-w64-mingw32" CROSSCXX="i686-w64-mingw32-g++" BIT="32"
|
|
mkdir -p $(OBJ)/dist-eac/v2/lib32
|
|
$(call install-strip,$(EAC_OBJ32)/easyanticheat.so,$(OBJ)/dist-eac/v2/lib32)
|
|
$(call install-strip,$(EAC_OBJ32)/easyanticheat.dll,$(OBJ)/dist-eac/v2/lib32)
|
|
mv $(OBJ)/dist-eac/v2/lib32/easyanticheat.so $(OBJ)/dist-eac/v2/lib32/easyanticheat_x86.so
|
|
mv $(OBJ)/dist-eac/v2/lib32/easyanticheat.dll $(OBJ)/dist-eac/v2/lib32/easyanticheat_x86.dll
|
|
touch $@
|
|
|
|
endif
|
|
|
|
# HACK: we need to order those builds so that timestamps are different between
|
|
# 32 and 64 bit versions of the dlls. Otherwise there's a significant chance for
|
|
# conflict when creating symbol storage. We also have to make sure that projects
|
|
# which build alternative versions of the DLLs do not share the same timestamps.
|
|
#
|
|
# This is a temporary solution that only lowers the chance of conflicts.
|
|
# Binutils 2.42 (not released yet at the time of writing this) will introduce
|
|
# support for SOURCE_DATE_EPOCH which we should use instead.
|
|
$(OBJ)/.wine-build64: $(OBJ)/.wine-build32
|
|
$(OBJ)/.vkd3d-proton-build32: $(OBJ)/.wine-build64
|
|
$(OBJ)/.vkd3d-proton-build64: $(OBJ)/.vkd3d-proton-build32
|
|
$(OBJ)/.dxvk-build32: $(OBJ)/.wine-build64
|
|
$(OBJ)/.dxvk-build64: $(OBJ)/.dxvk-build32
|
|
$(OBJ)/.dxvk-lsteamclient64: $(OBJ)/.dxvk-lsteamclient32
|
|
$(OBJ)/.vkd3d-build64: $(OBJ)/.vkd3d-build32
|
|
# nvapi and vrclient dlls have distinct names for 64 bit versions
|
|
|
|
##
|
|
## Windows Symbol Store creation
|
|
##
|
|
|
|
SYMSTORE_DEPENDS = wine
|
|
|
|
$(eval $(call rules-source,symstore,$(SRCDIR)/symstore))
|
|
$(eval $(call create-rules-common,symstore,SYMSTORE,64))
|
|
|
|
$(OBJ)/.symstore-build64:
|
|
@echo ":: building symstore helper..." >&2
|
|
rsync -arx "$(SYMSTORE_SRC)/" "$(SYMSTORE_OBJ64)/"
|
|
$(MAKE) -C "$(SYMSTORE_OBJ64)" SYMSTORE_CFLAGS="-I$(WINE_SRC)/include -I$(WINE_OBJ64)/include"
|
|
touch $@
|
|
|
|
.PHONY: symstore-tarball
|
|
symstore-tarball:
|
|
mkdir -p $(OBJ)/symstore/$(BUILD_NAME)
|
|
$(SYMSTORE_OBJ64)/symstore --skip-managed $(DST_BASE) $(OBJ)/symstore/$(BUILD_NAME)
|
|
cd $(OBJ)/symstore/$(BUILD_NAME) && zip -r ../$(BUILD_NAME)-symstore.zip . >& /dev/null
|
|
|
|
##
|
|
## Fonts
|
|
##
|
|
|
|
.PHONY: fonts
|
|
|
|
FONTS := $(SRCDIR)/fonts
|
|
FONTS_OBJ := ./obj-fonts
|
|
ALT_FONTS_OBJ := $(FONTS_OBJ)/alt
|
|
|
|
FONTFORGE = fontforge -quiet
|
|
FONTSCRIPT = $(FONTS)/scripts/generatefont.pe
|
|
MERGEFONTSSCRIPT = $(FONTS)/scripts/mergefonts.pe
|
|
|
|
LIBERATION_SRCDIR = $(FONTS)/liberation-fonts/src
|
|
SOURCE_HAN_SANS_SRCDIR = $(FONTS)/source-han-sans
|
|
UME_DIR = $(FONTS)/ume
|
|
|
|
msyh.ttf_CIDFONT = $(SOURCE_HAN_SANS_SRCDIR)/cidfont.ps.OTC.SC
|
|
msyh.ttf_FEATURES = $(SOURCE_HAN_SANS_SRCDIR)/features.OTC.SC
|
|
msyh.ttf_SEQUENCES = $(SOURCE_HAN_SANS_SRCDIR)/SourceHanSans_CN_sequences.txt
|
|
msyh.ttf_UNISOURCE = $(SOURCE_HAN_SANS_SRCDIR)/UniSourceHanSansCN-UTF32-H
|
|
msyh.ttf_MENUNAMEDB = $(FONTS)/patches/YaHei-FontMenuNameDB
|
|
msyh.ttf = $(FONTS_OBJ)/source-han/msyh.ttf
|
|
|
|
simsun.ttf_CIDFONT = $(SOURCE_HAN_SANS_SRCDIR)/cidfont.ps.OTC.SC
|
|
simsun.ttf_FEATURES = $(SOURCE_HAN_SANS_SRCDIR)/features.OTC.SC
|
|
simsun.ttf_SEQUENCES = $(SOURCE_HAN_SANS_SRCDIR)/SourceHanSans_CN_sequences.txt
|
|
simsun.ttf_UNISOURCE = $(SOURCE_HAN_SANS_SRCDIR)/UniSourceHanSansCN-UTF32-H
|
|
simsun.ttf_MENUNAMEDB = $(FONTS)/patches/SimSun-FontMenuNameDB
|
|
simsun.ttf = $(FONTS_OBJ)/source-han/simsun.ttf
|
|
|
|
nsimsun.ttf_CIDFONT = $(SOURCE_HAN_SANS_SRCDIR)/cidfont.ps.OTC.SC
|
|
nsimsun.ttf_FEATURES = $(SOURCE_HAN_SANS_SRCDIR)/features.OTC.SC
|
|
nsimsun.ttf_SEQUENCES = $(SOURCE_HAN_SANS_SRCDIR)/SourceHanSans_CN_sequences.txt
|
|
nsimsun.ttf_UNISOURCE = $(SOURCE_HAN_SANS_SRCDIR)/UniSourceHanSansCN-UTF32-H
|
|
nsimsun.ttf_MENUNAMEDB = $(FONTS)/patches/NSimSun-FontMenuNameDB
|
|
nsimsun.ttf = $(FONTS_OBJ)/source-han/nsimsun.ttf
|
|
|
|
msgothic.ttf_FONT = $(UME_DIR)/ume-tgo4.ttf
|
|
msgothic.ttf_NAMETABLE_PATCH = $(FONTS)/patches/UmeGothic-nametable.patch
|
|
msgothic.ttf = $(FONTS_OBJ)/ume-gothic/msgothic.ttf
|
|
|
|
mspgothic.ttf_FONT = $(UME_DIR)/ume-pgo4.ttf
|
|
mspgothic.ttf_NAMETABLE_PATCH = $(FONTS)/patches/UmePGothic-nametable.patch
|
|
mspgothic.ttf = $(FONTS_OBJ)/ume-gothic/mspgothic.ttf
|
|
|
|
msuigothic.ttf_FONT = $(UME_DIR)/ume-ugo4.ttf
|
|
msuigothic.ttf_NAMETABLE_PATCH = $(FONTS)/patches/UmeUIGothic-nametable.patch
|
|
msuigothic.ttf = $(FONTS_OBJ)/ume-gothic/msuigothic.ttf
|
|
|
|
malgun.ttf_CIDFONT = $(SOURCE_HAN_SANS_SRCDIR)/cidfont.ps.OTC.K
|
|
malgun.ttf_FEATURES = $(SOURCE_HAN_SANS_SRCDIR)/features.OTC.K
|
|
malgun.ttf_SEQUENCES = $(SOURCE_HAN_SANS_SRCDIR)/SourceHanSans_KR_sequences.txt
|
|
malgun.ttf_UNISOURCE = $(SOURCE_HAN_SANS_SRCDIR)/UniSourceHanSansKR-UTF32-H
|
|
malgun.ttf_MENUNAMEDB = $(FONTS)/patches/Malgun-FontMenuNameDB
|
|
malgun.ttf = $(FONTS_OBJ)/source-han/malgun.ttf
|
|
|
|
simsun.ttc = $(FONTS_OBJ)/source-han/simsun.ttc
|
|
msgothic.ttc = $(FONTS_OBJ)/ume-gothic/msgothic.ttc
|
|
|
|
noto_sans.ttf = $(FONTS)/noto/NotoSans-Regular.ttf
|
|
noto_sans_arabic.ttf = $(FONTS)/noto/NotoSansArabic-Regular.ttf
|
|
noto_sans_armenian.ttf = $(FONTS)/noto/NotoSansArmenian-Regular.ttf
|
|
noto_sans_bengali.ttf = $(FONTS)/noto/NotoSansBengali-Regular.ttf
|
|
noto_sans_bengaliui.ttf = $(FONTS)/noto/NotoSansBengaliUI-Regular.ttf
|
|
noto_sans_chakma.ttf = $(FONTS)/noto/NotoSansChakma-Regular.ttf
|
|
noto_sans_coptic.ttf = $(FONTS)/noto/NotoSansCoptic-Regular.ttf
|
|
noto_sans_devanagariui.ttf = $(FONTS)/noto/NotoSansDevanagariUI-Regular.ttf
|
|
noto_sans_georgian.ttf = $(FONTS)/noto/NotoSansGeorgian-Regular.ttf
|
|
noto_sans_gujarati.ttf = $(FONTS)/noto/NotoSansGujarati-Regular.ttf
|
|
noto_sans_gujaratiui.ttf = $(FONTS)/noto/NotoSansGujaratiUI-Regular.ttf
|
|
noto_sans_gurmukhiui.ttf = $(FONTS)/noto/NotoSansGurmukhiUI-Regular.ttf
|
|
noto_sans_hebrew.ttf = $(FONTS)/noto/NotoSansHebrew-Regular.ttf
|
|
noto_sans_kannadaui.ttf = $(FONTS)/noto/NotoSansKannadaUI-Regular.ttf
|
|
noto_sans_khmer.ttf = $(FONTS)/noto/NotoSansKhmer-Regular.ttf
|
|
noto_sans_malayalamui.ttf = $(FONTS)/noto/NotoSansMalayalamUI-Regular.ttf
|
|
noto_sans_math.ttf = $(FONTS)/noto/NotoSansMath-Regular.ttf
|
|
noto_sans_meeteimayek.ttf = $(FONTS)/noto/NotoSansMeeteiMayek-Regular.ttf
|
|
noto_sans_mono.ttf = $(FONTS)/noto/NotoSansMono-Regular.ttf
|
|
noto_sans_olchiki.ttf = $(FONTS)/noto/NotoSansOlChiki-Regular.ttf
|
|
noto_sans_oriyaui.ttf = $(FONTS)/noto/NotoSansOriyaUI-Regular.ttf
|
|
noto_sans_sinhalaui.ttf = $(FONTS)/noto/NotoSansSinhalaUI-Regular.ttf
|
|
noto_sans_sorasompeng.ttf = $(FONTS)/noto/NotoSansSoraSompeng-Regular.ttf
|
|
noto_sans_symbols.ttf = $(FONTS)/noto/NotoSansSymbols-Regular.ttf
|
|
noto_sans_symbols2.ttf = $(FONTS)/noto/NotoSansSymbols2-Regular.ttf
|
|
noto_sans_tamil.ttf = $(FONTS)/noto/NotoSansTamil-Regular.ttf
|
|
noto_sans_tamilui.ttf = $(FONTS)/noto/NotoSansTamilUI-Regular.ttf
|
|
noto_sans_teluguui.ttf = $(FONTS)/noto/NotoSansTeluguUI-Regular.ttf
|
|
noto_sans_thaana.ttf = $(FONTS)/noto/NotoSansThaana-Regular.ttf
|
|
noto_sans_thai.ttf = $(FONTS)/noto/NotoSansThai-Regular.ttf
|
|
# Unfortunately Tibetan only exists as Serif
|
|
noto_serif_tibetan.ttf = $(FONTS)/noto/NotoSerifTibetan-Regular.ttf
|
|
|
|
micross.ttf = $(FONTS_OBJ)/micross.ttf
|
|
nirmala.ttf = $(FONTS_OBJ)/nirmala.ttf
|
|
alt_arial.ttf = $(ALT_FONTS_OBJ)/arial.ttf
|
|
|
|
#The use of "Arial" here is for compatibility with programs that require that exact string. This font is not Arial.
|
|
arial_NAMES := "Arial" "Arial" "Arial"
|
|
arial_ORIG := LiberationSans-Regular
|
|
#The use of "Arial" here is for compatibility with programs that require that exact string. This font is not Arial.
|
|
arialbd_NAMES := "Arial-Bold" "Arial" "Arial Bold"
|
|
arialbd_ORIG := LiberationSans-Bold
|
|
#The use of "Times New Roman" here is for compatibility with programs that require that exact string. This font is not Times New Roman.
|
|
times_NAMES := "TimesNewRoman" "Times New Roman" "Times New Roman"
|
|
times_ORIG := LiberationSerif-Regular
|
|
#The use of "Georgia" here is for compatibility with programs that require that exact string. This font is not Georgia.
|
|
georgia_NAMES := "Georgia" "Georgia" "Georgia"
|
|
georgia_ORIG := LiberationSerif-Regular
|
|
#The use of "Courier New" here is for compatibility with programs that require that exact string. This font is not Courier New.
|
|
cour_NAMES := "CourierNew" "Courier New" "Courier New"
|
|
cour_PATCH := $(FONTS)/patches/LiberationMono-Regular.patch
|
|
cour_ORIG := LiberationMono-Regular
|
|
#The use of "Courier New" here is for compatibility with programs that require that exact string. This font is not Courier New.
|
|
courbd_NAMES := "CourierNewPS-BoldMT" "Courier New" "Courier New Bold"
|
|
courbd_ORIG := LiberationMono-Bold
|
|
|
|
$(FONTS_OBJ):
|
|
mkdir -p $@
|
|
|
|
$(ALT_FONTS_OBJ):
|
|
mkdir -p $@
|
|
|
|
$(FONTS_OBJ)/%.ttf: $(FONTS_OBJ)/$$($$(*)_ORIG).sfd $(FONTSCRIPT) | $(FONTS_OBJ)
|
|
$(FONTFORGE) -script $(FONTSCRIPT) $< $($(*)_NAMES) $@
|
|
|
|
$(FONTS_OBJ)/%.sfd: $(LIBERATION_SRCDIR)/%.sfd | $(FONTS_OBJ)
|
|
patch $< -o $@ $(firstword $($(*)_PATCH) /dev/null)
|
|
|
|
fonts: $(FONTS_OBJ)/arial.ttf
|
|
fonts: $(FONTS_OBJ)/arialbd.ttf
|
|
fonts: $(FONTS_OBJ)/georgia.ttf
|
|
fonts: $(FONTS_OBJ)/times.ttf
|
|
fonts: $(FONTS_OBJ)/cour.ttf
|
|
fonts: $(FONTS_OBJ)/courbd.ttf
|
|
|
|
#The use of "YaHei" for compatibility with programs that require that exact string. This font is not Microsoft YaHei.
|
|
$(FONTS_OBJ)/source-han/%.ttf: $$(%.ttf_CIDFONT) $$(%.ttf_FEATURES) $$(%.ttf_SEQUENCES) $$(%.ttf_UNISOURCE) $$(%.ttf_MENUNAMEDB)
|
|
mkdir -p $(FONTS_OBJ)/source-han
|
|
# Do not immediately create the target file, so that make is interrupted
|
|
# it will restart again
|
|
afdko makeotfexe -f $($(notdir $@)_CIDFONT) -omitMacNames -ff $($(notdir $@)_FEATURES) \
|
|
-lic ADOBE -mf $($(notdir $@)_MENUNAMEDB) -r -nS -cs 25 -ch $($(notdir $@)_UNISOURCE) \
|
|
-ci $($(notdir $@)_SEQUENCES) -o $@.tmp
|
|
afdko tx -cff +S -no_futile $($(notdir $@)_CIDFONT) $@.cff
|
|
# sftnedit uses a hardcoded temporary file in the local directory, so we have
|
|
# to run it in a dedicated temporary directory to prevent concurrent instances
|
|
# to step onto each other's feet
|
|
(TEMP_DIR=`mktemp -d` && cd $$TEMP_DIR && afdko sfntedit -a CFF=$(abspath $($(notdir $@)).cff) $(abspath $@.tmp) && rm -fr $$TEMP_DIR)
|
|
mv $@.tmp $@
|
|
|
|
$(FONTS_OBJ)/ume-gothic/%.ttf: $$(%.ttf_FONT) $$(%.ttf_NAMETABLE_PATCH)
|
|
mkdir -p $(FONTS_OBJ)/ume-gothic
|
|
ttx -o $(FONTS_OBJ)/ume-gothic/$(notdir $(basename $($(notdir $@)_NAMETABLE_PATCH))).ttx -t name $($(notdir $@)_FONT)
|
|
patch $(FONTS_OBJ)/ume-gothic/$(notdir $(basename $($(notdir $@)_NAMETABLE_PATCH))).ttx $($(notdir $@)_NAMETABLE_PATCH)
|
|
ttx -o $@ -m $($(notdir $@)_FONT) $(FONTS_OBJ)/ume-gothic/$(notdir $(basename $($(notdir $@)_NAMETABLE_PATCH))).ttx
|
|
|
|
$(simsun.ttc): $(simsun.ttf) $(nsimsun.ttf)
|
|
afdko otf2otc -o $@.tmp $^
|
|
afdko otf2ttf -o $@ $@.tmp
|
|
rm $@.tmp
|
|
|
|
$(msgothic.ttc): $(msgothic.ttf) $(mspgothic.ttf) $(msuigothic.ttf)
|
|
afdko otf2otc -o $@ $^
|
|
|
|
$(micross.ttf): $(FONTS)/scripts/merge.py $(noto_sans.ttf) $(noto_sans_arabic.ttf) $(noto_sans_armenian.ttf) $(noto_sans_bengali.ttf) $(noto_sans_coptic.ttf) \
|
|
$(noto_sans_georgian.ttf) $(noto_sans_gujarati.ttf) $(noto_sans_hebrew.ttf) $(noto_sans_khmer.ttf) $(noto_sans_tamil.ttf) \
|
|
$(noto_sans_thaana.ttf) $(noto_sans_thai.ttf) $(noto_sans_math.ttf) $(noto_sans_symbols.ttf) $(noto_sans_mono.ttf)
|
|
$(FONTS)/scripts/merge.py $(noto_sans.ttf) $(noto_sans_arabic.ttf) $(noto_sans_armenian.ttf) $(noto_sans_bengali.ttf) \
|
|
$(noto_sans_coptic.ttf) $(noto_sans_georgian.ttf) $(noto_sans_gujarati.ttf) $(noto_sans_hebrew.ttf) $(noto_sans_khmer.ttf) \
|
|
$(noto_sans_tamil.ttf) $(noto_sans_thaana.ttf) $(noto_sans_thai.ttf) $(noto_sans_math.ttf) $(noto_sans_symbols.ttf) $(noto_sans_mono.ttf) \
|
|
"MicrosoftSansSerif" "Microsoft Sans Serif" "Regular" $(FONTS)/ranges/micross $(micross.ttf)
|
|
|
|
$(nirmala.ttf): $(FONTS)/scripts/merge.py $(noto_sans.ttf) $(noto_sans_chakma.ttf) $(noto_sans_bengaliui.ttf) $(noto_sans_devanagariui.ttf) $(noto_sans_gujaratiui.ttf) $(noto_sans_gurmukhiui.ttf) \
|
|
$(noto_sans_kannadaui.ttf) $(noto_sans_malayalamui.ttf) $(noto_sans_meeteimayek.ttf) $(noto_sans_olchiki.ttf) $(noto_sans_oriyaui.ttf) \
|
|
$(noto_sans_sinhalaui.ttf) $(noto_sans_sorasompeng.ttf) $(noto_sans_tamilui.ttf) $(noto_sans_teluguui.ttf) $(noto_serif_tibetan.ttf) $(noto_sans_math.ttf) \
|
|
$(noto_sans_symbols2.ttf)
|
|
$(FONTS)/scripts/merge.py $(noto_sans.ttf) $(noto_sans_chakma.ttf) $(noto_sans_bengaliui.ttf) $(noto_sans_devanagariui.ttf) $(noto_sans_gujaratiui.ttf) \
|
|
$(noto_sans_gurmukhiui.ttf) $(noto_sans_kannadaui.ttf) $(noto_sans_malayalamui.ttf) $(noto_sans_meeteimayek.ttf) $(noto_sans_olchiki.ttf) \
|
|
$(noto_sans_oriyaui.ttf) $(noto_sans_sinhalaui.ttf) $(noto_sans_sorasompeng.ttf) $(noto_sans_tamilui.ttf) $(noto_sans_teluguui.ttf) \
|
|
$(noto_serif_tibetan.ttf) $(noto_sans_math.ttf) $(noto_sans_symbols2.ttf) "NirmalaUI" "Nirmala UI" "Regular" $(FONTS)/ranges/nirmala $(nirmala.ttf)
|
|
|
|
$(alt_arial.ttf): $(FONTS)/scripts/merge.py $(noto_sans.ttf) $(noto_sans_arabic.ttf) $(noto_sans_hebrew.ttf) $(noto_sans_armenian.ttf) $(noto_sans_coptic.ttf) \
|
|
$(noto_sans_math.ttf) $(noto_sans_symbols.ttf) $(noto_sans_symbols2.ttf) $(noto_sans_mono.ttf) | $(ALT_FONTS_OBJ)
|
|
$(FONTS)/scripts/merge.py $(noto_sans.ttf) $(noto_sans_arabic.ttf) $(noto_sans_hebrew.ttf) $(noto_sans_armenian.ttf) $(noto_sans_coptic.ttf) \
|
|
$(noto_sans_math.ttf) $(noto_sans_symbols.ttf) $(noto_sans_symbols2.ttf) $(noto_sans_mono.ttf) "Arial" "Arial" "Regular" $(FONTS)/ranges/arial $(alt_arial.ttf)
|
|
|
|
fonts: $(msyh.ttf)
|
|
fonts: $(simsun.ttc)
|
|
fonts: $(msgothic.ttc)
|
|
fonts: $(malgun.ttf)
|
|
fonts: $(micross.ttf)
|
|
fonts: $(nirmala.ttf)
|
|
fonts: $(alt_arial.ttf)
|
|
|
|
DIST_FONTS := $(DST_DIR)/share/fonts
|
|
$(DIST_FONTS): fonts
|
|
mkdir -p $@
|
|
cp $(FONTS_OBJ)/*.ttf "$@"
|
|
cp $(FONTS_OBJ)/source-han/msyh.ttf "$@"
|
|
cp $(FONTS_OBJ)/source-han/simsun.ttc "$@"
|
|
cp $(FONTS_OBJ)/ume-gothic/msgothic.ttc "$@"
|
|
cp $(FONTS_OBJ)/source-han/malgun.ttf "$@"
|
|
cp -r $(FONTS_OBJ)/alt "$@"
|
|
|
|
all-dist: $(DIST_FONTS)
|
|
|
|
|
|
##
|
|
## Gecko
|
|
##
|
|
|
|
GECKO_VER := 2.47.4
|
|
GECKO32_TARBALL := wine-gecko-$(GECKO_VER)-x86.tar.xz
|
|
GECKO64_TARBALL := wine-gecko-$(GECKO_VER)-x86_64.tar.xz
|
|
GECKO64_TARBALL_URL := https://dl.winehq.org/wine/wine-gecko/$(GECKO_VER)/$(GECKO64_TARBALL)
|
|
GECKO32_TARBALL_URL := https://dl.winehq.org/wine/wine-gecko/$(GECKO_VER)/$(GECKO32_TARBALL)
|
|
DIST_GECKO_DIR := $(DST_DIR)/share/wine/gecko
|
|
DIST_GECKO32 := $(OBJ)/.gecko-dist32
|
|
DIST_GECKO64 := $(OBJ)/.gecko-dist64
|
|
|
|
$(SRC)/contrib/$(GECKO64_TARBALL):
|
|
mkdir -p $(dir $@)
|
|
wget -O $@ $(GECKO64_TARBALL_URL)
|
|
|
|
$(SRC)/contrib/$(GECKO32_TARBALL):
|
|
mkdir -p $(dir $@)
|
|
wget -O $@ $(GECKO32_TARBALL_URL)
|
|
|
|
$(DIST_GECKO32): $(SRC)/contrib/$(GECKO32_TARBALL)
|
|
mkdir -p $(DIST_GECKO_DIR)
|
|
rm -rf $(DIST_GECKO_DIR)/wine-gecko-$(GECKO_VER)-x86
|
|
tar --no-same-owner -xf $< -C $(DIST_GECKO_DIR)
|
|
touch $@
|
|
|
|
$(DIST_GECKO64): $(SRC)/contrib/$(GECKO64_TARBALL)
|
|
mkdir -p $(DIST_GECKO_DIR)
|
|
rm -rf $(DIST_GECKO_DIR)/wine-gecko-$(GECKO_VER)-x86_64
|
|
tar --no-same-owner -xf $< -C $(DIST_GECKO_DIR)
|
|
touch $@
|
|
|
|
all-dist: $(DIST_GECKO32) $(DIST_GECKO64)
|
|
|
|
|
|
##
|
|
## wine-mono
|
|
##
|
|
|
|
WINEMONO_VER := 8.1.0
|
|
WINEMONO_TARBALL := wine-mono-$(WINEMONO_VER)-x86.tar.xz
|
|
DIST_WINEMONO_DIR := $(DST_DIR)/share/wine/mono
|
|
DIST_WINEMONO := $(OBJ)/.wine-mono-dist
|
|
MONO_TARBALL_URL := https://github.com/madewokherd/wine-mono/releases/download/wine-mono-$(WINEMONO_VER)/$(WINEMONO_TARBALL)
|
|
|
|
$(SRC)/contrib/$(WINEMONO_TARBALL):
|
|
mkdir -p $(dir $@)
|
|
wget -O $@ $(MONO_TARBALL_URL)
|
|
|
|
$(DIST_WINEMONO): $(SRC)/contrib/$(WINEMONO_TARBALL)
|
|
mkdir -p $(DIST_WINEMONO_DIR)
|
|
rm -rf $(DIST_WINEMONO_DIR)/wine-mono-$(WINEMONO_VER)
|
|
tar --no-same-owner -xf $< -C $(DIST_WINEMONO_DIR)
|
|
touch $@
|
|
|
|
all-dist: $(DIST_WINEMONO)
|
|
|
|
|
|
##
|
|
## openvr
|
|
##
|
|
|
|
DIST_OVR32 := $(DST_LIBDIR32)/wine/dxvk/openvr_api_dxvk.dll
|
|
$(DIST_OVR32): $(SRCDIR)/openvr/bin/win32/openvr_api.dll | $(DST_DIR)
|
|
mkdir -p $(DST_LIBDIR32)/wine/dxvk
|
|
cp -a $< $@
|
|
|
|
DIST_OVR64 := $(DST_LIBDIR64)/wine/dxvk/openvr_api_dxvk.dll
|
|
$(DIST_OVR64): $(SRCDIR)/openvr/bin/win64/openvr_api.dll | $(DST_DIR)
|
|
mkdir -p $(DST_LIBDIR64)/wine/dxvk
|
|
cp -a $< $@
|
|
|
|
all-dist: $(DIST_OVR32) $(DIST_OVR64)
|
|
|
|
|
|
##
|
|
## default_pfx
|
|
##
|
|
|
|
default_pfx: wine gst_good gst_libav gst_plugins_rs lsteamclient steamexe vrclient wineopenxr dxvk dxvk-nvapi vkd3d-proton
|
|
find $(DST_LIBDIR32)/wine -type f -execdir chmod a-w '{}' '+'
|
|
find $(DST_LIBDIR64)/wine -type f -execdir chmod a-w '{}' '+'
|
|
rm -rf $(abspath $(DIST_PREFIX))
|
|
python3 $(SRCDIR)/default_pfx.py $(abspath $(DIST_PREFIX)) $(abspath $(DST_DIR))
|
|
|
|
all-dist: default_pfx
|
|
|
|
|
|
##
|
|
## toolmanifest.vdf
|
|
##
|
|
|
|
TOOLMANIFEST_VDF_SRC := toolmanifest_runtime.vdf
|
|
DIST_TOOLMANIFEST := $(addprefix $(DST_BASE)/,toolmanifest.vdf)
|
|
$(DIST_TOOLMANIFEST): $(addprefix $(SRCDIR)/,$(TOOLMANIFEST_VDF_SRC))
|
|
cp -a $< $@
|
|
|
|
all-dist: $(DIST_TOOLMANIFEST)
|
|
|
|
|
|
##
|
|
## compatibilitytool.vdf
|
|
##
|
|
|
|
COMPAT_MANIFEST_TEMPLATE := $(SRCDIR)/compatibilitytool.vdf.template
|
|
DIST_COMPAT_MANIFEST := $(DST_BASE)/compatibilitytool.vdf
|
|
$(DIST_COMPAT_MANIFEST): $(COMPAT_MANIFEST_TEMPLATE) | $(DST_DIR)
|
|
sed -r 's|##BUILD_NAME##|$(BUILD_NAME)|' $< > $@
|
|
|
|
all-dist: $(DIST_COMPAT_MANIFEST)
|
|
|
|
|
|
##
|
|
## licenses / patents
|
|
##
|
|
|
|
LICENSE := $(SRCDIR)/dist.LICENSE
|
|
DIST_LICENSE := $(DST_BASE)/LICENSE
|
|
$(DIST_LICENSE): $(LICENSE)
|
|
cp -a $< $@
|
|
|
|
OFL_LICENSE := $(SRCDIR)/fonts/liberation-fonts/LICENSE
|
|
DIST_OFL_LICENSE := $(DST_BASE)/LICENSE.OFL
|
|
$(DIST_OFL_LICENSE): $(OFL_LICENSE)
|
|
cp -a $< $@
|
|
|
|
AV1_PATENTS := $(SRCDIR)/dav1d/doc/PATENTS
|
|
DIST_AV1_PATENTS := $(DST_BASE)/PATENTS.AV1
|
|
$(DIST_AV1_PATENTS): $(AV1_PATENTS)
|
|
cp -a $< $@
|
|
|
|
all-dist: $(DIST_LICENSE) $(DIST_OFL_LICENSE) $(DIST_AV1_PATENTS)
|
|
|
|
|
|
##
|
|
## proton(.py), filelock.py, etc.
|
|
##
|
|
|
|
FILELOCK_TARGET := $(addprefix $(DST_BASE)/,filelock.py)
|
|
$(FILELOCK_TARGET): $(addprefix $(SRCDIR)/,filelock.py)
|
|
|
|
PROTON_PY_TARGET := $(addprefix $(DST_BASE)/,proton)
|
|
$(PROTON_PY_TARGET): $(addprefix $(SRCDIR)/,proton)
|
|
|
|
PROTON37_TRACKED_FILES_TARGET := $(addprefix $(DST_BASE)/,proton_3.7_tracked_files)
|
|
$(PROTON37_TRACKED_FILES_TARGET): $(addprefix $(SRCDIR)/,proton_3.7_tracked_files)
|
|
|
|
USER_SETTINGS_PY_TARGET := $(addprefix $(DST_BASE)/,user_settings.sample.py)
|
|
$(USER_SETTINGS_PY_TARGET): $(addprefix $(SRCDIR)/,user_settings.sample.py)
|
|
|
|
DIST_COPY_TARGETS := $(FILELOCK_TARGET) $(PROTON_PY_TARGET) \
|
|
$(PROTON37_TRACKED_FILES_TARGET) $(USER_SETTINGS_PY_TARGET)
|
|
|
|
$(DIST_COPY_TARGETS): | $(DST_DIR)
|
|
cp -a $(SRCDIR)/$(notdir $@) $@
|
|
|
|
all-dist: $(DIST_COPY_TARGETS)
|
|
|
|
all-dist:
|
|
echo `date '+%s'` `GIT_DIR=$(abspath $(SRCDIR)/.git) git describe --tags` > $(DIST_VERSION)
|
|
|
|
|
|
##
|
|
## make deploy
|
|
##
|
|
|
|
STEAMPIPE_FIXUPS_PY := $(SRCDIR)/steampipe_fixups.py
|
|
|
|
.PHONY: deploy
|
|
deploy: all
|
|
mkdir -p $(DEPLOY_DIR) && \
|
|
rsync --delete --exclude compatibilitytool.vdf -arx $(DST_BASE)/ $(DEPLOY_DIR)
|
|
cp -a $(STEAMPIPE_FIXUPS_PY) $(DEPLOY_DIR)
|
|
python3 $(STEAMPIPE_FIXUPS_PY) process $(DEPLOY_DIR)
|
|
|
|
|
|
##
|
|
## make redist
|
|
##
|
|
|
|
.PHONY: redist
|
|
redist: all
|
|
mkdir -p $(REDIST_DIR)
|
|
rsync --delete -arx $(DST_BASE)/ $(REDIST_DIR)
|
|
|
|
|
|
##
|
|
## make module=$dllname module[32,64]
|
|
##
|
|
|
|
.PHONY: module32 module64 module
|
|
|
|
module32: | all-source wine-configure32
|
|
+$(BEAR) $(MAKE) -j$(J) $(filter -j%,$(MAKEFLAGS)) $(MFLAGS) $(MAKEOVERRIDES) -C $(WINE_OBJ32)/dlls/$(module)
|
|
|
|
module64: | all-source wine-configure64
|
|
+$(BEAR) $(MAKE) -j$(J) $(filter -j%,$(MAKEFLAGS)) $(MFLAGS) $(MAKEOVERRIDES) -C $(WINE_OBJ64)/dlls/$(module)
|
|
|
|
module: | all-source wine-configure
|
|
module: module32 module64
|
|
|
|
###############################
|
|
else # outside of the container
|
|
###############################
|
|
|
|
J := $(shell nproc)
|
|
|
|
# If CC is coming from make's defaults or nowhere, use our own default. Otherwise respect environment.
|
|
CCACHE_ENV := $(patsubst %,-e %,$(shell env|cut -d= -f1|grep '^CCACHE_'))
|
|
ifeq ($(ENABLE_CCACHE),1)
|
|
export CCACHE_DIR := $(if $(CCACHE_DIR),$(CCACHE_DIR),$(HOME)/.ccache)
|
|
override DOCKER_OPTS := -v $(CCACHE_DIR):$(CCACHE_DIR)$(CONTAINER_MOUNT_OPTS) $(CCACHE_ENV) -e CCACHE_DIR=$(CCACHE_DIR) $(DOCKER_OPTS)
|
|
else
|
|
export CCACHE_DISABLE := 1
|
|
override DOCKER_OPTS := $(CCACHE_ENV) -e CCACHE_DISABLE=1 $(DOCKER_OPTS)
|
|
endif
|
|
|
|
export CARGO_HOME := $(if $(CARGO_HOME),$(CARGO_HOME),$(HOME)/.cargo)
|
|
override DOCKER_OPTS := -v $(CARGO_HOME):$(CARGO_HOME)$(CONTAINER_MOUNT_OPTS) -e CARGO_HOME=$(CARGO_HOME) $(DOCKER_OPTS)
|
|
|
|
ifneq ($(ROOTLESS_CONTAINER),1)
|
|
override DOCKER_OPTS := -e HOME -e USER -e USERID=$(shell id -u) -u $(shell id -u):$(shell id -g) $(DOCKER_OPTS)
|
|
endif
|
|
|
|
ifeq ($(CONTAINER_ENGINE),)
|
|
CONTAINER_ENGINE := docker
|
|
endif
|
|
|
|
DOCKER_BASE = $(CONTAINER_ENGINE) run --rm -v $(SRC):$(SRC)$(CONTAINER_MOUNT_OPTS) -v $(OBJ):$(OBJ)$(CONTAINER_MOUNT_OPTS) \
|
|
-w $(OBJ) -e MAKEFLAGS \
|
|
$(DOCKER_OPTS) $(STEAMRT_IMAGE)
|
|
|
|
.PHONY: dist deploy redist symstore-tarball
|
|
.DEFAULT dist deploy redist symstore-tarball:
|
|
if [ "$(ENABLE_CCACHE)" -eq "1" ]; then mkdir -p $(CCACHE_DIR); fi
|
|
mkdir -p $(CARGO_HOME)
|
|
$(DOCKER_BASE) $(MAKE) -j$(J) $(filter -j%,$(MAKEFLAGS)) -f $(firstword $(MAKEFILE_LIST)) $(MFLAGS) $(MAKEOVERRIDES) CONTAINER=1 $@
|
|
|
|
|
|
.PHONY: test-container
|
|
test-container:
|
|
@echo >&2 ":: Testing container"
|
|
$(DOCKER_BASE) /bin/bash -c "echo Hello World!"
|
|
|
|
|
|
STEAM_DIR := $(HOME)/.steam/root
|
|
.PHONY: install
|
|
install: all
|
|
if [ ! -d $(STEAM_DIR) ]; then echo >&2 "!! "$(STEAM_DIR)" does not exist, cannot install"; return 1; fi
|
|
mkdir -p $(STEAM_DIR)/compatibilitytools.d/$(BUILD_NAME)
|
|
rsync --delete -arx $(DST_BASE)/* $(STEAM_DIR)/compatibilitytools.d/$(BUILD_NAME)
|
|
@echo "Installed Proton to "$(STEAM_DIR)/compatibilitytools.d/$(BUILD_NAME)
|
|
@echo "You may need to restart Steam to select this tool"
|
|
|
|
|
|
.PHONY: help targets
|
|
help: targets
|
|
targets:
|
|
$(info make - create a normal proton build in dist/)
|
|
$(info make install - install the proton build locally in $(STEAM_DIR))
|
|
$(info make deploy - create a build ready to be uploaded to steamworks in deploy/)
|
|
$(info make redist - create an easily sharable proton redistributable in redist/)
|
|
$(info make module=xyz module - build the selected wine dll)
|
|
|
|
|
|
.PHONY: default
|
|
default: all
|
|
.DEFAULT_GOAL := default
|
|
endif
|