Microsoft MVP성태의 닷넷 이야기
VC++: 65. Python 소스코드를 Visual C++로 빌드하는 방법 [링크 복사], [링크+제목 복사],
조회: 26693
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

Python 소스코드를 Visual C++로 빌드하는 방법

파이썬은 다음의 경로에서 소스 코드까지 다운로드 받을 수 있습니다.

파이썬 - 다운로드
; http://www.python.org/download/releases/3.3.0/

이 글은 3.3.0을 다운로드 받아서 컴파일합니다.

Gzipped source tar ball (3.3.0) (sig), ~ 16 MB
; http://www.python.org/ftp/python/3.3.0/Python-3.3.0.tgz

또한 32비트와 64비트로 빌드할 수 있는데, 여기서는 64비트로 빌드하기 위한 예를 들 것입니다. (32비트도 비슷하게 빌드할 수 있습니다.)

다운로드하고 압축을 풀면 다음과 같은 구조로 디렉터리가 생성됩니다.

how_to_compile_python_using_vc_1.png

보시는 것처럼, 루트에 있는 configure 같은 파일들은 Visual C++과는 무관한 것들입니다. 다행히 Visual C++로 빌드할 수 있는 환경도 포함되어 있는데요. \PCbuild 폴더를 보면 낯익은 vcxproj 확장자를 볼 수 있습니다.

그 폴더의 readme.txt를 보면 좀 더 상세한 빌드 방법을 볼 수 있습니다.

readme에 의하면 32비트로 빌드하려면 Visual C++ 2008 Express가 필요한 반면, 64비트로 빌드하려면 Visual C++ 2008 Standard가 설치되어야 한다고 되어 있습니다. 지난 시절에는 그랬지만, Visual Studio 2012 Express 버전부터는 기본적으로 64비트 C++ 컴파일러가 포함되어 있어서 그냥 Express 버전으로도 빌드할 수 있습니다. (^^ 원칙이 그렇다는 것뿐이고 여기서는 Visual Studio 2010 Ultimate으로 빌드할 것입니다.)




빌드를 위해서 사전에 준비해야 할 외부 툴들이 있습니다.

우선 svn.exe 파일이 명령행에서 접근가능해야 합니다. 이 때문에 저는 tortoisesvn을 설치했습니다.

Windows tortoisesvn
; http://tortoisesvn.tigris.org/

Download
; http://tortoisesvn.net/downloads.html

제 경우에는 "TortoiseSVN-1.7.11.23600-x64-svn-1.7.8.msi"를 다운로드 받았습니다.

설치 과정에서 "command line client tools" 항목이 기본적으로 "설치 안함"으로 되어 있는데요. 이걸 선택해 주어야 svn.exe 파일이 함께 생성됩니다.

그다음 ActivePerl을 설치해 줍니다.

ActiveState
; http://www.activestate.com/activeperl/downloads

제 경우에는 "TortoiseSVN-1.7.11.23600-x64-svn-1.7.8.msi" 파일을 다운로드했습니다.

SVN과 Perl 모두 64비트로 다운로드했습니다.

마지막으로 nasm을 다운로드 받아 압축을 풀고, PATH에 걸어줍니다.

NASM 2.10.07
; http://www.nasm.us/pub/nasm/releasebuilds/2.10.07/nasm-2.10.07.zip

nasm.exe로 되어 있는데, nasmw.exe로 하나 더 복사해 줍니다.

아래는 제가 설치한 3가지 도구의 경로입니다.

C:\Perl64
C:\Program Files\TortoiseSVN
C:\nasm-2.10.07

설치 후, 반드시 x64 Command 창에서 svn.exe와 perl.exe, nasmw.exe에 대해 실행 유무를 확인합니다.




빌드하기 전, 사전 변경 작업을 해줘야 합니다.

우선 ".\Python-3.3.0\PCbuild\pyproject.props" 파일의 인코딩을 ANSI로 바꿔서 저장해 주어야 합니다. 그렇지 않으면 빌드 도중에 다음과 같은 식의 오류가 발생합니다.

error MSB3073: The command "cd "c:\Python-3.3.0\PCbuild\" 
"c:\Python-3.3.0\PCbuild\python_d.exe" build_ssl.py Release Win32 -a" exited with code 1.   
C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.MakeFile.Targets    38  6   ssl

위의 명령어를 직접 명령행 창에서 실행하면 좀 더 상세한 오류 메시지를 볼 수 있습니다.

c:\Python-3.3.0\PCbuild>"c:\Python-3.3.0\PCbuild\python_d.exe" build_ssl.py Release Win32 -a
Found a working perl at 'D:\os\cygwin\bin\perl.exe'
Traceback (most recent call last):
  File "build_ssl.py", line 253, in <module>
    main()
  File "build_ssl.py", line 181, in main
    ssl_dir = get_ssl_dir()
  File "build_ssl.py", line 70, in get_ssl_dir
    m = re.search('openssl-([^<]+)<', f.read())
UnicodeDecodeError: 'cp949' codec can't decode byte 0xbf in position 2: illegal multibyte sequence
[54599 refs]

build_ssl.py 파일을 열어서 오류가 발생한 메소드를 보면,

def get_ssl_dir():
    propfile = (os.path.join(os.path.dirname(__file__), 'pyproject.props'))

    with open(propfile) as f:
        m = re.search('openssl-([^&lt;]+)&lt;', f.read())
        return "..\..\openssl-"+m.group(1)

오류는 f.read()에서 발생한 것입니다. f의 대상 파일은 pyproject.props 파일인데, 이것을 Visual Studio에서 열어 Encoding 설정을 확인하면 "Unicode (UTF-8 with signature) - Codepage 65001"이라고 나옵니다. 아마도 유니코드용 BOM signature를 해석하는 부분에서 오류가 발생한 것 같은데요. 그래서 그 파일을 "US-ASCII - Codepage 20127"로 변경해서 저장을 했습니다.




이제, Visual Studio의 x64 빌드용 Command Prompt를 실행하고, \Python-3.3.0 폴더로 이동해 \Tools\buildbot\external-amd64.bat을 실행합니다.

cd c:\...[생략]...\Python-3.3.0
c:\...[생략]...\Python-3.3.0>Tools\buildbot\external-amd64.bat

실행하면 다음과 같이 Python-3.3.0 소스 코드와 동일한 레벨로 폴더들이 추가됩니다.

how_to_compile_python_using_vc_2.png

그다음 tk-8.5.11.0\win 폴더로 이동해서 nmake를 한 번 더 실행해 줍니다.

cd d:\...[생략]...\tcl-8.5.11.0\win
nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 clean all install

위의 과정을 실행하지 않으면 나중에 pcbuild.sln으로 빌드할 때 다음과 같은 오류가 발생할 수 있습니다.

1>------ Build started: Project: _tkinter, Configuration: Release x64 ------
1>LINK : fatal error LNK1181: cannot open input file '..\..\tcltk64\lib\tcl85.lib'
========== Build: 0 succeeded, 1 failed, 4 up-to-date, 0 skipped ==========

nmake 실행 후 .\tcltk64\lib\tcl85.lib 파일이 생성되었는지 확인합니다.

그다음 .\openssl-1.0.1c\crypto\x86_64cpuid.pl 파일을 열어서 다음과 같은 라인을 추가해 주어야 합니다.

#!/usr/bin/env perl

$flavour = shift;
$output  = shift;
if ($flavour =~ /\./) { $output = $flavour; undef $flavour; }

$win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/);

$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;

( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or
( $xlate="${dir}perlasm/x86_64-xlate.pl" and -f $xlate) or
die "can't locate x86_64-xlate.pl";

$xlate =~ s/\\/\//g;

open STDOUT,"| $^X $xlate $flavour $output";

# ...[생략]...

위와 같이 해주지 않으면 나중에 빌드에서 다음과 같은 식의 오류가 발생합니다.

1>------ Build started: Project: ssl, Configuration: Debug x64 ------
1>  Found a working perl at 'C:\Perl64\bin\perl.exe'
1>  Executing ssl makefiles: nmake /nologo -f "ms\nt64.mak"
1>  Building OpenSSL
1>   set ASM=nasm -f win64 -DNEAR -Ox -g
1>    crypto\x86_64cpuid.pl tmp64\x86_64cpuid.asm
1>  Can't open perl script "d:pythoncompileopenssl-1.0.1ccryptoperlasm/x86_64-xlate.pl": No such file or directory
1>   nasm -f win64 -DNEAR -Ox -g -o tmp64\x86_64cpuid.obj tmp64\x86_64cpuid.asm
1>  nasm: fatal: unable to open input file `tmp64\x86_64cpuid.asm'
1>NMAKE : fatal error U1077: 'E:\nasm-2.10.07\nasm.EXE' : return code '0x1'
1>  Stop.
1>  Executing ms\nt64.mak failed
1>  2
1>  [54550 refs]
1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.MakeFile.Targets(38,5): error MSB3073: The command "cd "D:\...[생략]...\Python-3.3.0\PCbuild\"
1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.MakeFile.Targets(38,5): error MSB3073: "D:\...[생략]...\Python-3.3.0\PCbuild\amd64\python_d.exe" build_ssl.py Release x64 -a
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.MakeFile.Targets(38,5): error MSB3073: " exited with code 2.
========== Build: 0 succeeded, 1 failed, 6 up-to-date, 0 skipped ==========

보시는 것처럼 경로를 "d:pythoncompileopenssl-1.0.1ccryptoperlasm/x86_64-xlate.pl"로 해석하는데요. $xlate 변수 값을 보면 "d:\python\compile\openssl-1.0.1c\crypto\perlasm/x86_64-xlate.pl"로 되어 있기 때문입니다. 여기서 '\' 문자를 '/'로 바꾸고 open을 실행해 주면 정상적으로 처리됩니다.

그런데, 사실 이렇게 해도 여전히 tmp64\x86_64cpuid.asm 파일은 생성되지 않았습니다. 휴~~~ 힘들군요. 더 이상 원인은 모르겠습니다. ^^; (혹시 이 부분에 대해 아시는 분 있으시면 덧글 부탁드립니다.)

대신, 다른 방법을 찾았는데요. 가만 보니 \openssl-1.0.1c\asm64 폴더의 내용이 \openssl-1.0.1c\tmp64 폴더의 내용에서 원하는 것들이 모두 들어 있는 것 같아서 복사를 해주었습니다. (즉, asm64의 모든 파일을 tmp64로 그대로 복사해줍니다.)




준비 작업은 그걸로 모두 끝입니다. 이제 \PCBuild\pcbuild.sln 파일을 Visual Studio에서 로드합니다.

how_to_compile_python_using_vc_3.png

그런 후 Build를 Win32에서 x64로 바꾸고 빌드를 시작합니다. 그럼... 아주 깨끗하게 빌드가 완료됩니다. ^^

사실, 위의 선행 단계를 하지 않고 그냥 PCBuild.sln만 빌드하다가 오류가 발생해도 상관없습니다. python.exe까지는 빌드가 된 상태이기 때문에 웬만한 것은 테스트해 볼 수 있는데요. 그래도 ^^ 왠지 모든 것이 빌드 안 되면 시원하지 않기 때문에 마무리를 지어보았습니다.

일단, 한번 빌드가 된 후에는 ssl 프로젝트를 unload 해놓고 작업하시는 것이 좋습니다. (안 그러면 매번 Build Event로 걸린 작업 때문에 빌드 작업에 시간이 걸립니다.)

자... 아래는 이렇게 파이썬을 빌드해서 F5 디버깅을 걸어본 인증샷입니다. ^^

how_to_compile_python_using_vc_4.png

역시 ^^ F5 디버깅이 되어야!!!

리눅스 환경이면 lldb를 이용할 수 있습니다.
Python 내부의 C 코드 들여다보기
; https://tempkdw.github.io/posts/cpython-debug/




다음은 제가 겪었던 빌드 오류에 대한 내용을 정리해 보았습니다.

처음에 PCBuild.sln 파일을 무작정 Visual Studio에 로드하고 빌드 명령을 내렸었는데요. 그랬더니 많은 오류가 발생했습니다. 그중 가장 첫 번째 오류가 sqlite3.c를 찾을 수 없다는 것입니다.

1>------ Build started: Project: sqlite3, Configuration: Debug Win32 ------
1>  sqlite3.c
1>c1 : fatal error C1083: Cannot open source file: '..\..\sqlite-3.7.12\sqlite3.c': No such file or directory

실제로 pcbuild.sln에 포함된 sqlite3 프로젝트에 가서 sqlite3.c 파일을 열려고 하면 ".\Python-3.3.0\sqlite-3.7.12\sqlite3.c" 파일이 없다고 나옵니다.

이 파일은 다음의 경로에서 다운로드해야 합니다.

SQLite Download Page
; http://www.sqlite.org/download.html

오늘 날짜 기준오르 3.7.15.2가 릴리즈되어 있는데요. 상관없습니다. ".\Python-3.3.0\sqlite-3.7.12\" 폴더를 만들어 주고, 그 아래에 sqlite3.c, sqlite3.h, sqlite3ext.h 파일을 복사해 놓으면 됩니다.

문제는 ^^ 여기서 끝이 아니라는 것입니다. 파이썬 소스 코드는 그 외에도 많은 외부 의존성을 가지고 있는데요. 이런 식으로 일일이 수작업으로 맞춰주는 것도 가능하겠지만, 파이썬 소스 코드에 이미 이런 것들을 한꺼번에 내려받도록 도와주는 배치 파일을 제공하고 있습니다. 그것이 바로 위에서 실행했던 \Tools\buildbot\external-amd64.bat입니다.




ssl 빌드할 때 다음과 같은 오류가 발생한다면, Perl이 설치되어 있지 않은 탓입니다. 그냥 ActivePerl을 설치해 주면 해결됩니다. (물론, %PATH%에 잡혔는지 확인해 주시고.)

1>------ Build started: Project: ssl, Configuration: Debug Win32 ------
1>  Can not find a suitable PERL:
1>   NO perl interpreters were found on this machine at all!
1>   Please install ActivePerl and ensure it appears on your path
1>  No Perl installation was found. Existing Makefiles are used.
1>  Executing ssl makefiles: nmake /nologo -f "ms\nt.mak"
1>  Building OpenSSL
1>   link /nologo /subsystem:console /opt:ref /debug /out:out32\md4test.exe @C:\...[생략]...\Local\Temp\nmB40E.tmp
1>libeay32.lib(p12_decr.obj) : error LNK2001: unresolved external symbol _OPENSSL_cleanse
... [생략] ...
1>out32\md4test.exe : fatal error LNK1120: 23 unresolved externals
1>NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\link.EXE"' : return code '0x460'
1>  Stop.
1>  Executing ms\nt.mak failed
1>  2
1>  [52058 refs]
1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.MakeFile.Targets(38,5): error MSB3073: The command "cd "d:\...[생략]...\Python-3.3.0\PCbuild\"
1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.MakeFile.Targets(38,5): error MSB3073: "d:\...[생략]...\Python-3.3.0\PCbuild\python_d.exe" build_ssl.py Release Win32 -a
1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.MakeFile.Targets(38,5): error MSB3073: " exited with code 2.







[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 11/7/2022]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2013-02-07 12시07분
[ryujh] 안녕하세요.
파이선을 빌드하는데 파이선을 사용하는건가요? 그럼 빌드하는 것은 무엇인지... 파이선 최초 빌드는 파이선을 사용안했을 것이고
최대한 다른 도구를 많이 활용하도록 되어있네요.

다른 소스 빌드할 때 많이 참고할 수 있을 것 같습니다.
[guest]
2013-02-07 12시28분
기본적인 파이썬 모듈까지는 빌드가 잘 됩니다. 단지 파이썬 바이너리를 제외한 PCBuild.sln에 있는 다른 프로젝트들의 빌드에서 오류가 발생합니다. 그 다른 프로젝트들의 빌드에 파이썬 자체가 다시 재사용되고 있는 거고요. ^^ 그러게요. 저도 아직 구체적으로 확인을 안해봐서 다른 프로젝트들이 어디에 사용되는지는 잘 모르겠습니다.
정성태
2014-07-23 06시34분
[안녕하세요] 담아갈게요~~~http://blog.naver.com/action713
[guest]

1  2  3  4  5  6  7  8  9  [10]  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13389정성태7/5/20233557개발 환경 구성: 684. IIS Express로 호스팅하는 웹을 WSL 환경에서 접근하는 방법
13388정성태7/3/20233706오류 유형: 871. 윈도우 탐색기에서 열리지 않는 zip 파일 - The Compressed (zipped) Folder '[...].zip' is invalid. [1]파일 다운로드1
13387정성태6/28/20233779오류 유형: 870. _mysql - Commands out of sync; you can't run this command now
13386정성태6/27/20233880Linux: 61. docker - 원격 제어를 위한 TCP 바인딩 추가
13385정성태6/27/20234085Linux: 60. Linux - 외부에서의 접속을 허용하기 위한 TCP 포트 여는 방법
13384정성태6/26/20233796.NET Framework: 2131. C# - Source Generator로 해결하는 enum 박싱 문제파일 다운로드1
13383정성태6/26/20233529개발 환경 구성: 683. GPU 런타임을 사용하는 Colab 노트북 설정
13382정성태6/25/20233611.NET Framework: 2130. C# - Win32 API를 이용한 윈도우 계정 정보 (예: 마지막 로그온 시간)파일 다운로드1
13381정성태6/25/20234020오류 유형: 869. Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
13380정성태6/24/20233434스크립트: 52. 파이썬 3.x에서의 동적 함수 추가
13379정성태6/23/20233449스크립트: 51. 파이썬 2.x에서의 동적 함수 추가
13378정성태6/22/20233350오류 유형: 868. docker - build 시 "CANCELED ..." 뜨는 문제
13377정성태6/22/20237236오류 유형: 867. 파이썬 mysqlclient 2.2.x 설치 시 "Specify MYSQLCLIENT_CFLAGS and MYSQLCLIENT_LDFLAGS env vars manually" 오류
13376정성태6/21/20233597.NET Framework: 2129. C# - Polly를 이용한 클라이언트 측의 요청 재시도파일 다운로드1
13375정성태6/20/20233259스크립트: 50. Transformers (신경망 언어모델 라이브러리) 강좌 - 2장 코드 실행 결과
13374정성태6/20/20233349오류 유형: 866. 파이썬 - <class 'AttributeError'> module 'flask.json' has no attribute 'JSONEncoder'
13373정성태6/19/20234662오류 유형: 865. 파이썬 - pymssql 설치 관련 오류 정리
13372정성태6/15/20233272개발 환경 구성: 682. SQL Server TLS 통신을 위해 사용되는 키 길이 확인 방법
13371정성태6/15/20233345개발 환경 구성: 681. openssl - 인증서 버전(V1 / V3)
13370정성태6/14/20233508개발 환경 구성: 680. C# - Ubuntu + Microsoft.Data.SqlClient + SQL Server 2008 R2 연결 방법 - TLS 1.2 지원
13369정성태6/13/20233317개발 환경 구성: 679. PyCharm(을 비롯해 JetBrains에 속한 여타) IDE에서 내부 Window들의 탭이 없어진 경우
13368정성태6/13/20233485개발 환경 구성: 678. openssl로 생성한 인증서를 SQL Server의 암호화 인증서로 설정하는 방법
13367정성태6/10/20233641오류 유형: 864. openssl로 만든 pfx 인증서를 Windows Server 2016 이하에서 등록 시 "The password you entered is incorrect" 오류 발생
13366정성태6/10/20233377.NET Framework: 2128. C# - 윈도우 시스템에서 지원하는 암호화 목록(Cipher Suites) 나열파일 다운로드1
13365정성태6/8/20233104오류 유형: 863. MODIFY FILE encountered operating system error 112(failed to retrieve text for this error. Reason: 15105)
13364정성태6/8/20233943.NET Framework: 2127. C# - Ubuntu + Microsoft.Data.SqlClient + SQL Server 2008 R2 연결 방법 [1]
1  2  3  4  5  6  7  8  9  [10]  11  12  13  14  15  ...