View Ticket
Ticket UUID: 604bb68b5c25a5c670b2f89dba68b92f7c57cb62
Title: How to build Tcl tls on Windows 64 bit (VisualStudio 12) from scratch?
Status: Open Type: Build Problem
Severity: Important Priority: Immediate
Subsystem: Resolution: Open
Last Modified: 2020-10-20 16:11:58
Version Found In: 1.7.16
User Comments:
anonymous added on 2019-05-22 08:17:11:
no ./win folder with makefile.vc does exist. Any idea ?

anonymous (claiming to be R. J. Mathar) added on 2019-09-26 14:36:00:
See also ticket 740a7ac60d of 2017-05-03.

oehhar added on 2020-10-15 10:40:53:

I have build-up a fist sketch of an nmake build system.

I have prepared a branch [bug-604bb68b5c-nmake] with commit [2babef91c5]. Unfortunately, user "oehhar" has no write access to the repository, so it did not commit.

May I ask for commit rights for oehhar or do you prefer a patch ?

Thank you, Harald


oehhar added on 2020-10-20 16:11:58:

Here is the patch starting from checkin [9c32a526ed] for your convenience.

Enjoy, Harald

Index: tls.c
==================================================================
--- tls.c
+++ tls.c
@@ -1774,11 +1774,11 @@
  *	 create the ssl command, initialise ssl context
  *
  *-------------------------------------------------------------------
  */
 
-int Tls_Init(Tcl_Interp *interp) {
+DLLEXPORT int Tls_Init(Tcl_Interp *interp) {
 	const char tlsTclInitScript[] = {
 #include "tls.tcl.h"
             0x00
 	};
 
@@ -1834,11 +1834,11 @@
  *		A standard Tcl error code.
  *
  *------------------------------------------------------*
  */
 
-int Tls_SafeInit(Tcl_Interp *interp) {
+DLLEXPORT int Tls_SafeInit(Tcl_Interp *interp) {
 	dprintf("Called");
 	return(Tls_Init(interp));
 }
 
 /*

Index: tls.h
==================================================================
--- tls.h
+++ tls.h
@@ -21,9 +21,9 @@
 #include <tcl.h>
 
 /*
  * Initialization routines -- our entire public C API.
  */
-int Tls_Init(Tcl_Interp *interp);
-int Tls_SafeInit(Tcl_Interp *interp);
+DLLEXPORT int Tls_Init(Tcl_Interp *interp);
+DLLEXPORT int Tls_SafeInit(Tcl_Interp *interp);
 
 #endif /* _TLS_H */

ADDED   win/README.txt
Index: win/README.txt
==================================================================
--- win/README.txt
+++ win/README.txt
@@ -0,0 +1,66 @@
+	Windows DLL Build instructions using nmake build system
+	2020-10-15 Harald.Oehlmann@elmicron.de
+
+Properties:
+- 32 bit DLL
+- VisualStudio 2015
+Note: Vuisual C++ 6 does not build OpenSSL (long long syntax error)
+- Cygwin32 (temporary helper, please help to replace by tclsh)
+- OpenSSL statically linked to TCLTLS DLL.
+Note: Dynamic linking also works but results in a DLL dependeny on OPENSSL DLL's
+
+1) Build OpenSSL static libraries:
+
+OpenSSL source distribtution unpacked in:
+c:\test\tcltls\Openssl_1_1_1h
+
+- Install Perl from http://strawberryperl.com/download/5.32.0.1/strawberry-perl-5.32.0.1-32bit.msi
+  to C:\perl
+  (ActivePerl failed due to missing 32 bit console module)
+- Install NASM Assembler:
+
+https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/win32/nasm-2.15.05-installer-x86.exe
+  to C:\Program Files (x86)\NASM
+  
+-> Visual Studio x86 native prompt.
+
+set Path=%PATH%;C:\Program Files (x86)\NASM;C:\Perl\perl\bin
+
+perl Configure VC-WIN32 --prefix=c:\test\tcltls\openssl --openssldir=c:\test\tcltls\openssldir no-shared no-filenames threads
+
+nmake
+nmake test
+namke install
+
+2) Build TCLTLS
+
+Unzip distribution in:
+c:\test\tcltls\tcltls-1.7.22
+
+-> start cygwin bash prompt
+
+cd /cygdrive/c/test/tcltls/tcltls-1.7.22
+./gen_dh_params > dh_params.h
+
+od -A n -v -t xC < 'tls.tcl' > tls.tcl.h.new.1
+sed 's@[^0-9A-Fa-f]@@g;s@..@0x&, @g' < tls.tcl.h.new.1 > tls.tcl.h
+rm -f tls.tcl.h.new.1
+
+-> Visual Studio x86 native prompt.
+
+cd C:\test\tcltls\tcltls-1.7.22\win
+
+nmake -f makefile.vc TCLDIR=c:\test\tcl8610 SSL_INSTALL_FOLDER=C:\test\tcltls\openssl
+
+nmake -f makefile.vc install TCLDIR=c:\test\tcl8610 INSTALLDIR=c:\test\tcltls SSL_INSTALL_FOLDER=C:\test\tcltls\openssl
+
+tls.c: 
+Lines 1779, 1839: replace
+int Tls_Init by
+DLLEXPORT int  Tls_Init
+
+tls.h: same change
+
+lappend auto_path {C:\test\tcltls\tls1.7.22}
+package require tls
+

ADDED   win/makefile.vc
Index: win/makefile.vc
==================================================================
--- win/makefile.vc
+++ win/makefile.vc
@@ -0,0 +1,24 @@
+# call nmake with additional parameter SSL_INSTALL_FOLDER= with the
+# OpenSSL instalation folder following.
+
+PROJECT=tls
+DOTVERSION = 1.7.22
+
+PRJ_INCLUDES	= -I"$(SSL_INSTALL_FOLDER)\include"
+PRJ_DEFINES =  -D NO_SSL2 -D NO_SSL3 -D _CRT_SECURE_NO_WARNINGS
+
+PRJ_LIBS = \
+	"$(SSL_INSTALL_FOLDER)\lib\libssl.lib" \
+	"$(SSL_INSTALL_FOLDER)\lib\libcrypto.lib" \
+	WS2_32.LIB GDI32.LIB ADVAPI32.LIB CRYPT32.LIB USER32.LIB
+
+PRJ_OBJS = $(TMP_DIR)\tls.obj \
+               $(TMP_DIR)\tlsBIO.obj \
+               $(TMP_DIR)\tlsIO.obj \
+               $(TMP_DIR)\tlsX509.obj
+
+!include "rules-ext.vc"
+!include "targets.vc"
+
+pkgindex: default-pkgindex
+

ADDED   win/targets.vc
Index: win/targets.vc
==================================================================
--- win/targets.vc
+++ win/targets.vc
@@ -0,0 +1,98 @@
+#------------------------------------------------------------- -*- makefile -*-
+# targets.vc --
+#
+# Part of the nmake based build system for Tcl and its extensions.
+# This file defines some standard targets for the convenience of extensions
+# and can be optionally included by the extension makefile.
+# See TIP 477 (https://core.tcl-lang.org/tips/doc/trunk/tip/477.md) for docs.
+
+$(PROJECT): setup pkgindex $(PRJLIB)
+
+!ifdef PRJ_STUBOBJS
+$(PROJECT): $(PRJSTUBLIB)
+$(PRJSTUBLIB): $(PRJ_STUBOBJS)
+	$(LIBCMD) $**
+
+$(PRJ_STUBOBJS):
+	$(CCSTUBSCMD) %s
+!endif # PRJ_STUBOBJS
+
+!ifdef PRJ_MANIFEST
+$(PROJECT): $(PRJLIB).manifest
+$(PRJLIB).manifest: $(PRJ_MANIFEST)
+	@nmakehlp -s << $** >$@
+@MACHINE@	  $(MACHINE:IX86=X86)
+<<
+!endif
+
+!if "$(PROJECT)" != "tcl" && "$(PROJECT)" != "tk"
+$(PRJLIB): $(PRJ_OBJS) $(RESFILE)
+!if $(STATIC_BUILD)
+       $(LIBCMD) $**
+!else
+       $(DLLCMD) $**
+       $(_VC_MANIFEST_EMBED_DLL)
+!endif
+       -@del $*.exp
+!endif
+
+!if "$(PRJ_HEADERS)" != "" && "$(PRJ_OBJS)" != ""
+$(PRJ_OBJS): $(PRJ_HEADERS)
+!endif
+
+# If parent makefile has defined stub objects, add their installation
+# to the default install
+!if "$(PRJ_STUBOBJS)" != ""
+default-install: default-install-stubs
+!endif
+
+# Unlike the other default targets, these cannot be in rules.vc because
+# the executed command depends on existence of macro PRJ_HEADERS_PUBLIC
+# that the parent makefile will not define until after including rules-ext.vc
+!if "$(PRJ_HEADERS_PUBLIC)" != ""
+default-install: default-install-headers
+default-install-headers:
+	@echo Installing headers to '$(INCLUDE_INSTALL_DIR)'
+	@for %f in ($(PRJ_HEADERS_PUBLIC)) do @$(COPY) %f "$(INCLUDE_INSTALL_DIR)"
+!endif
+
+!if "$(DISABLE_STANDARD_TARGETS)" == ""
+DISABLE_STANDARD_TARGETS = 0
+!endif
+
+!if "$(DISABLE_TARGET_setup)" == ""
+DISABLE_TARGET_setup = 0
+!endif
+!if "$(DISABLE_TARGET_install)" == ""
+DISABLE_TARGET_install = 0
+!endif
+!if "$(DISABLE_TARGET_clean)" == ""
+DISABLE_TARGET_clean = 0
+!endif
+!if "$(DISABLE_TARGET_test)" == ""
+DISABLE_TARGET_test = 0
+!endif
+!if "$(DISABLE_TARGET_shell)" == ""
+DISABLE_TARGET_shell = 0
+!endif
+
+!if !$(DISABLE_STANDARD_TARGETS)
+!if !$(DISABLE_TARGET_setup)
+setup: default-setup
+!endif
+!if !$(DISABLE_TARGET_install)
+install: default-install
+!endif
+!if !$(DISABLE_TARGET_clean)
+clean: default-clean
+realclean: hose
+hose: default-hose
+distclean: realclean default-distclean
+!endif
+!if !$(DISABLE_TARGET_test)
+test: default-test
+!endif
+!if !$(DISABLE_TARGET_shell)
+shell: default-shell
+!endif
+!endif # DISABLE_STANDARD_TARGETS