mirror of
ssh://git.janware.com/srv/git/janware/proj/jw-pkg
synced 2026-01-15 03:53:32 +01:00
make: Fix MinGW build machinery machinery
This commit makes it possible to successfully run "make all" against ytools' again, with TARGET_TUPLE set to i686-ms-w64-mingw. Lots of minor and major tweaks here and there. The biggest diff is a move of the architecture-related definitions into platform.mk. The are needed pretty early on, so that seems reasonable. Making this work again is part of the larger effort to support cross buildchains in a more concise way, i.e. without so many if ($(TARGET),mingw)) all over the place. TARGET's relevance should dwindle, until it's finally taken over by the TARGET_XXX variables extracted from TARGET_TUPLE or TARGET_TRIPLET. Signed-off-by: Jan Lindemann <jan@janware.com>
This commit is contained in:
parent
ac2f4f6cc7
commit
f9d398d219
7 changed files with 140 additions and 139 deletions
|
|
@ -19,6 +19,10 @@ else ifeq ($(ARCH),aarch64)
|
|||
PROJECT_LDFLAGS +=
|
||||
endif
|
||||
|
||||
ifeq ($(findstring $(TARGET_OS),linux),)
|
||||
USE_SYSTEMD := false
|
||||
endif
|
||||
|
||||
ifeq ($(DEVELOPMENT),true)
|
||||
export G_SLICE=always-malloc
|
||||
export G_DEBUG=gc-friendly,resident-modules
|
||||
|
|
@ -66,6 +70,8 @@ endif
|
|||
|
||||
ifeq ($(TARGET),mingw)
|
||||
ifneq ($(wildcard /usr/bin/i686-w64-mingw32-gcc),)
|
||||
PROJECT_CFLAGS += -D_WINDOWS
|
||||
PROJECT_CPPFLAGS += -D_WINDOWS
|
||||
MINGW_SYS_ROOT ?= /usr/i686-w64-mingw32/sys-root/mingw
|
||||
CROSS_TOOL_DIR ?=
|
||||
CROSS_TOOL_BIN_PREFIX ?= $(CROSS_TOOL_DIR)/usr/bin/i686-w64-mingw32-
|
||||
|
|
@ -217,6 +223,8 @@ endif
|
|||
ifeq ($(TARGET),mingw)
|
||||
BUILD_CFLAGS += -DWIN32
|
||||
BUILD_CPPFLAGS += -DWIN32
|
||||
# see https://stackoverflow.com/questions/4492799
|
||||
BUILD_LDFLAGS += -fstack-protector
|
||||
endif
|
||||
|
||||
ifeq ($(LIBTYPE),shared)
|
||||
|
|
|
|||
141
make/defs.mk
141
make/defs.mk
|
|
@ -7,12 +7,18 @@ JW_BUILD_DEF_MK_INCLUDED = true
|
|||
|
||||
MAKEFLAGS += -r
|
||||
|
||||
ifneq ($(wildcard $(MODDIR)/make/.cache.mk),)
|
||||
include $(MODDIR)/make/.cache.mk
|
||||
endif
|
||||
ifneq ($(wildcard $(TOPDIR)/make/.cache.mk),)
|
||||
include $(TOPDIR)/make/.cache.mk
|
||||
endif
|
||||
# "-include" tries search path, we don't want that
|
||||
define try_include
|
||||
ifneq ($$(wildcard $(1)),)
|
||||
include $(1)
|
||||
endif
|
||||
endef
|
||||
|
||||
$(eval $(call try_include,$(MODDIR)/make/.cache.mk))
|
||||
$(eval $(call try_include,$(TOPDIR)/make/.cache.mk))
|
||||
$(eval $(call try_include,$(MODDIR)/make/pre-local.mk))
|
||||
$(eval $(call try_include,$(TOPDIR)/make/pre-local.mk))
|
||||
$(eval $(call try_include,pre-local.mk))
|
||||
|
||||
include $(MODDIR)/make/platform.mk
|
||||
include $(MODDIR)/make/projects.mk
|
||||
|
|
@ -23,12 +29,6 @@ else
|
|||
export SHELL := /bin/bash
|
||||
endif
|
||||
|
||||
# ----- pre-local.mk
|
||||
|
||||
-include $(MODDIR)/make/pre-local.mk
|
||||
-include $(TOPDIR)/make/pre-local.mk
|
||||
-include pre-local.mk
|
||||
|
||||
# ----- executables
|
||||
ifndef WHICH
|
||||
WHICH := $(firstword $(wildcard /usr/bin/which) $(shell which which))
|
||||
|
|
@ -64,9 +64,6 @@ endif
|
|||
ifndef MY_SHELL
|
||||
MY_SHELL := /bin/bash
|
||||
endif
|
||||
ifndef GET_OS_SH
|
||||
GET_OS_SH := $(SHELL) $(MOD_SCRIPT_DIR)/get-os.sh
|
||||
endif
|
||||
ifndef ID
|
||||
ID := $(shell $(WHICH) id)
|
||||
endif
|
||||
|
|
@ -197,98 +194,6 @@ PUBLIC_PATH_DEVEL_DOC = /doc/devel
|
|||
UPLOAD_URL_DEVEL_DOC = rsync_ssh://$(JANWARE_USER)@janware.com:/srv/dav/pub/clients/$(JANWARE_CLIENT)/$(PUBLIC_PATH_DEVEL_DOC)
|
||||
PKG_VENDOR ?= janware GmbH
|
||||
|
||||
# ----- host and target variables
|
||||
|
||||
ifeq ($(OS_TUPLE),)
|
||||
OS_TUPLE := $(shell $(GET_OS_SH) tuple)
|
||||
endif
|
||||
|
||||
ifneq ($(TARGET_TUPLE),)
|
||||
TARGET_TUPLE_WORDS := $(subst -, ,$(TARGET_TUPLE))
|
||||
TARGET_ARCH := $(word 1,$(TARGET_TUPLE_WORDS))
|
||||
TARGET_VENDOR := $(word 2,$(TARGET_TUPLE_WORDS))
|
||||
TARGET_OS := $(word 3,$(TARGET_TUPLE_WORDS))
|
||||
TARGET_ABI := $(word 4,$(TARGET_TUPLE_WORDS))
|
||||
TARGET_TRIPLET := $(TARGET_ARCH)-$(TARGET_OS)-$(TARGET_ABI)
|
||||
else ifneq ($(TARGET_TRIPLET),)
|
||||
TARGET_TRIPLET_WORDS := $(subst -, ,$(TARGET_TRIPLET))
|
||||
TARGET_ARCH := $(word 1,$(TARGET_TRIPLET_WORDS))
|
||||
TARGET_VENDOR := unknown
|
||||
TARGET_OS := $(word 2,$(TARGET_TRIPLET_WORDS))
|
||||
TARGET_ABI := $(word 3,$(TARGET_TRIPLET_WORDS))
|
||||
TARGET_TUPLE := $(TARGET_ARCH)-$(TARGET_VENDOR)-$(TARGET_OS)-$(TARGET_ABI)
|
||||
else
|
||||
TARGET_TUPLE := $(OS_TUPLE)
|
||||
TARGET_TUPLE_WORDS := $(subst -, ,$(TARGET_TUPLE))
|
||||
TARGET_ARCH := $(word 1,$(TARGET_TUPLE_WORDS))
|
||||
TARGET_VENDOR := $(word 2,$(TARGET_TUPLE_WORDS))
|
||||
TARGET_OS := $(word 3,$(TARGET_TUPLE_WORDS))
|
||||
TARGET_ABI := $(word 4,$(TARGET_TUPLE_WORDS))
|
||||
TARGET_TRIPLET := $(TARGET_ARCH)-$(TARGET_OS)-$(TARGET_ABI)
|
||||
endif
|
||||
|
||||
ifeq ($(TARGET_TUPLE),)
|
||||
$(error TARGET_TUPLE is empty)
|
||||
endif
|
||||
|
||||
# - support legacy jw-build target variables
|
||||
ifeq ($(TARGET_ABI),mingw32)
|
||||
TARGET ?= mingw
|
||||
else ifeq ($(TARGET_ABI),mingw64)
|
||||
TARGET ?= mingw
|
||||
else
|
||||
TARGET ?= $(TARGET_OS)
|
||||
endif
|
||||
|
||||
ifeq ($(OS_NAME_VERSION),)
|
||||
OS_NAME_VERSION := $(shell $(GET_OS_SH))
|
||||
endif
|
||||
|
||||
ifeq ($(OS_NAME),)
|
||||
OS_NAME := $(shell $(GET_OS_SH) name)
|
||||
endif
|
||||
ARCH ?= $(TARGET_ARCH)
|
||||
|
||||
ARCH_32 = i586
|
||||
|
||||
ifndef ARCH
|
||||
# TODO unreached code, test and fix this
|
||||
ifeq ($(shell uname -m),armv7l)
|
||||
ARCH = armv7hl
|
||||
SYSTEM_LIBDIR_NAME = lib
|
||||
else ifeq ($(shell uname -m),armv6l)
|
||||
ARCH = armv6hl
|
||||
SYSTEM_LIBDIR_NAME = lib
|
||||
else ifeq ($(shell uname -m),aarch64)
|
||||
ARCH = aarch64
|
||||
SYSTEM_LIBDIR_NAME = lib
|
||||
else ifeq ($(shell uname -m),x86_64)
|
||||
ARCH = x86_64
|
||||
SYSTEM_LIBDIR_NAME = lib64
|
||||
else
|
||||
ARCH = $(ARCH_32)
|
||||
SYSTEM_LIBDIR_NAME = lib
|
||||
endif
|
||||
SYSTEM_LIBDIR = /usr/$(SYSTEM_LIBDIR_NAME)
|
||||
endif
|
||||
|
||||
ifneq ($(TARGET_TUPLE),$(OS_TUPLE))
|
||||
ifeq ($(TARGET),mingw)
|
||||
FLAVOUR_PREFIX ?= win32-
|
||||
FLAVOUR_SUFFIX ?= -win32
|
||||
FLAVOUR_PATH_PREFIX ?= win32/
|
||||
FLAVOUR_PATH_SUFFIX ?= /win32
|
||||
ifneq ($(wildcard /usr/bin/i686-w64-mingw32-gcc),)
|
||||
MINGW_SYS_ROOT ?= /usr/i686-w64-mingw32/sys-root/mingw
|
||||
endif
|
||||
else
|
||||
FLAVOUR_PREFIX ?= $(TARGET_TRIPLET)-
|
||||
FLAVOUR_SUFFIX ?= -$(TARGET_TRIPLET)
|
||||
FLAVOUR_PATH_PREFIX ?= $(TARGET_TRIPLET)/
|
||||
FLAVOUR_PATH_SUFFIX ?= /$(TARGET_TRIPLET)
|
||||
endif
|
||||
endif
|
||||
|
||||
# ----- packaging variables
|
||||
|
||||
ifneq ($(filter debian%,$(OS_NAME_VERSION)),)
|
||||
|
|
@ -525,8 +430,8 @@ INSTALL_JAVADIR ?= $(JAVADIR)
|
|||
INSTALLED_JAVA ?= $(addprefix $(INSTALL_JAVADIR)/,$(JAVA_JARS))
|
||||
|
||||
# -- LD_CONF
|
||||
INSTALLATION_FILE_TYPES += LD_CONF
|
||||
ifneq ($(TARGET),mingw)
|
||||
ifneq ($(findstring $(TARGET_OS),linux),)
|
||||
INSTALLATION_FILE_TYPES += LD_CONF
|
||||
LD_CONF += $(filter-out $(DONT_INSTALL),ld-$(PROJECT).conf)
|
||||
BUILD_LD_CONFDIR = $(TOPDIR)/lib/ld.so.conf.d
|
||||
INSTALL_LD_CONFDIR = $(LD_CONF_DIR)
|
||||
|
|
@ -534,7 +439,7 @@ ifneq ($(TARGET),mingw)
|
|||
endif
|
||||
|
||||
# -- LOGROT
|
||||
ifneq ($(TARGET),mingw)
|
||||
ifneq ($(findstring $(TARGET_OS),linux),)
|
||||
INSTALLATION_FILE_TYPES += LOGROT
|
||||
LOGROT += $(basename $(filter-out $(DONT_INSTALL),$(wildcard *.logrotate)))
|
||||
BUILD_LOGROTDIR = $(TOPDIR)/bin/logrotate.d
|
||||
|
|
@ -543,7 +448,7 @@ ifneq ($(TARGET),mingw)
|
|||
endif
|
||||
|
||||
# -- APACHE_CONF
|
||||
ifneq ($(TARGET),mingw)
|
||||
ifneq ($(findstring $(TARGET_OS),linux),)
|
||||
INSTALLATION_FILE_TYPES += APACHE_CONF
|
||||
APACHE_CONF += $(filter-out $(DONT_INSTALL),$(wildcard *.apache-conf))
|
||||
BUILD_APACHE_CONFDIR = $(TOPDIR)/bin/apache/conf.d
|
||||
|
|
@ -552,7 +457,7 @@ ifneq ($(TARGET),mingw)
|
|||
endif
|
||||
|
||||
# -- RSYSLOG
|
||||
ifneq ($(TARGET),mingw)
|
||||
ifneq ($(findstring $(TARGET_OS),linux),)
|
||||
INSTALLATION_FILE_TYPES += RSYSLOG
|
||||
RSYSLOG += $(filter-out $(DONT_INSTALL),$(wildcard *.rsyslog rsyslog-*.bprof))
|
||||
BUILD_RSYSLOGDIR = $(TOPDIR)/bin/rsyslog.d
|
||||
|
|
@ -562,7 +467,7 @@ ifneq ($(TARGET),mingw)
|
|||
endif
|
||||
|
||||
# -- CRONTAB
|
||||
ifneq ($(TARGET),mingw)
|
||||
ifneq ($(findstring $(TARGET_OS),linux),)
|
||||
INSTALLATION_FILE_TYPES += CRONTAB
|
||||
CRONTAB += $(filter-out $(DONT_INSTALL),$(wildcard *.crontab))
|
||||
BUILD_CRONTABDIR = $(TOPDIR)/cron.d
|
||||
|
|
@ -570,7 +475,7 @@ ifneq ($(TARGET),mingw)
|
|||
endif
|
||||
|
||||
# -- PKG_CONFIG
|
||||
ifneq ($(TARGET),mingw)
|
||||
ifneq ($(findstring $(TARGET_OS),linux),)
|
||||
INSTALLATION_FILE_TYPES += PKG_CONFIG
|
||||
PKG_CONFIG += $(sort $(filter-out $(DONT_INSTALL),$(wildcard *.pc) $(LOCAL_PKG_CONFIG)))
|
||||
ifeq ($(DEVELOPMENT),true)
|
||||
|
|
@ -588,9 +493,11 @@ INSTALL_DIR ?= $(INSTALL)
|
|||
|
||||
# ----- local.mk
|
||||
|
||||
-include $(MODDIR)/make/local.mk
|
||||
-include $(TOPDIR)/make/local.mk
|
||||
-include local.mk
|
||||
$(eval $(call try_include,$(MODDIR)/make/local.mk))
|
||||
|
||||
#-include $(MODDIR)/make/local.mk
|
||||
$(eval $(call try_include,$(TOPDIR)/make/local.mk))
|
||||
$(eval $(call try_include,local.mk))
|
||||
|
||||
BTOOLS_DIR ?= $(call proj_dir, dspider-btools)
|
||||
#DSPCD_DIR ?= $(call proj_dir, dspcd)
|
||||
|
|
|
|||
|
|
@ -32,7 +32,9 @@ INSTALLED_PKG_MK += $(INSTALL_PCKG_DEFS_DIR)/$(PROJECT).mk
|
|||
endif
|
||||
|
||||
#all: $(BUILD_PKG_CONFIG)
|
||||
ifneq ($(findstring PKG_CONFIG,$(INSTALLATION_FILE_TYPES)),)
|
||||
all: build_PKG_CONFIG
|
||||
endif
|
||||
install: $(DEVEL_TARGETS)
|
||||
clean: textclean localclean doneclean clean.pkg-config
|
||||
test:
|
||||
|
|
|
|||
100
make/platform.mk
100
make/platform.mk
|
|
@ -1,7 +1,105 @@
|
|||
# ----- host and target variables
|
||||
|
||||
ifndef PLATFORM_MK_INCLUDED
|
||||
PLATFORM_MK_INCLUDED = true
|
||||
|
||||
ifndef TARGET
|
||||
ifneq ($(findstring mingw,$(shell pwd)),)
|
||||
ifneq ($(subst mingw,,$(CWD)),$(CWD))
|
||||
TARGET := mingw
|
||||
endif
|
||||
endif
|
||||
|
||||
MOD_SCRIPT_DIR := $(firstword $(wildcard $(MODDIR)/scripts $(MODDIR)/bin))
|
||||
ifndef GET_OS_SH
|
||||
GET_OS_SH := $(SHELL) $(MOD_SCRIPT_DIR)/get-os.sh
|
||||
endif
|
||||
|
||||
ifeq ($(OS_TUPLE),)
|
||||
OS_TUPLE := $(shell $(GET_OS_SH) tuple)
|
||||
endif
|
||||
|
||||
ifneq ($(TARGET_TUPLE),)
|
||||
TARGET_TUPLE_WORDS := $(subst -, ,$(TARGET_TUPLE))
|
||||
TARGET_ARCH := $(word 1,$(TARGET_TUPLE_WORDS))
|
||||
TARGET_VENDOR := $(word 2,$(TARGET_TUPLE_WORDS))
|
||||
TARGET_OS := $(word 3,$(TARGET_TUPLE_WORDS))
|
||||
TARGET_ABI := $(word 4,$(TARGET_TUPLE_WORDS))
|
||||
TARGET_TRIPLET := $(TARGET_ARCH)-$(TARGET_OS)-$(TARGET_ABI)
|
||||
else ifneq ($(TARGET_TRIPLET),)
|
||||
TARGET_TRIPLET_WORDS := $(subst -, ,$(TARGET_TRIPLET))
|
||||
TARGET_ARCH := $(word 1,$(TARGET_TRIPLET_WORDS))
|
||||
TARGET_VENDOR := unknown
|
||||
TARGET_OS := $(word 2,$(TARGET_TRIPLET_WORDS))
|
||||
TARGET_ABI := $(word 3,$(TARGET_TRIPLET_WORDS))
|
||||
TARGET_TUPLE := $(TARGET_ARCH)-$(TARGET_VENDOR)-$(TARGET_OS)-$(TARGET_ABI)
|
||||
else
|
||||
TARGET_TUPLE := $(OS_TUPLE)
|
||||
TARGET_TUPLE_WORDS := $(subst -, ,$(TARGET_TUPLE))
|
||||
TARGET_ARCH := $(word 1,$(TARGET_TUPLE_WORDS))
|
||||
TARGET_VENDOR := $(word 2,$(TARGET_TUPLE_WORDS))
|
||||
TARGET_OS := $(word 3,$(TARGET_TUPLE_WORDS))
|
||||
TARGET_ABI := $(word 4,$(TARGET_TUPLE_WORDS))
|
||||
TARGET_TRIPLET := $(TARGET_ARCH)-$(TARGET_OS)-$(TARGET_ABI)
|
||||
endif
|
||||
|
||||
ifeq ($(TARGET_TUPLE),)
|
||||
$(error TARGET_TUPLE is empty)
|
||||
endif
|
||||
|
||||
# - support legacy jw-build target variables
|
||||
ifneq ($(findstring $(TARGET_ABI),mingw mingw32 mingw64),)
|
||||
TARGET ?= mingw
|
||||
else
|
||||
TARGET ?= $(TARGET_OS)
|
||||
endif
|
||||
|
||||
ifeq ($(OS_NAME_VERSION),)
|
||||
OS_NAME_VERSION := $(shell $(GET_OS_SH))
|
||||
endif
|
||||
|
||||
ifeq ($(OS_NAME),)
|
||||
OS_NAME := $(shell $(GET_OS_SH) name)
|
||||
endif
|
||||
ARCH ?= $(TARGET_ARCH)
|
||||
|
||||
ARCH_32 = i586
|
||||
|
||||
ifndef ARCH
|
||||
# TODO unreached code, test and fix this
|
||||
ifeq ($(shell uname -m),armv7l)
|
||||
ARCH = armv7hl
|
||||
SYSTEM_LIBDIR_NAME = lib
|
||||
else ifeq ($(shell uname -m),armv6l)
|
||||
ARCH = armv6hl
|
||||
SYSTEM_LIBDIR_NAME = lib
|
||||
else ifeq ($(shell uname -m),aarch64)
|
||||
ARCH = aarch64
|
||||
SYSTEM_LIBDIR_NAME = lib
|
||||
else ifeq ($(shell uname -m),x86_64)
|
||||
ARCH = x86_64
|
||||
SYSTEM_LIBDIR_NAME = lib64
|
||||
else
|
||||
ARCH = $(ARCH_32)
|
||||
SYSTEM_LIBDIR_NAME = lib
|
||||
endif
|
||||
SYSTEM_LIBDIR = /usr/$(SYSTEM_LIBDIR_NAME)
|
||||
endif
|
||||
|
||||
ifneq ($(TARGET_TUPLE),$(OS_TUPLE))
|
||||
ifeq ($(TARGET),mingw)
|
||||
FLAVOUR_PREFIX ?= win32-
|
||||
FLAVOUR_SUFFIX ?= -win32
|
||||
FLAVOUR_PATH_PREFIX ?= win32/
|
||||
FLAVOUR_PATH_SUFFIX ?= /win32
|
||||
ifneq ($(wildcard /usr/bin/i686-w64-mingw32-gcc),)
|
||||
MINGW_SYS_ROOT ?= /usr/i686-w64-mingw32/sys-root/mingw
|
||||
endif
|
||||
else
|
||||
FLAVOUR_PREFIX ?= $(TARGET_TRIPLET)-
|
||||
FLAVOUR_SUFFIX ?= -$(TARGET_TRIPLET)
|
||||
FLAVOUR_PATH_PREFIX ?= $(TARGET_TRIPLET)/
|
||||
FLAVOUR_PATH_SUFFIX ?= /$(TARGET_TRIPLET)
|
||||
endif
|
||||
endif
|
||||
|
||||
endif # ifndef PLATFORM_MK_INCLUDED
|
||||
|
|
|
|||
19
make/proj.mk
19
make/proj.mk
|
|
@ -48,22 +48,3 @@ CPPFLAGS += -D_USRDLL -DJW_BUILD_EXPORTS
|
|||
PROJECT_CFLAGS += $(DEBUG_FORMAT_FLAG)
|
||||
PROJECT_CPPFLAGS += $(DEBUG_FORMAT_FLAG)
|
||||
PROJECT_LDFLAGS += $(DEBUG_FORMAT_FLAG)
|
||||
|
||||
# need to do this before
|
||||
include $(MODDIR)/make/platform.mk
|
||||
ifeq ($(TARGET),mingw)
|
||||
CONTRIB_DLL = \
|
||||
iconv \
|
||||
libglib-2.0-0 \
|
||||
intl \
|
||||
libgnurx-0
|
||||
|
||||
# msvcirt \
|
||||
# msvcp71d \
|
||||
# msvcp71 \
|
||||
# msvcr71d \
|
||||
# msvcr71
|
||||
|
||||
CONTRIB_LIBS += $(addsuffix .dll,$(CONTRIB_DLL))
|
||||
PROJECT_LDFLAGS += -lgnurx
|
||||
endif
|
||||
|
|
|
|||
|
|
@ -17,7 +17,6 @@ ifeq ($(DEVELOPMENT),true)
|
|||
else
|
||||
PRJS_DIR ?= /opt
|
||||
endif
|
||||
MOD_SCRIPT_DIR := $(firstword $(wildcard $(MODDIR)/scripts $(MODDIR)/bin))
|
||||
|
||||
# -- Query the build system about other projects:
|
||||
PYTHON ?= /usr/bin/python2
|
||||
|
|
|
|||
|
|
@ -32,9 +32,15 @@ ifeq ($(SCOPE_PREFIX),)
|
|||
# cd $(BUILD_HDRDIR_BASE) && ln -s . $(HDRDIR_SCOPE_SUFFIX)
|
||||
endif
|
||||
|
||||
ifneq ($(TARGET),mingw)
|
||||
$(LIB_SO): $(OBJ)
|
||||
endif
|
||||
|
||||
all.done: $(PREREQ_DONE) $(BUILD_HDR) $(BUILD_EXE_SH) $(MEMBERS) $(LIB_A) $(LIB_SO) | $(HDRDIR_SCOPE_SUFFIX)
|
||||
all.done: $(PREREQ_DONE) $(BUILD_HDR) $(BUILD_EXE_SH) $(MEMBERS) $(LIB_A) | $(HDRDIR_SCOPE_SUFFIX)
|
||||
|
||||
ifneq ($(TARGET),mingw)
|
||||
all.done: $(LIB_SO)
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue