Tk Source Code

Check-in [0cb2832c]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:make loading of tk.dll in cygwin possible reduce command table size
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | core-8-5-branch
Files: files | file ages | folders
SHA1: 0cb2832ca4b8edcf4e2b04919723abad80cae0a4
User & Date: jan.nijtmans 2012-04-18 04:40:23
Context
2012-04-18
12:30
compiler warnings check-in: e0d15594 user: dgp tags: core-8-5-branch
04:56
make loading of tk.dll in cygwin possible reduce command table size check-in: 7b50f557 user: jan.nijtmans tags: trunk
04:40
make loading of tk.dll in cygwin possible reduce command table size check-in: 0cb2832c user: jan.nijtmans tags: core-8-5-branch
2012-04-17
21:12
make loading of tk.dll in cygwin possible reduce command table size check-in: db6c2704 user: jan.nijtmans tags: core-8-4-branch
2012-04-13
19:42
[Bug 3517448] TclKit build fails (unresolved __strtoi64) check-in: c421372e user: jan.nijtmans tags: core-8-5-branch
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to generic/tkWindow.c.

59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80

/*
 * Default values for "changes" and "atts" fields of TkWindows. Note that Tk
 * always requests all events for all windows, except StructureNotify events
 * on internal windows: these events are generated internally.
 */

static XWindowChanges defChanges = {
    0, 0, 1, 1, 0, 0, Above
};
#define ALL_EVENTS_MASK \
    KeyPressMask|KeyReleaseMask|ButtonPressMask|ButtonReleaseMask| \
    EnterWindowMask|LeaveWindowMask|PointerMotionMask|ExposureMask| \
    VisibilityChangeMask|PropertyChangeMask|ColormapChangeMask
static XSetWindowAttributes defAtts= {
    None,			/* background_pixmap */
    0,				/* background_pixel */
    CopyFromParent,		/* border_pixmap */
    0,				/* border_pixel */
    NorthWestGravity,		/* bit_gravity */
    NorthWestGravity,		/* win_gravity */
    NotUseful,			/* backing_store */







|






|







59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80

/*
 * Default values for "changes" and "atts" fields of TkWindows. Note that Tk
 * always requests all events for all windows, except StructureNotify events
 * on internal windows: these events are generated internally.
 */

static const XWindowChanges defChanges = {
    0, 0, 1, 1, 0, 0, Above
};
#define ALL_EVENTS_MASK \
    KeyPressMask|KeyReleaseMask|ButtonPressMask|ButtonReleaseMask| \
    EnterWindowMask|LeaveWindowMask|PointerMotionMask|ExposureMask| \
    VisibilityChangeMask|PropertyChangeMask|ColormapChangeMask
static const XSetWindowAttributes defAtts= {
    None,			/* background_pixmap */
    0,				/* background_pixel */
    CopyFromParent,		/* border_pixmap */
    0,				/* border_pixel */
    NorthWestGravity,		/* bit_gravity */
    NorthWestGravity,		/* win_gravity */
    NotUseful,			/* backing_store */
89
90
91
92
93
94
95



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
};

/*
 * The following structure defines all of the commands supported by Tk, and
 * the C functions that execute them.
 */




typedef struct {
    char *name;			/* Name of command. */
    Tcl_CmdProc *cmdProc;	/* Command's string-based function. */
    Tcl_ObjCmdProc *objProc;	/* Command's object-based function. */
    int isSafe;			/* If !0, this command will be exposed in a
				 * safe interpreter. Otherwise it will be
				 * hidden in a safe interpreter. */
    int passMainWindow;		/* 0 means provide NULL clientData to command
				 * function; 1 means pass main window as
				 * clientData to command function. */
} TkCmd;

static TkCmd commands[] = {
    /*
     * Commands that are part of the intrinsics:
     */

    {"bell",		NULL,			Tk_BellObjCmd,		0, 1},
    {"bind",		NULL,			Tk_BindObjCmd,		1, 1},
    {"bindtags",	NULL,			Tk_BindtagsObjCmd,	1, 1},
    {"clipboard",	NULL,			Tk_ClipboardObjCmd,	0, 1},
    {"destroy",		NULL,			Tk_DestroyObjCmd,	1, 1},
    {"event",		NULL,			Tk_EventObjCmd,		1, 1},
    {"focus",		NULL,			Tk_FocusObjCmd,		1, 1},
    {"font",		NULL,			Tk_FontObjCmd,		1, 1},
    {"grab",		NULL,			Tk_GrabObjCmd,		0, 1},
    {"grid",		NULL,			Tk_GridObjCmd,		1, 1},
    {"image",		NULL,			Tk_ImageObjCmd,		1, 1},
    {"lower",		NULL,			Tk_LowerObjCmd,		1, 1},
    {"option",		NULL,			Tk_OptionObjCmd,	1, 1},
    {"pack",		NULL,			Tk_PackObjCmd,		1, 1},
    {"place",		NULL,			Tk_PlaceObjCmd,		1, 0},
    {"raise",		NULL,			Tk_RaiseObjCmd,		1, 1},
    {"selection",	NULL,			Tk_SelectionObjCmd,	0, 1},
    {"tk",		NULL,			Tk_TkObjCmd,		1, 1},
    {"tkwait",		NULL,			Tk_TkwaitObjCmd,	1, 1},
    {"update",		NULL,			Tk_UpdateObjCmd,	1, 1},
    {"winfo",		NULL,			Tk_WinfoObjCmd,		1, 1},
    {"wm",		NULL,			Tk_WmObjCmd,		0, 1},

    /*
     * Default widget class commands.
     */

    {"button",		NULL,			Tk_ButtonObjCmd,	1, 0},
    {"canvas",		NULL,			Tk_CanvasObjCmd,	1, 1},
    {"checkbutton",	NULL,			Tk_CheckbuttonObjCmd,	1, 0},
    {"entry",		NULL,			Tk_EntryObjCmd,		1, 0},
    {"frame",		NULL,			Tk_FrameObjCmd,		1, 0},
    {"label",		NULL,			Tk_LabelObjCmd,		1, 0},
    {"labelframe",	NULL,			Tk_LabelframeObjCmd,	1, 0},
    {"listbox",		NULL,			Tk_ListboxObjCmd,	1, 0},
    {"menubutton",	NULL,			Tk_MenubuttonObjCmd,	1, 0},
    {"message",		NULL,			Tk_MessageObjCmd,	1, 0},
    {"panedwindow",	NULL,			Tk_PanedWindowObjCmd,	1, 0},
    {"radiobutton",	NULL,			Tk_RadiobuttonObjCmd,	1, 0},
    {"scale",		NULL,			Tk_ScaleObjCmd,		1, 0},
    {"scrollbar",	Tk_ScrollbarCmd,	NULL,			1, 1},
    {"spinbox",		NULL,			Tk_SpinboxObjCmd,	1, 0},
    {"text",		NULL,			Tk_TextObjCmd,		1, 1},
    {"toplevel",	NULL,			Tk_ToplevelObjCmd,	0, 0},

    /*
     * Classic widget class commands.
     */

    {"::tk::button",	NULL,			Tk_ButtonObjCmd,	1, 0},
    {"::tk::canvas",	NULL,			Tk_CanvasObjCmd,	1, 1},
    {"::tk::checkbutton",NULL,			Tk_CheckbuttonObjCmd,	1, 0},
    {"::tk::entry",	NULL,			Tk_EntryObjCmd,		1, 0},
    {"::tk::frame",	NULL,			Tk_FrameObjCmd,		1, 0},
    {"::tk::label",	NULL,			Tk_LabelObjCmd,		1, 0},
    {"::tk::labelframe",NULL,			Tk_LabelframeObjCmd,	1, 0},
    {"::tk::listbox",	NULL,			Tk_ListboxObjCmd,	1, 0},
    {"::tk::menubutton",NULL,			Tk_MenubuttonObjCmd,	1, 0},
    {"::tk::message",	NULL,			Tk_MessageObjCmd,	1, 0},
    {"::tk::panedwindow",NULL,			Tk_PanedWindowObjCmd,	1, 0},
    {"::tk::radiobutton",NULL,			Tk_RadiobuttonObjCmd,	1, 0},
    {"::tk::scale",	NULL,			Tk_ScaleObjCmd,		1, 0},
    {"::tk::scrollbar",	Tk_ScrollbarCmd,	NULL,			1, 1},
    {"::tk::spinbox",	NULL,			Tk_SpinboxObjCmd,	1, 0},
    {"::tk::text",	NULL,			Tk_TextObjCmd,		1, 1},
    {"::tk::toplevel",	NULL,			Tk_ToplevelObjCmd,	0, 0},

    /*
     * Standard dialog support. Note that the Unix/X11 platform implements
     * these commands differently (via the script library).
     */

#if defined(__WIN32__) || defined(MAC_OSX_TK)
    {"tk_chooseColor",	NULL,			Tk_ChooseColorObjCmd,	0, 1},
    {"tk_chooseDirectory", NULL,		Tk_ChooseDirectoryObjCmd,0,1},
    {"tk_getOpenFile",	NULL,			Tk_GetOpenFileObjCmd,	0, 1},
    {"tk_getSaveFile",	NULL,			Tk_GetSaveFileObjCmd,	0, 1},
    {"tk_messageBox",	NULL,			Tk_MessageBoxObjCmd,	0, 1},
#endif

    /*
     * Misc.
     */

#if defined(MAC_OSX_TK)
    {"::tk::unsupported::MacWindowStyle",
			NULL,			TkUnsupported1ObjCmd,	1, 1},
#endif
    {NULL,		NULL,			NULL,			0, 0}
};

/*
 * The variables and table below are used to parse arguments from the "argv"
 * variable in Tk_Init.
 */








>
>
>

|


<
<
|
<
<
<


|




|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|





|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|






|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|







|
|
|
|
|








|

|







89
90
91
92
93
94
95
96
97
98
99
100
101
102


103



104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
};

/*
 * The following structure defines all of the commands supported by Tk, and
 * the C functions that execute them.
 */

#define ISSAFE 1
#define PASSMAINWINDOW 2

typedef struct {
    const char *name;			/* Name of command. */
    Tcl_CmdProc *cmdProc;	/* Command's string-based function. */
    Tcl_ObjCmdProc *objProc;	/* Command's object-based function. */


    int flags;



} TkCmd;

static const TkCmd commands[] = {
    /*
     * Commands that are part of the intrinsics:
     */

    {"bell",		NULL,			Tk_BellObjCmd,		PASSMAINWINDOW},
    {"bind",		NULL,			Tk_BindObjCmd,		PASSMAINWINDOW|ISSAFE},
    {"bindtags",	NULL,			Tk_BindtagsObjCmd,	PASSMAINWINDOW|ISSAFE},
    {"clipboard",	NULL,			Tk_ClipboardObjCmd,	PASSMAINWINDOW},
    {"destroy",		NULL,			Tk_DestroyObjCmd,	PASSMAINWINDOW|ISSAFE},
    {"event",		NULL,			Tk_EventObjCmd,		PASSMAINWINDOW|ISSAFE},
    {"focus",		NULL,			Tk_FocusObjCmd,		PASSMAINWINDOW|ISSAFE},
    {"font",		NULL,			Tk_FontObjCmd,		PASSMAINWINDOW|ISSAFE},
    {"grab",		NULL,			Tk_GrabObjCmd,		PASSMAINWINDOW},
    {"grid",		NULL,			Tk_GridObjCmd,		PASSMAINWINDOW|ISSAFE},
    {"image",		NULL,			Tk_ImageObjCmd,		PASSMAINWINDOW|ISSAFE},
    {"lower",		NULL,			Tk_LowerObjCmd,		PASSMAINWINDOW|ISSAFE},
    {"option",		NULL,			Tk_OptionObjCmd,	PASSMAINWINDOW|ISSAFE},
    {"pack",		NULL,			Tk_PackObjCmd,		PASSMAINWINDOW|ISSAFE},
    {"place",		NULL,			Tk_PlaceObjCmd,		ISSAFE},
    {"raise",		NULL,			Tk_RaiseObjCmd,		PASSMAINWINDOW|ISSAFE},
    {"selection",	NULL,			Tk_SelectionObjCmd,	PASSMAINWINDOW},
    {"tk",		NULL,			Tk_TkObjCmd,		PASSMAINWINDOW|ISSAFE},
    {"tkwait",		NULL,			Tk_TkwaitObjCmd,	PASSMAINWINDOW|ISSAFE},
    {"update",		NULL,			Tk_UpdateObjCmd,	PASSMAINWINDOW|ISSAFE},
    {"winfo",		NULL,			Tk_WinfoObjCmd,		PASSMAINWINDOW|ISSAFE},
    {"wm",		NULL,			Tk_WmObjCmd,		PASSMAINWINDOW},

    /*
     * Default widget class commands.
     */

    {"button",		NULL,			Tk_ButtonObjCmd,	ISSAFE},
    {"canvas",		NULL,			Tk_CanvasObjCmd,	PASSMAINWINDOW|ISSAFE},
    {"checkbutton",	NULL,			Tk_CheckbuttonObjCmd,	ISSAFE},
    {"entry",		NULL,			Tk_EntryObjCmd,		ISSAFE},
    {"frame",		NULL,			Tk_FrameObjCmd,		ISSAFE},
    {"label",		NULL,			Tk_LabelObjCmd,		ISSAFE},
    {"labelframe",	NULL,			Tk_LabelframeObjCmd,	ISSAFE},
    {"listbox",		NULL,			Tk_ListboxObjCmd,	ISSAFE},
    {"menubutton",	NULL,			Tk_MenubuttonObjCmd,	ISSAFE},
    {"message",		NULL,			Tk_MessageObjCmd,	ISSAFE},
    {"panedwindow",	NULL,			Tk_PanedWindowObjCmd,	ISSAFE},
    {"radiobutton",	NULL,			Tk_RadiobuttonObjCmd,	ISSAFE},
    {"scale",		NULL,			Tk_ScaleObjCmd,		ISSAFE},
    {"scrollbar",	Tk_ScrollbarCmd,	NULL,			PASSMAINWINDOW|ISSAFE},
    {"spinbox",		NULL,			Tk_SpinboxObjCmd,	ISSAFE},
    {"text",		NULL,			Tk_TextObjCmd,		PASSMAINWINDOW|ISSAFE},
    {"toplevel",	NULL,			Tk_ToplevelObjCmd,	0, 0},

    /*
     * Classic widget class commands.
     */

    {"::tk::button",	NULL,			Tk_ButtonObjCmd,	ISSAFE},
    {"::tk::canvas",	NULL,			Tk_CanvasObjCmd,	PASSMAINWINDOW|ISSAFE},
    {"::tk::checkbutton",NULL,			Tk_CheckbuttonObjCmd,	ISSAFE},
    {"::tk::entry",	NULL,			Tk_EntryObjCmd,		ISSAFE},
    {"::tk::frame",	NULL,			Tk_FrameObjCmd,		ISSAFE},
    {"::tk::label",	NULL,			Tk_LabelObjCmd,		ISSAFE},
    {"::tk::labelframe",NULL,			Tk_LabelframeObjCmd,	ISSAFE},
    {"::tk::listbox",	NULL,			Tk_ListboxObjCmd,	ISSAFE},
    {"::tk::menubutton",NULL,			Tk_MenubuttonObjCmd,	ISSAFE},
    {"::tk::message",	NULL,			Tk_MessageObjCmd,	ISSAFE},
    {"::tk::panedwindow",NULL,			Tk_PanedWindowObjCmd,	ISSAFE},
    {"::tk::radiobutton",NULL,			Tk_RadiobuttonObjCmd,	ISSAFE},
    {"::tk::scale",	NULL,			Tk_ScaleObjCmd,		ISSAFE},
    {"::tk::scrollbar",	Tk_ScrollbarCmd,	NULL,			PASSMAINWINDOW|ISSAFE},
    {"::tk::spinbox",	NULL,			Tk_SpinboxObjCmd,	ISSAFE},
    {"::tk::text",	NULL,			Tk_TextObjCmd,		PASSMAINWINDOW|ISSAFE},
    {"::tk::toplevel",	NULL,			Tk_ToplevelObjCmd,	0},

    /*
     * Standard dialog support. Note that the Unix/X11 platform implements
     * these commands differently (via the script library).
     */

#if defined(__WIN32__) || defined(MAC_OSX_TK)
    {"tk_chooseColor",	NULL,			Tk_ChooseColorObjCmd,	PASSMAINWINDOW},
    {"tk_chooseDirectory", NULL,		Tk_ChooseDirectoryObjCmd,PASSMAINWINDOW},
    {"tk_getOpenFile",	NULL,			Tk_GetOpenFileObjCmd,	PASSMAINWINDOW},
    {"tk_getSaveFile",	NULL,			Tk_GetSaveFileObjCmd,	PASSMAINWINDOW},
    {"tk_messageBox",	NULL,			Tk_MessageBoxObjCmd,	PASSMAINWINDOW},
#endif

    /*
     * Misc.
     */

#if defined(MAC_OSX_TK)
    {"::tk::unsupported::MacWindowStyle",
			NULL,			TkUnsupported1ObjCmd,	PASSMAINWINDOW|ISSAFE},
#endif
    {NULL,		NULL,			NULL,			0}
};

/*
 * The variables and table below are used to parse arguments from the "argv"
 * variable in Tk_Init.
 */

945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
     */

    isSafe = Tcl_IsSafe(interp);
    for (cmdPtr = commands; cmdPtr->name != NULL; cmdPtr++) {
	if ((cmdPtr->cmdProc == NULL) && (cmdPtr->objProc == NULL)) {
	    Tcl_Panic("TkCreateMainWindow: builtin command with NULL string and object procs");
	}
	if (cmdPtr->passMainWindow) {
	    clientData = (ClientData) tkwin;
	} else {
	    clientData = (ClientData) NULL;
	}
	if (cmdPtr->cmdProc != NULL) {
	    Tcl_CreateCommand(interp, cmdPtr->name, cmdPtr->cmdProc,
		    clientData, (void (*) _ANSI_ARGS_((ClientData))) NULL);
	} else {
	    Tcl_CreateObjCommand(interp, cmdPtr->name, cmdPtr->objProc,
		    clientData, NULL);
	}
	if (isSafe) {
	    if (!(cmdPtr->isSafe)) {
		Tcl_HideCommand(interp, cmdPtr->name, cmdPtr->name);
	    }
	}
    }

    TkCreateMenuCmd(interp);








|












|







943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
     */

    isSafe = Tcl_IsSafe(interp);
    for (cmdPtr = commands; cmdPtr->name != NULL; cmdPtr++) {
	if ((cmdPtr->cmdProc == NULL) && (cmdPtr->objProc == NULL)) {
	    Tcl_Panic("TkCreateMainWindow: builtin command with NULL string and object procs");
	}
	if (cmdPtr->flags & PASSMAINWINDOW) {
	    clientData = (ClientData) tkwin;
	} else {
	    clientData = (ClientData) NULL;
	}
	if (cmdPtr->cmdProc != NULL) {
	    Tcl_CreateCommand(interp, cmdPtr->name, cmdPtr->cmdProc,
		    clientData, (void (*) _ANSI_ARGS_((ClientData))) NULL);
	} else {
	    Tcl_CreateObjCommand(interp, cmdPtr->name, cmdPtr->objProc,
		    clientData, NULL);
	}
	if (isSafe) {
	    if (!(cmdPtr->flags & ISSAFE)) {
		Tcl_HideCommand(interp, cmdPtr->name, cmdPtr->name);
	    }
	}
    }

    TkCreateMenuCmd(interp);

Changes to unix/Makefile.in.

712
713
714
715
716
717
718


719




720

721
722
723
724
725
726
727
	    fi
	@if test "x$(TK_SHARED_BUILD)" = "x1"; then \
	    echo "Creating package index $(PKG_INDEX)"; \
	    rm -f "$(PKG_INDEX)"; \
	    (\
	    echo "if {[catch {package present Tcl 8.5.0}]} { return }";\
	    relative=`echo | awk '{ORS=" "; split("$(TK_PKG_DIR)",a,"/"); for (f in a) {print ".."}}'`;\


	    echo "package ifneeded Tk $(MAJOR_VERSION).$(MINOR_VERSION)$(PATCH_LEVEL)\




		[list load [file join \$$dir $${relative}$(TK_LIB_FILE)] Tk]";\

	    ) > "$(PKG_INDEX)"; \
	    fi
	@echo "Installing $(LIB_FILE) to $(LIB_INSTALL_DIR)/"
	@@INSTALL_LIB@
	@chmod 555 "$(LIB_INSTALL_DIR)"/$(LIB_FILE)
	@echo "Installing wish@EXEEXT@ as $(BIN_INSTALL_DIR)/wish$(VERSION)@EXEEXT@"
	@$(INSTALL_PROGRAM) wish@EXEEXT@ "$(BIN_INSTALL_DIR)"/wish$(VERSION)@EXEEXT@







>
>
|
>
>
>
>
|
>







712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
	    fi
	@if test "x$(TK_SHARED_BUILD)" = "x1"; then \
	    echo "Creating package index $(PKG_INDEX)"; \
	    rm -f "$(PKG_INDEX)"; \
	    (\
	    echo "if {[catch {package present Tcl 8.5.0}]} { return }";\
	    relative=`echo | awk '{ORS=" "; split("$(TK_PKG_DIR)",a,"/"); for (f in a) {print ".."}}'`;\
	    echo "if {[string match CYGWIN* \$$::tcl_platform(os)]} {";\
	    echo "    if {([info exists ::env(DISPLAY)] || [lsearch -exact \$$::argv -display] > -1)} {";\
	    echo "	package ifneeded Tk $(MAJOR_VERSION).$(MINOR_VERSION)$(PATCH_LEVEL) [list load [file join \$$dir $${relative}.. bin $(TK_LIB_FILE)] Tk]";\
	    echo "    } else {";\
	    echo "	package ifneeded Tk $(MAJOR_VERSION).$(MINOR_VERSION)$(PATCH_LEVEL) [list load [file join \$$dir $${relative}.. bin tk${MAJOR_VERSION}${MINOR_VERSION}.dll] Tk]";\
	    echo "    }";\
	    echo "} else {";\
	    echo "    package ifneeded Tk $(MAJOR_VERSION).$(MINOR_VERSION)$(PATCH_LEVEL) [list load [file join \$$dir $${relative}$(TK_LIB_FILE)] Tk]";\
	    echo "}";\
	    ) > "$(PKG_INDEX)"; \
	    fi
	@echo "Installing $(LIB_FILE) to $(LIB_INSTALL_DIR)/"
	@@INSTALL_LIB@
	@chmod 555 "$(LIB_INSTALL_DIR)"/$(LIB_FILE)
	@echo "Installing wish@EXEEXT@ as $(BIN_INSTALL_DIR)/wish$(VERSION)@EXEEXT@"
	@$(INSTALL_PROGRAM) wish@EXEEXT@ "$(BIN_INSTALL_DIR)"/wish$(VERSION)@EXEEXT@