Files
OCCT/adm/vcpkg/ports/tcl/0001-Support-Tk.patch
Pasukhin Dmitry c0a6aee75d Testing - Migration PR actions to VCPKG-based (#587)
Update the default testing to use result of VCPKG.
The 3rd-party are stored in GitHub NuGet storage and reused.
The 3rd-party archive with installed 3rd-party added as an artefact
Updated the actions to work with VCPKG 3rd party
2025-07-06 14:35:22 +01:00

416 lines
15 KiB
Diff

From da6b5b83ef997f550155d9087c5e7b289168fb1b Mon Sep 17 00:00:00 2001
From: dpasukhi <dpasukhi@opencascade.com>
Date: Sat, 5 Jul 2025 11:36:01 +0100
Subject: [PATCH] Add support for building and installing Tk in Makefiles for
Unix and Windows
---
unix/Makefile.in | 94 +++++++++++++++++++++++++++++++++++++++++++++--
win/Makefile.in | 68 ++++++++++++++++++++++++++++++++++
win/makefile.vc | 96 +++++++++++++++++++++++++++++++++++++++++++++---
3 files changed, 249 insertions(+), 9 deletions(-)
diff --git a/unix/Makefile.in b/unix/Makefile.in
index bc743b3892..dfdcf35acd 100644
--- a/unix/Makefile.in
+++ b/unix/Makefile.in
@@ -232,6 +232,7 @@ TOOL_DIR = $(TOP_DIR)/tools
UNIX_DIR = $(TOP_DIR)/unix
MAC_OSX_DIR = $(TOP_DIR)/macosx
PKGS_DIR = $(TOP_DIR)/pkgs
+EXTRADIR = $(TOP_DIR)/extra
# Must be absolute because of the cd dltest $(DLTEST_DIR)/configure below.
DLTEST_DIR = @TCL_SRC_DIR@/unix/dltest
# Must be absolute to so the corresponding tcltest's tcl_library is absolute.
@@ -622,7 +623,7 @@ SRCS = $(GENERIC_SRCS) $(UNIX_SRCS) $(NOTIFY_SRCS) \
# Start of rules
#--------------------------------------------------------------------------
-all: binaries libraries doc packages
+all: binaries libraries doc packages extra
binaries: ${LIB_FILE} ${TCL_EXE}
@@ -666,13 +667,13 @@ Makefile: $(UNIX_DIR)/Makefile.in $(DLTEST_DIR)/Makefile.in
#tclConfig.h: $(UNIX_DIR)/tclConfig.h.in
# $(SHELL) config.status
-clean: clean-packages
+clean: clean-packages clean-extra
rm -rf *.a *.o libtcl* core errs *~ \#* TAGS *.E a.out \
errors ${TCL_EXE} ${TCLTEST_EXE} lib.exp Tcl @DTRACE_HDR@ \
minizip${HOST_EXEEXT} *.${HOST_OBJEXT} *.zip *.vfs
(cd dltest ; $(MAKE) clean)
-distclean: distclean-packages clean
+distclean: distclean-packages clean distclean-extra
rm -rf Makefile config.status config.cache config.log tclConfig.sh \
tclConfig.h *.plist Tcl.framework tcl.pc tclUuid.h
(cd dltest ; $(MAKE) distclean)
@@ -795,7 +796,7 @@ INSTALL_EXTRA_TARGETS = @EXTRA_INSTALL@
INSTALL_TARGETS = $(INSTALL_BASE_TARGETS) $(INSTALL_DOC_TARGETS) $(INSTALL_DEV_TARGETS) \
$(INSTALL_PACKAGE_TARGETS) $(INSTALL_EXTRA_TARGETS)
-install: $(INSTALL_TARGETS)
+install: $(INSTALL_TARGETS) install-extra
install-strip:
$(MAKE) $(INSTALL_TARGETS) \
@@ -1725,6 +1726,7 @@ PKG_CFG_ARGS = @PKG_CFG_ARGS@
# cannot use absolute paths due to issues in nested configure when path to
# build dir contains spaces).
PKG_DIR = ./pkgs
+EXTRA_BUILD_DIR = ./extra
configure-packages:
@for i in $(PKGS_DIR)/*; do \
@@ -2151,6 +2153,89 @@ BUILD_HTML = \
--useversion=$(HTML_VERSION) --htmldir="$(HTML_INSTALL_DIR)" \
--srcdir=$(TOP_DIR)/.. $(BUILD_HTML_FLAGS)
+#--------------------------------------------------------------------------
+# Extra packages build targets (for TK and other extras)
+#--------------------------------------------------------------------------
+
+extra:
+ @if test -d "$(EXTRADIR)"; then \
+ for extradir in $(EXTRADIR)/*; do \
+ if test -d "$$extradir/unix" && test -f "$$extradir/unix/configure"; then \
+ extrapkg=`basename $$extradir`; \
+ echo "Building extra package '$$extrapkg'"; \
+ mkdir -p "$(EXTRA_BUILD_DIR)/$$extrapkg"; \
+ TCL_BUILD_DIR="`pwd`"; \
+ if test ! -f "$(EXTRA_BUILD_DIR)/$$extrapkg/Makefile"; then \
+ echo "Configuring extra package '$$extrapkg'"; \
+ (cd "$(EXTRA_BUILD_DIR)/$$extrapkg" && \
+ "$$extradir/unix/configure" \
+ --prefix="$(prefix)" \
+ --exec-prefix="$(exec_prefix)" \
+ --with-tcl="$$TCL_BUILD_DIR" \
+ CFLAGS="$(CFLAGS)" \
+ CPPFLAGS="$(CPPFLAGS)" \
+ LDFLAGS="$(LDFLAGS)" \
+ CC="$(CC)") || exit $$?; \
+ fi; \
+ echo "Building extra package '$$extrapkg'"; \
+ (cd "$(EXTRA_BUILD_DIR)/$$extrapkg" && \
+ $(MAKE) \
+ TCL_LIBRARY=$(TCL_LIBRARY) \
+ CFLAGS="$(CFLAGS)" \
+ CPPFLAGS="$(CPPFLAGS)" \
+ LDFLAGS="$(LDFLAGS)" \
+ CC="$(CC)") || exit $$?; \
+ fi; \
+ done; \
+ else \
+ echo "No extra directory found at $(EXTRADIR) - skipping extra builds"; \
+ fi
+
+install-extra:
+ @if test -d "$(EXTRADIR)"; then \
+ for extradir in $(EXTRADIR)/*; do \
+ if test -d "$$extradir/unix" && test -f "$$extradir/unix/configure"; then \
+ extrapkg=`basename $$extradir`; \
+ if test -f "$(EXTRA_BUILD_DIR)/$$extrapkg/Makefile"; then \
+ echo "Installing extra package '$$extrapkg'"; \
+ (cd "$(EXTRA_BUILD_DIR)/$$extrapkg" && $(MAKE) install \
+ DESTDIR="$(INSTALL_ROOT)" \
+ prefix="$(prefix)" \
+ exec_prefix="$(exec_prefix)" \
+ TCL_LIBRARY=$(TCL_LIBRARY) \
+ CFLAGS="$(CFLAGS)" \
+ CPPFLAGS="$(CPPFLAGS)" \
+ LDFLAGS="$(LDFLAGS)" \
+ CC="$(CC)") || exit $$?; \
+ fi; \
+ fi; \
+ done; \
+ else \
+ echo "No extra directory found - skipping extra installs"; \
+ fi
+
+clean-extra:
+ @if test -d "$(EXTRA_BUILD_DIR)"; then \
+ for extrapkg in $(EXTRA_BUILD_DIR)/*; do \
+ if test -d "$$extrapkg" && test -f "$$extrapkg/Makefile"; then \
+ echo "Cleaning extra package in $$extrapkg"; \
+ (cd "$$extrapkg" && $(MAKE) clean) || exit $$?; \
+ fi; \
+ done; \
+ fi
+
+distclean-extra:
+ @if test -d "$(EXTRA_BUILD_DIR)"; then \
+ for extrapkg in $(EXTRA_BUILD_DIR)/*; do \
+ if test -d "$$extrapkg" && test -f "$$extrapkg/Makefile"; then \
+ echo "Distcleaning extra package in $$extrapkg"; \
+ (cd "$$extrapkg" && $(MAKE) distclean) || exit $$?; \
+ fi; \
+ rm -rf "$$extrapkg"; \
+ done; \
+ rm -rf "$(EXTRA_BUILD_DIR)"; \
+ fi
+
#--------------------------------------------------------------------------
# The list of all the targets that do not correspond to real files. This stops
# 'make' from getting confused when someone makes an error in a rule.
@@ -2166,6 +2251,7 @@ BUILD_HTML = \
.PHONY: install-tzdata install-msgs
.PHONY: packages configure-packages test-packages clean-packages
.PHONY: dist-packages distclean-packages install-packages
+.PHONY: extra install-extra clean-extra distclean-extra
#--------------------------------------------------------------------------
# DO NOT DELETE THIS LINE -- make depend depends on it.
diff --git a/win/Makefile.in b/win/Makefile.in
index 8dd107670f..f0cf267329 100644
--- a/win/Makefile.in
+++ b/win/Makefile.in
@@ -129,6 +129,11 @@ ROOT_DIR_WIN_NATIVE = $(shell cd '$(ROOT_DIR)' ; pwd -W 2>/dev/null || pwd -P)
ZLIB_DIR_NATIVE = $(shell $(CYGPATH) '$(ZLIB_DIR)')
TOMMATH_DIR_NATIVE = $(shell $(CYGPATH) '$(TOMMATH_DIR)')
+# Tk-related directories (TKDIR can be set by user)
+TK_SRC_DIR = $(TKDIR)
+TK_BUILD_TOP = $(TKDIR)/win
+CONFIG_INSTALL_DIR = $(LIB_INSTALL_DIR)
+
# Fully qualify library path so that `make test`
# does not depend on the current directory.
LIBRARY_DIR1 = $(shell cd '$(ROOT_DIR_NATIVE)/library' ; pwd -P)
@@ -432,6 +437,34 @@ TCL_OBJS = ${GENERIC_OBJS} ${WIN_OBJS} @ZLIB_OBJS@ $(TOMMATH_OBJS)
TCL_DOCS = "$(ROOT_DIR_NATIVE)"/doc/*.[13n]
all: binaries libraries doc packages
+ @if test -n "$(TKDIR)" && test -d "$(TKDIR)"; then \
+ echo "TKDIR detected - automatically building Tk..."; \
+ echo "========== TK BUILD PARAMETERS =========="; \
+ echo "TKDIR=$(TKDIR)"; \
+ echo "TCLDIR=$(TOP_DIR)"; \
+ echo "prefix=$(prefix)"; \
+ echo "exec_prefix=$(exec_prefix)"; \
+ echo "TCL_TCLSH=$(BIN_INSTALL_DIR)/tclsh$(VER)${EXESUFFIX}"; \
+ echo "=========================================="; \
+ if test -f "$(TK_BUILD_TOP)/Makefile"; then \
+ echo "Building Tk using existing Makefile..."; \
+ (cd "$(TK_BUILD_TOP)" && $(MAKE)) || exit $$?; \
+ elif test -f "$(TK_SRC_DIR)/win/configure"; then \
+ echo "Configuring and building Tk..."; \
+ mkdir -p "$(TK_BUILD_TOP)"; \
+ (cd "$(TK_BUILD_TOP)" && \
+ "$(TK_SRC_DIR)/win/configure" \
+ --prefix="$(prefix)" \
+ --exec-prefix="$(exec_prefix)" \
+ --with-tcl="$(CONFIG_INSTALL_DIR)" && \
+ $(MAKE)) || exit $$?; \
+ else \
+ echo "ERROR: Tk configure script not found at $(TK_SRC_DIR)/win/configure"; \
+ exit 1; \
+ fi; \
+ else \
+ echo "TKDIR not set or directory does not exist - skipping Tk build"; \
+ fi
# Test-suite helper (can be used to test Tcl from build directory with all expected modules).
# To start from windows shell use:
@@ -648,6 +681,27 @@ gentommath_h:
> "$(GENERIC_DIR_NATIVE)/tclTomMath.h"
install: all install-binaries install-libraries install-doc install-packages
+ @if test -n "$(TKDIR)" && test -d "$(TKDIR)"; then \
+ echo "TKDIR detected - automatically installing Tk..."; \
+ echo "========== TK INSTALL PARAMETERS =========="; \
+ echo "TKDIR=$(TKDIR)"; \
+ echo "TCLDIR=$(TOP_DIR)"; \
+ echo "prefix=$(prefix)"; \
+ echo "exec_prefix=$(exec_prefix)"; \
+ echo "DESTDIR=$(INSTALL_ROOT)"; \
+ echo "TCL_TCLSH=$(BIN_INSTALL_DIR)/tclsh$(VER)${EXESUFFIX}"; \
+ echo "==========================================="; \
+ if test -f "$(TK_BUILD_TOP)/Makefile"; then \
+ echo "Installing Tk..."; \
+ (cd "$(TK_BUILD_TOP)" && $(MAKE) install DESTDIR="$(INSTALL_ROOT)") || exit $$?; \
+ else \
+ echo "ERROR: Tk Makefile not found at $(TK_BUILD_TOP)/Makefile"; \
+ echo "Please run 'make all' first to build Tk"; \
+ exit 1; \
+ fi; \
+ else \
+ echo "TKDIR not set or directory does not exist - skipping Tk install"; \
+ fi
install-binaries: binaries
@for i in "$(LIB_INSTALL_DIR)" "$(BIN_INSTALL_DIR)"; \
@@ -848,10 +902,24 @@ clean: cleanhelp clean-packages
$(RM) $(TCLSH) $(CAT32) $(TEST_EXE_FILE) $(TEST_DLL_FILE) tcltest.cmd tcltest.sh
$(RM) *.pch *.ilk *.pdb *.zip
$(RMDIR) *.vfs
+ @if test -n "$(TKDIR)" && test -d "$(TKDIR)" && test -f "$(TK_BUILD_TOP)/Makefile"; then \
+ echo "TKDIR detected - automatically cleaning Tk..."; \
+ echo "Cleaning Tk build..."; \
+ (cd "$(TK_BUILD_TOP)" && $(MAKE) clean) || exit $$?; \
+ else \
+ echo "TKDIR not set, directory does not exist, or no Tk build to clean"; \
+ fi
distclean: distclean-packages clean
$(RM) Makefile config.status config.cache config.log tclConfig.sh \
tcl.hpj config.status.lineno tclsh.exe.manifest tclUuid.h
+ @if test -n "$(TKDIR)" && test -d "$(TKDIR)" && test -f "$(TK_BUILD_TOP)/Makefile"; then \
+ echo "TKDIR detected - automatically distcleaning Tk..."; \
+ echo "Distcleaning Tk build..."; \
+ (cd "$(TK_BUILD_TOP)" && $(MAKE) distclean) || exit $$?; \
+ else \
+ echo "TKDIR not set, directory does not exist, or no Tk build to distclean"; \
+ fi
#
# Bundled package targets
diff --git a/win/makefile.vc b/win/makefile.vc
index c88c0ec3dc..cbdad89ba8 100644
--- a/win/makefile.vc
+++ b/win/makefile.vc
@@ -420,6 +420,7 @@ TCLSTUBOBJS = \
### the left side of implicit rules.
TOMMATHDIR = $(ROOT)\libtommath
PKGSDIR = $(ROOT)\pkgs
+WINDIR = $(ROOT)\win
# Additional include and C macro definitions for the implicit rules
# defined in rules.vc
@@ -438,6 +439,7 @@ TESTFLAGS = $(TESTFLAGS) -file $(TESTPAT)
!endif
+
#---------------------------------------------------------------------
# Project specific targets
# There are 4 primary build configurations to consider from the combination
@@ -466,18 +468,24 @@ TESTFLAGS = $(TESTFLAGS) -file $(TESTPAT)
# release - Everything that builds as part of a release
#---------------------------------------------------------------------
-release: setup $(TCLSH) $(TCLSTUBLIB) dlls pkgs
-all: setup $(TCLSH) $(TCLSTUBLIB) dlls $(CAT32) pkgs
+release: setup $(TCLSH) $(TCLSTUBLIB) dlls setpath pkgs tk-build
+all: setup $(TCLSH) $(TCLSTUBLIB) dlls $(CAT32) setpath pkgs
core: setup $(TCLLIB) $(TCLSTUBLIB)
shell: setup $(TCLSH)
dlls: setup $(TCLREGLIB) $(TCLDDELIB) $(OUT_DIR)\zlib1.dll
tcltest: setup $(TCLTEST) dlls $(CAT32)
-install: install-binaries install-libraries install-docs install-pkgs
+install: setpath install-binaries install-libraries install-docs install-pkgs tk-build tk-install
!if $(SYMBOLS)
install: install-pdbs
!endif
setup: default-setup
+# Add TCL win directory to PATH for current session
+setpath:
+ @echo Adding $(WINDIR) to PATH
+ @set PATH=$(WINDIR);$(PATH)
+ @echo PATH updated for current session
+
test: test-core test-pkgs
test-core: setup $(TCLTEST) dlls $(CAT32)
set TCL_LIBRARY=$(ROOT:\=/)/library
@@ -569,6 +577,84 @@ pkgs:
popd \
)
+tk-build:
+!if defined(TKDIR)
+ @echo TKDIR detected - building Tk...
+ @echo ========== TK BUILD PARAMETERS ==========
+ @echo TKDIR=$(TKDIR)
+ @echo TCLDIR=$(ROOT)
+!if defined(INSTALLDIR)
+ @echo INSTALLDIR=$(INSTALLDIR)
+!endif
+ @echo OPTS=$(OPTS)
+ @echo STATS=$(STATS)
+ @echo CHECKS=$(CHECKS)
+ @echo MACHINE=$(MACHINE)
+ @echo ==========================================
+ @if exist "$(TKDIR)\win\makefile.vc" ( \
+ pushd "$(TKDIR)\win" & \
+ $(MAKE) -$(MAKEFLAGS) -f makefile.vc TCLDIR=$(ROOT) OPTS=$(OPTS) STATS=$(STATS) CHECKS=$(CHECKS) MACHINE=$(MACHINE) & \
+ popd \
+ ) else ( \
+ echo ERROR: Tk makefile.vc not found at $(TKDIR)\win\makefile.vc & \
+ exit 1 \
+ )
+!else
+ @echo TKDIR not set or directory does not exist - skipping Tk build
+!endif
+
+tk-install:
+!if defined(TKDIR) && defined(INSTALLDIR)
+ @echo TKDIR detected - installing Tk...
+ @echo ========== TK INSTALL PARAMETERS ==========
+ @echo TKDIR=$(TKDIR)
+ @echo TCLDIR=$(ROOT)
+ @echo INSTALLDIR=$(INSTALLDIR)
+ @echo OPTS=$(OPTS)
+ @echo STATS=$(STATS)
+ @echo CHECKS=$(CHECKS)
+ @echo MACHINE=$(MACHINE)
+ @echo ===========================================
+ @if exist "$(TKDIR)\win\makefile.vc" ( \
+ pushd "$(TKDIR)\win" & \
+ $(MAKE) -$(MAKEFLAGS) -f makefile.vc TCLDIR=$(ROOT) INSTALLDIR=$(INSTALLDIR) OPTS=$(OPTS) STATS=$(STATS) CHECKS=$(CHECKS) MACHINE=$(MACHINE) install & \
+ popd \
+ ) else ( \
+ echo ERROR: Tk makefile.vc not found at $(TKDIR)\win\makefile.vc & \
+ exit 1 \
+ )
+!else
+ @echo TKDIR not set, INSTALLDIR not set, or directory does not exist - skipping Tk install
+!endif
+
+tk-clean:
+!if defined(TKDIR)
+ @echo TKDIR detected - cleaning Tk build...
+ @if exist "$(TKDIR)\win\makefile.vc" ( \
+ pushd "$(TKDIR)\win" & \
+ $(MAKE) -$(MAKEFLAGS) -f makefile.vc TCLDIR=$(ROOT) clean & \
+ popd \
+ ) else ( \
+ echo No Tk makefile found to clean \
+ )
+!else
+ @echo TKDIR not set or directory does not exist - skipping Tk clean
+!endif
+
+tk-distclean:
+!if defined(TKDIR)
+ @echo TKDIR detected - distcleaning Tk build...
+ @if exist "$(TKDIR)\win\makefile.vc" ( \
+ pushd "$(TKDIR)\win" & \
+ $(MAKE) -$(MAKEFLAGS) -f makefile.vc TCLDIR=$(ROOT) distclean & \
+ popd \
+ ) else ( \
+ echo No Tk makefile found to distclean \
+ )
+!else
+ @echo TKDIR not set or directory does not exist - skipping Tk distclean
+!endif
+
test-pkgs:
@for /d %d in ($(PKGSDIR)\*) do \
@if exist "%~fd\win\makefile.vc" ( \
@@ -1058,8 +1144,8 @@ tidy:
@echo Removing $(TCLREGLIB) ...
@if exist $(TCLREGLIB) del $(TCLREGLIB)
-clean: default-clean clean-pkgs
-hose: default-hose hose-pkgs
+clean: default-clean clean-pkgs tk-clean
+hose: default-hose hose-pkgs tk-distclean
realclean: hose
.PHONY:
--
2.43.0