[binutils-gdb] gdb: implement Tcl platform detection and improve private headers scan

Patrick Monnerat via Gdb-cvs <[email protected]>
Newsgroups gmane.comp.gdb.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=5e0a318b0aa54631a2c4d74b1a5582d196fcbe56

commit 5e0a318b0aa54631a2c4d74b1a5582d196fcbe56
Author: Patrick Monnerat <[email protected]>
Date:   Thu Apr 2 16:19:05 2026 +0200

    gdb: implement Tcl platform detection and improve private headers scan
    
    This is needed for recent TEA support.
    
    Autoconf macro CY_AC_TCL_PRIVATE_HEADERS checks more file locations and
    determines TCL_PLATFORM according to the private header files found.
    A C macro TCL_PLATFORM_DEFINE is computed accordingly and defined from
    command line.
    
    The same applies to Tk.
    
    As in-tree Tcl/Tk sources have been removed, this case is left out.
    
    This change primarily targets Insight.

Diff:
---
 gdb/Makefile.in  |   2 +-
 gdb/acinclude.m4 |  56 ++++++++++++++++++++++-------
 gdb/configure    | 105 ++++++++++++++++++++++++++++++-------------------------
 gdb/configure.ac |  54 ++++++++--------------------
 4 files changed, 116 insertions(+), 101 deletions(-)

diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index 0668351b6c0..2488d789580 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -583,7 +583,7 @@ SUBDIR_GDBTK_SRCS = \
 
 SUBDIR_GDBTK_DEPS = $(LIBGUI) $(TCL_DEPS) $(TK_DEPS)
 SUBDIR_GDBTK_LDFLAGS =
-SUBDIR_GDBTK_CFLAGS = -DGDBTK
+SUBDIR_GDBTK_CFLAGS= -DGDBTK -D@TCL_PLATFORM_DEFINE@ -D@TK_PLATFORM_DEFINE@
 
 CONFIG_OBS = @CONFIG_OBS@
 CONFIG_SRCS = @CONFIG_SRCS@
diff --git a/gdb/acinclude.m4 b/gdb/acinclude.m4
index 547dd14d62f..64cbab0b93a 100644
--- a/gdb/acinclude.m4
+++ b/gdb/acinclude.m4
@@ -132,44 +132,76 @@ fi
 ])
 
 dnl Find the location of the private Tcl headers
-dnl When Tcl is installed, this is TCL_INCLUDE_SPEC/tcl-private/generic
-dnl When Tcl is in the build tree, this is not needed.
+dnl This is TCL_INCLUDE_SPEC/tcl-private/generic or TCL_SRC_DIR/generic.
+dnl As a side effect, determine the TCL platform.
 dnl
 dnl Note: you must use first use SC_LOAD_TCLCONFIG!
 AC_DEFUN([CY_AC_TCL_PRIVATE_HEADERS], [
   AC_MSG_CHECKING([for Tcl private headers])
   private_dir=""
-  dir=`echo ${TCL_INCLUDE_SPEC}/tcl-private/generic | sed -e s/-I//`
-  if test -f ${dir}/tclInt.h ; then
-    private_dir=${dir}
-  fi
+  for dir in "${TCL_INCLUDE_SPEC}/tcl-private" "${TCL_SRC_DIR}"; do
+    dir=`echo "${dir}/generic" | sed -e s/-I//`
+    if test -f "${dir}/tclInt.h"; then
+      private_dir="${dir}"
+      break
+    fi
+  done
 
   if test x"${private_dir}" = x; then
     AC_MSG_ERROR(could not find private Tcl headers)
   else
     TCL_PRIVATE_INCLUDE="-I${private_dir}"
     AC_MSG_RESULT(${private_dir})
+    TCL_PLATFORM=unknown
+    dir="`dirname \"${private_dir}\"`"
+    for platform in Unix Win MacOSX; do
+      # FIXME: actually, MacOSX is not detected. How to do it ?
+      pf="`echo \"${platform}\" | tr 'A-Z' 'a-z'`"
+      if test -f "${dir}/generic/tcl${platform}Port.h"; then
+	TCL_PLATFORM="${pf}"
+	break
+      elif test -f "${dir}/${pf}/tcl${platform}Port.h"; then
+	TCL_PLATFORM="${pf}"
+	TCL_PRIVATE_INCLUDE="${TCL_PRIVATE_INCLUDE} -I${dir}/${pf}"
+	break
+      fi
+    done
   fi
 ])
 
 dnl Find the location of the private Tk headers
-dnl When Tk is installed, this is TK_INCLUDE_SPEC/tk-private/generic
-dnl When Tk is in the build tree, this not needed.
+dnl This is TK_INCLUDE_SPEC/tk-private/generic or TK_SRC_DIR/generic.
 dnl
 dnl Note: you must first use SC_LOAD_TKCONFIG
 AC_DEFUN([CY_AC_TK_PRIVATE_HEADERS], [
   AC_MSG_CHECKING([for Tk private headers])
   private_dir=""
-  dir=`echo ${TK_INCLUDE_SPEC}/tk-private/generic | sed -e s/-I//`
-  if test -f ${dir}/tkInt.h; then
-    private_dir=${dir}
-  fi
+  for dir in "${TK_INCLUDE_SPEC}/tk-private" "${TK_SRC_DIR}"; do
+    dir=`echo "${dir}/generic" | sed -e s/-I//`
+    if test -f "${dir}/tkInt.h"; then
+      private_dir="${dir}"
+      break
+    fi
+  done
 
   if test x"${private_dir}" = x; then
     AC_MSG_ERROR(could not find Tk private headers)
   else
     TK_PRIVATE_INCLUDE="-I${private_dir}"
     AC_MSG_RESULT(${private_dir})
+    TK_PLATFORM=unknown
+    dir="`dirname \"${private_dir}\"`"
+    for platform in Unix Win MacOSX; do
+      pf="`echo \"${platform}\" | tr 'A-Z' 'a-z'`"
+      if test -f "${dir}/generic/tk${platform}Port.h"; then
+	TK_PLATFORM="${pf}"
+	break
+      elif test -f "${dir}/${pf}/tk${platform}Port.h"; then
+	TK_PLATFORM="${pf}"
+	TK_PRIVATE_INCLUDE="${TK_PRIVATE_INCLUDE} -I${dir}/${pf}"
+	break
+      fi
+    done
   fi
 ])
 
diff --git a/gdb/configure b/gdb/configure
index 0f5a26878e2..2ff36178a7e 100755
--- a/gdb/configure
+++ b/gdb/configure
@@ -674,6 +674,7 @@ X_LIBS
 X_LDFLAGS
 X_CFLAGS
 TK_XINCLUDES
+TK_PLATFORM_DEFINE
 TK_DEPS
 TK_LIBRARY
 TK_INCLUDE
@@ -686,6 +687,7 @@ TK_LIB_FILE
 TK_SRC_DIR
 TK_BIN_DIR
 TK_VERSION
+TCL_PLATFORM_DEFINE
 TCL_DEPS
 TCL_LIBRARY
 TCL_INCLUDE
@@ -11886,7 +11888,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 11889 "configure"
+#line 11891 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -11992,7 +11994,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 11995 "configure"
+#line 11997 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -32924,27 +32926,18 @@ $as_echo "could not find ${TCL_BIN_DIR}/tclConfig.sh" >&6; }
 
 
 
-	# Check for in-tree tcl
-	here=`pwd`
-	cd ${srcdir}/..
-	topdir=`pwd`
-	cd ${here}
-
-	intree="no"
-	if test "${TCL_SRC_DIR}" = "${topdir}/tcl"; then
-	  intree="yes"
-	fi
-
 	# Find Tcl private headers
-	if test x"${intree}" = xno; then
 
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl private headers" >&5
 $as_echo_n "checking for Tcl private headers... " >&6; }
   private_dir=""
-  dir=`echo ${TCL_INCLUDE_SPEC}/tcl-private/generic | sed -e s/-I//`
-  if test -f ${dir}/tclInt.h ; then
-    private_dir=${dir}
-  fi
+  for dir in "${TCL_INCLUDE_SPEC}/tcl-private" "${TCL_SRC_DIR}"; do
+    dir=`echo "${dir}/generic" | sed -e s/-I//`
+    if test -f "${dir}/tclInt.h"; then
+      private_dir="${dir}"
+      break
+    fi
+  done
 
   if test x"${private_dir}" = x; then
     as_fn_error $? "could not find private Tcl headers" "$LINENO" 5
@@ -32952,19 +32945,28 @@ $as_echo_n "checking for Tcl private headers... " >&6; }
     TCL_PRIVATE_INCLUDE="-I${private_dir}"
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${private_dir}" >&5
 $as_echo "${private_dir}" >&6; }
+    TCL_PLATFORM=unknown
+    dir="`dirname \"${private_dir}\"`"
+    for platform in Unix Win MacOSX; do
+      # FIXME: actually, MacOSX is not detected. How to do it ?
+      pf="`echo \"${platform}\" | tr 'A-Z' 'a-z'`"
+      if test -f "${dir}/generic/tcl${platform}Port.h"; then
+	TCL_PLATFORM="${pf}"
+	break
+      elif test -f "${dir}/${pf}/tcl${platform}Port.h"; then
+	TCL_PLATFORM="${pf}"
+	TCL_PRIVATE_INCLUDE="${TCL_PRIVATE_INCLUDE} -I${dir}/${pf}"
+	break
+      fi
+    done
   fi
 
-	  TCL_INCLUDE="${TCL_INCLUDE_SPEC} ${TCL_PRIVATE_INCLUDE}"
-	  TCL_LIBRARY="${TCL_LIB_SPEC}"
-	  TCL_DEPS=""
-	else
-	  # If building tcl in the same src tree, private headers
-	  # are not needed, but we need to be sure to use the right
-	  # headers library
-	  TCL_INCLUDE="-I${TCL_SRC_DIR}/generic"
-	  TCL_LIBRARY="${TCL_BUILD_LIB_SPEC}"
-	  TCL_DEPS="../tcl/${configdir}${TCL_LIB_FILE}"
-	fi
+	TCL_INCLUDE="${TCL_INCLUDE_SPEC} ${TCL_PRIVATE_INCLUDE}"
+	TCL_LIBRARY="${TCL_LIB_SPEC}"
+	TCL_DEPS=""
+	TCL_PLATFORM_DEFINE="TCL_PLATFORM_`echo \"${TCL_PLATFORM}\" | tr 'a-z-' 'A-Z_'`"
+	TCL_PLATFORM_DEFINE="${TCL_PLATFORM_DEFINE}=${TCL_PLATFORM_DEFINE}"
+
 
 
 
@@ -33038,22 +33040,18 @@ $as_echo "could not find ${TK_BIN_DIR}/tkConfig.sh" >&6; }
 
 
 
-	# Check for in-tree Tk
-	intree="no"
-	if test "${TK_SRC_DIR}" = "${topdir}/tk"; then
-	  intree="yes"
-	fi
-
 	# Find Tk private headers
-	if test x"${intree}" = xno; then
 
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tk private headers" >&5
 $as_echo_n "checking for Tk private headers... " >&6; }
   private_dir=""
-  dir=`echo ${TK_INCLUDE_SPEC}/tk-private/generic | sed -e s/-I//`
-  if test -f ${dir}/tkInt.h; then
-    private_dir=${dir}
-  fi
+  for dir in "${TK_INCLUDE_SPEC}/tk-private" "${TK_SRC_DIR}"; do
+    dir=`echo "${dir}/generic" | sed -e s/-I//`
+    if test -f "${dir}/tkInt.h"; then
+      private_dir="${dir}"
+      break
+    fi
+  done
 
   if test x"${private_dir}" = x; then
     as_fn_error $? "could not find Tk private headers" "$LINENO" 5
@@ -33061,16 +33059,27 @@ $as_echo_n "checking for Tk private headers... " >&6; }
     TK_PRIVATE_INCLUDE="-I${private_dir}"
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${private_dir}" >&5
 $as_echo "${private_dir}" >&6; }
+    TK_PLATFORM=unknown
+    dir="`dirname \"${private_dir}\"`"
+    for platform in Unix Win MacOSX; do
+      pf="`echo \"${platform}\" | tr 'A-Z' 'a-z'`"
+      if test -f "${dir}/generic/tk${platform}Port.h"; then
+	TK_PLATFORM="${pf}"
+	break
+      elif test -f "${dir}/${pf}/tk${platform}Port.h"; then
+	TK_PLATFORM="${pf}"
+	TK_PRIVATE_INCLUDE="${TK_PRIVATE_INCLUDE} -I${dir}/${pf}"
+	break
+      fi
+    done
   fi
 
-	  TK_INCLUDE="${TK_INCLUDE_SPEC} ${TK_PRIVATE_INCLUDE}"
-	  TK_LIBRARY=${TK_LIB_SPEC}
-	  TK_DEPS=""
-	else
-	  TK_INCLUDE="-I${TK_SRC_DIR}/generic"
-	  TK_LIBRARY="${TK_BUILD_LIB_SPEC}"
-	  TK_DEPS="../tk/${configdir}/${TK_LIB_FILE}"
-	fi
+	TK_INCLUDE="${TK_INCLUDE_SPEC} ${TK_PRIVATE_INCLUDE}"
+	TK_LIBRARY=${TK_LIB_SPEC}
+	TK_DEPS=""
+	TK_PLATFORM_DEFINE="TK_PLATFORM_`echo \"${TK_PLATFORM}\" | tr 'a-z-' 'A-Z_'`"
+	TK_PLATFORM_DEFINE="${TK_PLATFORM_DEFINE}=${TK_PLATFORM_DEFINE}"
+
 
 
 
diff --git a/gdb/configure.ac b/gdb/configure.ac
index cf8078e1d89..dc918ae28c7 100644
--- a/gdb/configure.ac
+++ b/gdb/configure.ac
@@ -2111,57 +2111,31 @@ if test "${enable_gdbtk}" = "yes"; then
     if test -z "${no_tcl}" -a -z "${no_tk}"; then
 	SC_LOAD_TCLCONFIG
 
-	# Check for in-tree tcl
-	here=`pwd`
-	cd ${srcdir}/..
-	topdir=`pwd`
-	cd ${here}
-
-	intree="no"
-	if test "${TCL_SRC_DIR}" = "${topdir}/tcl"; then
-	  intree="yes"
-	fi
-
 	# Find Tcl private headers
-	if test x"${intree}" = xno; then
-	  CY_AC_TCL_PRIVATE_HEADERS
-	  TCL_INCLUDE="${TCL_INCLUDE_SPEC} ${TCL_PRIVATE_INCLUDE}"
-	  TCL_LIBRARY="${TCL_LIB_SPEC}"
-	  TCL_DEPS=""
-	else
-	  # If building tcl in the same src tree, private headers
-	  # are not needed, but we need to be sure to use the right
-	  # headers library
-	  TCL_INCLUDE="-I${TCL_SRC_DIR}/generic"
-	  TCL_LIBRARY="${TCL_BUILD_LIB_SPEC}"
-	  TCL_DEPS="../tcl/${configdir}${TCL_LIB_FILE}"
-	fi
+	CY_AC_TCL_PRIVATE_HEADERS
+	TCL_INCLUDE="${TCL_INCLUDE_SPEC} ${TCL_PRIVATE_INCLUDE}"
+	TCL_LIBRARY="${TCL_LIB_SPEC}"
+	TCL_DEPS=""
+	TCL_PLATFORM_DEFINE="TCL_PLATFORM_`echo \"${TCL_PLATFORM}\" | tr 'a-z-' 'A-Z_'`"
+	TCL_PLATFORM_DEFINE="${TCL_PLATFORM_DEFINE}=${TCL_PLATFORM_DEFINE}"
 	AC_SUBST(TCL_INCLUDE)
 	AC_SUBST(TCL_LIBRARY)
 	AC_SUBST(TCL_DEPS)
+	AC_SUBST(TCL_PLATFORM_DEFINE)
 
 	SC_LOAD_TKCONFIG
 
-	# Check for in-tree Tk
-	intree="no"
-	if test "${TK_SRC_DIR}" = "${topdir}/tk"; then
-	  intree="yes"
-	fi
-
 	# Find Tk private headers
-	if test x"${intree}" = xno; then
-	  CY_AC_TK_PRIVATE_HEADERS
-	  TK_INCLUDE="${TK_INCLUDE_SPEC} ${TK_PRIVATE_INCLUDE}"
-	  TK_LIBRARY=${TK_LIB_SPEC}
-	  TK_DEPS=""
-	else
-	  TK_INCLUDE="-I${TK_SRC_DIR}/generic"
-	  TK_LIBRARY="${TK_BUILD_LIB_SPEC}"
-	  TK_DEPS="../tk/${configdir}/${TK_LIB_FILE}"
-	fi
+	CY_AC_TK_PRIVATE_HEADERS
+	TK_INCLUDE="${TK_INCLUDE_SPEC} ${TK_PRIVATE_INCLUDE}"
+	TK_LIBRARY=${TK_LIB_SPEC}
+	TK_DEPS=""
+	TK_PLATFORM_DEFINE="TK_PLATFORM_`echo \"${TK_PLATFORM}\" | tr 'a-z-' 'A-Z_'`"
+	TK_PLATFORM_DEFINE="${TK_PLATFORM_DEFINE}=${TK_PLATFORM_DEFINE}"
 	AC_SUBST(TK_INCLUDE)
 	AC_SUBST(TK_LIBRARY)
 	AC_SUBST(TK_DEPS)
+	AC_SUBST(TK_PLATFORM_DEFINE)
 	AC_SUBST(TK_XINCLUDES)
 
 	ENABLE_CFLAGS="${ENABLE_CFLAGS} \$(SUBDIR_GDBTK_CFLAGS)"
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.