mirror of
https://github.com/ValveSoftware/Proton.git
synced 2025-01-02 18:15:52 +03:00
72d5b322d9
In some cases, wget -O will create the file even when the download fails. This is not removed by make and will make subsequent failures more confusing, as well as failing to recover if the cause was an intermittent network failure.
1216 lines
39 KiB
Makefile
1216 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.20240307.80401-0
|
|
ifeq ($(SRCDIR),)
|
|
foo := $(error SRCDIR not set, do not include Makefile.in directly, run ./configure.sh to generate Makefile)
|
|
endif
|
|
|
|
SOURCE_DATE_EPOCH ?= $(shell date +%s)
|
|
MFLAGS += BASE_SOURCE_DATE_EPOCH=$(SOURCE_DATE_EPOCH)
|
|
unexport SOURCE_DATE_EPOCH
|
|
|
|
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
|
|
BASE_SOURCE_DATE_EPOCH32 := $(BASE_SOURCE_DATE_EPOCH)
|
|
BASE_SOURCE_DATE_EPOCH64 := $(shell expr $(BASE_SOURCE_DATE_EPOCH) - 10)
|
|
|
|
# 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-wine-requests.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 := \
|
|
-Dapetag=enabled \
|
|
-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))
|
|
|
|
##
|
|
## gst-plugins-bad
|
|
##
|
|
|
|
GST_BAD_MESON_ARGS := \
|
|
-Dauto_features=disabled \
|
|
-Dvideoparsers=enabled \
|
|
-Dhls=enabled \
|
|
-Dmpegtsdemux=enabled
|
|
|
|
GST_BAD_DEPENDS = gst_orc gstreamer gst_base
|
|
|
|
$(eval $(call rules-source,gst_bad,$(SRCDIR)/gstreamer/subprojects/gst-plugins-bad/))
|
|
$(eval $(call rules-meson,gst_bad,32))
|
|
$(eval $(call rules-meson,gst_bad,64))
|
|
|
|
##
|
|
## FFmpeg
|
|
##
|
|
|
|
FFMPEG_CONFIGURE_ARGS := \
|
|
--enable-shared \
|
|
--disable-static \
|
|
--disable-everything \
|
|
--disable-programs \
|
|
--disable-doc \
|
|
--disable-inline-asm \
|
|
|
|
$(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))
|
|
|
|
|
|
##
|
|
## 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 \
|
|
--exclude dlls/ntdll/ntsyscalls.h \
|
|
--exclude dlls/win32u/win32syscalls.h \
|
|
--exclude include/wine/server_protocol.h \
|
|
--exclude server/request.h \
|
|
--exclude server/trace.c \
|
|
|
|
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))
|
|
$(eval $(call rules-wine-requests,wine))
|
|
|
|
$(OBJ)/.wine-post-source:
|
|
cd $(WINE_SRC) && dlls/winevulkan/make_vulkan -x vk.xml
|
|
-cd $(WINE_SRC) && tools/make_specfiles
|
|
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
|
|
##
|
|
|
|
# wine builds DLLs with the same names, we need to differentiate the timestamps
|
|
DXVK_SOURCE_DATE_EPOCH32 := $(shell expr $(BASE_SOURCE_DATE_EPOCH32) - 1)
|
|
DXVK_SOURCE_DATE_EPOCH64 := $(shell expr $(BASE_SOURCE_DATE_EPOCH64) - 1)
|
|
|
|
DXVK_SOURCE_ARGS = \
|
|
--exclude version.h.in \
|
|
|
|
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 \
|
|
SONAME_LIBVULKAN=vulkan-1 \
|
|
|
|
VKD3D_LDFLAGS = -static-libgcc $(CROSSLDFLAGS)
|
|
VKD3D_DEPENDS = 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
|
|
##
|
|
|
|
# wine builds DLLs with the same names, we need to differentiate the timestamps
|
|
VKD3D_PROTON_SOURCE_DATE_EPOCH32 := $(shell expr $(BASE_SOURCE_DATE_EPOCH32) - 2)
|
|
VKD3D_PROTON_SOURCE_DATE_EPOCH64 := $(shell expr $(BASE_SOURCE_DATE_EPOCH64) - 2)
|
|
|
|
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 $@
|
|
|
|
|
|
|
|
##
|
|
## 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
|
|
|
|
##
|
|
## 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
|
|
|
|
##
|
|
## Media
|
|
##
|
|
|
|
DIST_MEDIA := $(DST_DIR)/share/media
|
|
$(DIST_MEDIA):
|
|
mkdir -p $@
|
|
cp $(SRCDIR)/media/blank.mkv $@
|
|
cp $(SRCDIR)/media/blank.ptna $@
|
|
|
|
all-dist: $(DIST_MEDIA)
|
|
|
|
##
|
|
## 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 --no-use-server-timestamps -O $@ $(GECKO64_TARBALL_URL) || (rm $@; false)
|
|
|
|
$(SRC)/contrib/$(GECKO32_TARBALL):
|
|
mkdir -p $(dir $@)
|
|
wget --no-use-server-timestamps -O $@ $(GECKO32_TARBALL_URL) || (rm $@; false)
|
|
|
|
$(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 := 9.2.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 --no-use-server-timestamps -O $@ $(MONO_TARBALL_URL) || (rm $@; false)
|
|
|
|
$(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)
|
|
|
|
|
|
##
|
|
## xalia
|
|
##
|
|
|
|
XALIA_VER := 0.4.2
|
|
XALIA_ZIP := xalia-$(XALIA_VER)-net48-mono.zip
|
|
DIST_XALIA_DIR := $(DST_DIR)/share/xalia
|
|
DIST_XALIA := $(OBJ)/.xalia-dist
|
|
XALIA_ZIP_URL := https://github.com/madewokherd/xalia/releases/download/xalia-$(XALIA_VER)/$(XALIA_ZIP)
|
|
|
|
$(SRC)/contrib/$(XALIA_ZIP):
|
|
mkdir -p $(dir $@)
|
|
wget --no-use-server-timestamps -O $@ $(XALIA_ZIP_URL) || (rm $@; false)
|
|
|
|
$(DIST_XALIA): $(SRC)/contrib/$(XALIA_ZIP)
|
|
rm -rf $(DIST_XALIA_DIR)
|
|
mkdir -p $(DIST_XALIA_DIR)
|
|
unzip $< -d $(DIST_XALIA_DIR)
|
|
touch $@
|
|
|
|
all-dist: $(DIST_XALIA)
|
|
|
|
|
|
##
|
|
## 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_bad 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
|