web-dev-qa-db-ja.com

Visual Studio 2017を使用してWindows上でOpenSSLを構築する方法は?

OpenSSLを使用しようとしていますが、コンパイルのステップで立ち往生しています。 OpenSSLプロジェクトには非常にわかりにくい(悪い)ドキュメントがあります。

Visual Studio 2017を使用してWindowsで最新のOpenSSLバージョンをビルドする方法について、実際のヘルプはありますか?

OpenSSLの公式サイトに役立つ情報が見つかりませんでした。はい、インターネットにはOpenSSLのコンパイルに関する多くの投稿がありますが、それらはすべて時代遅れです。

12
AeroSun

VS2017ではなく以前のバージョンを使用しました。ほぼ同じだと思います。手順の概要は次のとおりです。

  1. Perl(ActiveStateまたはStrawberry)をインストールします

  2. NASMをインストールする

  3. PerlとNASMの両方が%PATH%にあることを確認してください

  4. 管理者権限でVisual Studio開発者コマンドプロンプトを起動します(32ビットOpenSSLを構築する場合は32ビット版を、64ビットOpenSSLを構築する場合は64ビット版を使用してください)

  5. OpenSSLソースディレクトリのルートからPerl Configure VC-WIN32、32ビットOpenSSLまたはPerl Configure VC-WIN64A 64ビットOpenSSLが必要な場合

  6. nmakeと入力します

  7. 入る nmake test

  8. 入る nmake install

いずれかの段階で何か問題が発生した場合は、 [〜#〜] install [〜#〜] ファイルと NOTES.WIN ファイル。

32
Matt Caswell

OpenSSL 1.0.2の場合、ビルドを行うPythonスクリプトを作成しました。これらのスクリプトを作成する習慣があります。何かを構築します。

スクリプトはOpenSSL 1.0.2用に作成されています。おそらく、OpenSSL 1.1.0の変更は最小限です。

スクリプトは次のとおりです。

import os
from subprocess import call
import sys
import re

vs_version = "140"
compile_flags = "-no-asm -no-shared"


openssl_32_flag = "VC-WIN32"
openssl_64_flag = "VC-WIN64A"

src_32_suffix = "_" + "vs" + vs_version + "_32"
src_64_suffix = "_" + "vs" + vs_version + "_64"

vs_tools_env_var = "VS" + vs_version + "COMNTOOLS"

if len(sys.argv) < 2:
    print("First argument must be the tar.gz file of OpenSSL source")
    exit(1)

if len(sys.argv) < 3:
    print("Second argument must be 32 or 64")
    exit(1)

filename = sys.argv[1]
dirname  = filename.replace(".tar.gz","")
working_dir = os.getcwd()
Arch = sys.argv[2]

if Arch != "32" and Arch != "64":
    print("Second argument must be 32 or 64")
    exit(1)


if not bool(re.match("(openssl-){1}(\d)+(.)(\d)+(.)(\d)+(\w)+(.tar.gz)",filename)):
    print("The file given doesn't seem to be an openssl source file. It must be in the form: openssl-x.y.zw.tar.gz")
    exit(1)


call("7z x " + filename) #extract the .gz file

dirname_src_32 = dirname + src_32_suffix
dirname_src_64 = dirname + src_64_suffix
dirname_bin_32 = dirname + src_32_suffix + "_build"
dirname_bin_64 = dirname + src_64_suffix + "_build"

openssl_tar_file = filename[0:-3]

if Arch == "32":
#extract tar file for 32
    call("7z x " + openssl_tar_file)
    os.rename(dirname, dirname_src_32)

#Compile 32
    os.chdir(dirname_src_32)

    call("Perl Configure " + openssl_32_flag + " --prefix=" + os.path.join(working_dir,dirname_bin_32) + " " + compile_flags,Shell=True)
    call(r"ms\do_ms.bat",Shell=True)
    call(r"nmake -f ms\nt.mak",Shell=True)
    call(r"nmake -f ms\nt.mak instalL",Shell=True)

    print("32-bit compilation complete.")

#Go back to base dir
os.chdir(working_dir)
################

if Arch == "64":
#extract for 64
    call("7z x " + openssl_tar_file)
    os.rename(dirname, dirname_src_64)

#Compile 64
    os.chdir(dirname_src_64)

    call("Perl Configure " + openssl_64_flag + " --prefix=" + os.path.join(working_dir,dirname_bin_64) + " " + compile_flags,Shell=True)
    call(r"ms\do_ms.bat",Shell=True)
    call(r"nmake -f ms\nt.mak",Shell=True)
    call(r"nmake -f ms\nt.mak instalL",Shell=True)

    print("64-bit compilation complete.")

#Go back to base dir
os.chdir(working_dir)
################

os.remove(openssl_tar_file)

オプション1:スクリプトをCompileOpenSSL.pyに保存し、名前の形式がopenssl-1.X.Y.tar.gzであると予想されるOpenSSLソースファイルをダウンロードします。ここで、コマンドプロンプトのグローバルスコープから7ZipとPerlにアクセスでき、正しいMSVC変数がロードされている(たとえば、vsvars32.batを使用して、または適切なターミナルを起動している)と仮定して、次を実行します。

python CompileOpenSSL.py openssl-1.X.Y.tar.gz 32

MSVC 32ビットを使用している場合、または

python CompileOpenSSL.py openssl-1.X.Y.tar.gz 64

mSVC 64ビットの場合。

オプション2:スクリプトが手動で行うことを行います。スクリプトは単にアーカイブを抽出し、ソースを設定し、do_ms.batを実行してからnmakeを実行します。ソースに従ってください、それは動作します。

がんばろう!

  1. visual studio cmdを使用してsslディレクトリに移動し、システムパスにPerlとnasmを追加してから、次を入力します。

  2. Perl Configure --openssldir=D:OpenSSLdirectory VC-WIN32

  3. ms\do_ms.bat

  4. nmake -f ms\ntdll.mak

  5. nmake -f ms\ntdll.mak install

  6. ( 楽しい。 )

量子物理学者の修正版pythonスクリプト

OpenSSL 1.0.xまたはOpenSSL 1.1.xをコンパイルできます

複数のバージョンのVisual Studio 2017/2019が含まれている状態でコンパイルできます。

1)ファイルを作成します:CompileOpenSSL.py

import os
import os.path
from subprocess import call
import shutil
import sys
import re
import argparse

# args
parser = argparse.ArgumentParser()
parser.add_argument("-f", "--filename", help="First argument must be the tar.gz file of OpenSSL source", required=True)
parser.add_argument("-a", "--Arch", help="Second argument must be x86 or AMD64", required=True)
parser.add_argument("-v", "--vs_version", help="Visual Studio version (eg:90, 140, 150)", required=True)
parser.set_defaults(writeVersionInfos=False)
args = parser.parse_args()

compile_flags = "-no-asm"
#compile_flags = "-no-asm -no-shared"

openssl_32_flag = "VC-WIN32"
openssl_64_flag = "VC-WIN64A"

working_dir = os.getcwd()

dirname  = args.filename.replace(".tar.gz","")

src_32_suffix = "_" + "vs" + args.vs_version + "_32"
src_64_suffix = "_" + "vs" + args.vs_version + "_64"

vs_tools_env_var = "VS" + args.vs_version + "COMNTOOLS"


if args.Arch != "x86" and args.Arch != "AMD64":
    print("Second argument must be x86 or AMD64")
    exit(1)


if not bool(re.match("(openssl-){1}(\d)+(.)(\d)+(.)(\d)+(\w)+(.tar.gz)",args.filename)):
    print("The file given doesn't seem to be an openssl source file. It must be in the form: openssl-x.y.zw.tar.gz")
    exit(1)


call("7z x -y " + args.filename) #extract the .gz file

dirname_src_32 = dirname + src_32_suffix
dirname_src_64 = dirname + src_64_suffix
dirname_bin_32 = dirname + src_32_suffix + "_build"
dirname_bin_64 = dirname + src_64_suffix + "_build"

openssl_tar_file = args.filename[0:-3]

if args.Arch == "x86":

#delete previous directories
    shutil.rmtree(os.getcwd()+'/'+dirname, ignore_errors=True)
    shutil.rmtree(os.getcwd()+'/'+dirname_src_32, ignore_errors=True)

#extract tar file for 32

    call("7z x -y " + openssl_tar_file)
    os.rename(dirname, dirname_src_32)

#Compile 32
    os.chdir(dirname_src_32)

    print("Perl Configure " + openssl_32_flag + " --prefix=" + os.path.join(working_dir,dirname_bin_32) + " " + compile_flags)
    call("Perl Configure " + openssl_32_flag + " --prefix=" + os.path.join(working_dir,dirname_bin_32) + " " + compile_flags,Shell=True)

    if( os.path.exists("ms/do_ms.bat") ):
        call("ms\do_ms.bat",Shell=True)
        print(os.getcwd())
        call("nmake -f ms/ntdll.mak",Shell=True)
        call("nmake -f ms/ntdll.mak install",Shell=True)
    else:
        call("nmake",Shell=True)
        call("nmake test",Shell=True)
        call("nmake install",Shell=True)

    print("32-bit compilation complete.")

#Go back to base dir
os.chdir(working_dir)
################

if args.Arch == "AMD64":

#delete previous directories
    shutil.rmtree(os.getcwd()+'/'+dirname, ignore_errors=True)
    shutil.rmtree(os.getcwd()+'/'+dirname_src_64, ignore_errors=True)


#extract for 64
    call("7z x -y " + openssl_tar_file)
    os.rename(dirname, dirname_src_64)

#Compile 64
    os.chdir(dirname_src_64)

    call("Perl Configure " + openssl_64_flag + " --prefix=" + os.path.join(working_dir,dirname_bin_64) + " " + compile_flags,Shell=True)
    if( os.path.exists("ms\do_ms.bat") ):
        call("ms\do_win64a.bat",Shell=True)
        call("nmake -f ms/ntdll.mak",Shell=True)
        call("nmake -f ms/ntdll.mak install",Shell=True)
    else:
        call("nmake",Shell=True)
        call("nmake test",Shell=True)
        call("nmake install",Shell=True)

    print("64-bit compilation complete.")

#Go back to base dir
os.chdir(working_dir)
################

os.remove(openssl_tar_file)

2)ファイルを作成します:CompileOpenSSL_vs.cmd

ECHO  --------------------------------------
ECHO Require Python, 7Zip, Perl and NASM in PATH
ECHO  --------------------------------------

Rem ------------------------------------------------------
Rem TO CONFIGURE -----------------------------------------
Rem ------------------------------------------------------

Rem SET YOUR LOCAL PATHS-----------------------------------------
SET PATH=C:\Program Files (x86)\7-Zip;C:\Perl64\bin;M:\Backup\Coders\_tools\7-Zip\;%PATH% 

Rem SET YOUR OPENSSL ARCHIVE-----------------------------------------
REM SET FILENAME=openssl-1.0.2r.tar.gz 
SET FILENAME=openssl-1.1.1b.tar.gz

Rem SET THE VERSION OF YOUR VISUAL STUDIO-----------------------------------------
SET VSVERSION=%1


Rem ------------------------------------------------------
Rem COMPILATION LAUNCH -----------------------------------
Rem ------------------------------------------------------

Rem UTILS PATH-----
SET VSCOMNTOOLSNAME=VS%VSVERSION%COMNTOOLS

Rem Pick the good path for Visual Studio-----------------------------------------
IF %VSVERSION% GEQ 150 (
    Echo DO NOT FORGET TO ADD A SYSTEM VARIABLE %VSCOMNTOOLSNAME% - like: "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\"
    SET VCVARPATH="%%%VSCOMNTOOLSNAME%%%..\..\VC\Auxiliary\Build\vcvarsall.bat"
) ELSE (
    SET VCVARPATH="%%%VSCOMNTOOLSNAME%%%..\..\VC\vcvarsall.bat"
)

Rem Set env -----------------------------------------
@pushd "%~dp0"
call %VCVARPATH% %2
@popd

Rem ------------------------------------------------------
Rem TEST APP EXIST -----------------------------------
Rem ------------------------------------------------------

where /q 7z.exe
IF ERRORLEVEL 1 (
    ECHO The application "7z.exe" is missing. Ensure to add/install it to the PATH in beginning of this script, check SET PATH
    PAUSE
    EXIT /B
)

where /q Perl.exe
IF ERRORLEVEL 1 (
    ECHO The application "Perl.exe" is missing. Ensure to add/install it to the PATH in beginning of this script, check SET PATH
    PAUSE
    EXIT /B
)

where /q nmake.exe
IF ERRORLEVEL 1 (
    ECHO The application "nmake.exe" is missing. Ensure to add/install it to the PATH in beginning of this script, check SET PATH
    PAUSE
    EXIT /B
)

where /q py.exe
IF ERRORLEVEL 1 (
    ECHO The application "py.exe" [shortcut of python] is missing. Ensure to add/install it to the PATH in beginning of this script, check SET PATH
    PAUSE
    EXIT /B
)

Rem Launch compilation -----------------------------------------

py CompileOpenSSL.py -f %FILENAME% -a %2 -v %VSVERSION%


PAUSE

3)コマンドライン(Visual Studioの外部)からコンパイルを開始します。例:

CompileOpenSSL_vs.cmd 150 x86
CompileOpenSSL_vs.cmd 150 AMD64

CompileOpenSSL_vs.cmd 90 x86
0
Ti-R