Skip to content

tclpkg tclGdCreateCmd: disable use of 'Tcl_GetOpenFile' on MinGW, Windows

Matthew Fernandez requested to merge smattr/graphviz:smattr/gitlab-2530 into main

TCL documents Tcl_GetOpenFile as “Unix only”.¹ And indeed, attempting to build this code on MinGW does not see the prototype of this function:

  C:/GitLab-Runner/builds/smattr/graphviz/tclpkg/gdtclft/gdtclft.c: In function 'tclGdCreateCmd':
  C:/GitLab-Runner/builds/smattr/graphviz/tclpkg/gdtclft/gdtclft.c:443:13: error: implicit declaration of function 'Tcl_GetOpenFile' [-Werror=implicit-function-declaration]
    443 |         if (Tcl_GetOpenFile(interp, arg2, 0, 1, &clientdata) == TCL_OK) {
        |             ^~~~~~~~~~~~~~~

The relevant section in tcl.h reads:²

  #if !defined(_WIN32) && !defined(MAC_OSX_TCL) /* UNIX */
  /* 167 */
  EXTERN int		Tcl_GetOpenFile(Tcl_Interp *interp,
  				const char *chanID, int forWriting,
  				int checkUsage, void **filePtr);
  #endif /* UNIX */
  #ifdef MAC_OSX_TCL /* MACOSX */
  /* 167 */
  EXTERN int		Tcl_GetOpenFile(Tcl_Interp *interp,
  				const char *chanID, int forWriting,
  				int checkUsage, void **filePtr);
  #endif /* MACOSX */

  

  #if !defined(_WIN32) && !defined(MAC_OSX_TCL) /* UNIX */
      int (*tcl_GetOpenFile) (Tcl_Interp *interp, const char *chanID, int forWriting, int checkUsage, void **filePtr); /* 167 */
  #endif /* UNIX */

  

  #if !defined(_WIN32) && !defined(MAC_OSX_TCL) /* UNIX */
  #define Tcl_GetOpenFile \
  	(tclStubsPtr->tcl_GetOpenFile) /* 167 */
  #endif /* UNIX */
  #ifdef MAC_OSX_TCL /* MACOSX */
  #define Tcl_GetOpenFile \
  	(tclStubsPtr->tcl_GetOpenFile) /* 167 */
  #endif /* MACOSX */

¹ https://core.tcl-lang.org/tcl/file?name=doc/GetOpnFl.3
² https://core.tcl-lang.org/tcl/file?name=generic/tclDecls.h

Merge request reports