올해에 Python을 주 기술스택으로 사용하는 회사에 들어갔다보니, Java세계에서 경험하기 어려운 일을 경험하게 됩니다.

이번에 Python 3.10에서 hiredis wheel 빌드 오류를 발견하였습니다.

gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -I/usr/include/openssl11 -I/usr/include/openssl11 -fPIC -Ivendor -I/home/dhsung/.pyenv/versions/3.10.5/envs/tmp-hiredis-build/include -I/home/dhsung/.pyenv/versions/3.10.5/include/python3.10 -c src/hiredis.c -o build/temp.linux-x86_64-cpython-310/src/hiredis.o
gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -I/usr/include/openssl11 -I/usr/include/openssl11 -fPIC -Ivendor -I/home/dhsung/.pyenv/versions/3.10.5/envs/tmp-hiredis-build/include -I/home/dhsung/.pyenv/versions/3.10.5/include/python3.10 -c src/reader.c -o build/temp.linux-x86_64-cpython-310/src/reader.o
gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -I/usr/include/openssl11 -I/usr/include/openssl11 -fPIC -Ivendor -I/home/dhsung/.pyenv/versions/3.10.5/envs/tmp-hiredis-build/include -I/home/dhsung/.pyenv/versions/3.10.5/include/python3.10 -c vendor/hiredis/alloc.c -o build/temp.linux-x86_64-cpython-310/vendor/hiredis/alloc.o
gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -I/usr/include/openssl11 -I/usr/include/openssl11 -fPIC -Ivendor -I/home/dhsung/.pyenv/versions/3.10.5/envs/tmp-hiredis-build/include -I/home/dhsung/.pyenv/versions/3.10.5/include/python3.10 -c vendor/hiredis/read.c -o build/temp.linux-x86_64-cpython-310/vendor/hiredis/read.o
vendor/hiredis/read.c: In function ‘redisReaderFree’:
vendor/hiredis/read.c:646:9: error: ‘for’ loop initial declarations are only allowed in C99 mode
for (int i = 0; i < r->tasks; i++) {
^
vendor/hiredis/read.c:646:9: note: use option -std=c99 or -std=gnu99 to compile your code
error: command ‘/usr/bin/gcc’ failed with exit code 1
[end of output]

note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed building wheel for hiredis

이 오류는 CentOS7에서 python3.10 버전으로 빌드할때 나오는것으로, 다른 배포판(CentOS 8 Stream, Rocky Linux 8, Ubuntu 20.04, 22.04 LTS)에서는 정상적으로 빌드가 됨을 확인하였습니다.

에러로그를 보고 cpython 3.10용 hiredis wheel이 없나 검색을 하였습니다.

 

New release for cp3.10 is not on pypi · Issue #121 · redis/hiredis-py

Time for a new release? Btw, travis-ci.org is dead, maybe time to move to github action and cibuildwheel?

github.com

 

그러나, cpython3.10용 hiredis wheel이 없어서 CentOS7에서 직접 wheel 빌드 어떻게 하나 고민을 했습니다.

에러를 보면 `error: ‘for’ loop initial declarations are only allowed in C99 mode` 메시지가 나옴을 확인하였습니다.

이 에러를 해결을 어떻게 할까 stackoverflow로 검색을 하니 다음의 링크를 발견하였습니다

 

How to use make and compile as C99?

I'm trying to compile a linux kernel module using a Makefile: obj-m += main.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname...

stackoverflow.com

 

즉, CentOS7에서 python 3.10용 hiredis 2.0.0 wheel 생성을 하려면 환경변수에 `CFLAGS=-std=c99` 를 추가해야합니다.

환경변수에 `CFLAGS=-std=c99` 를 추가한 결과, cpython3.10용 hiredis wheel 빌드 및 생성 성공하였습니다.

 
 
 
Buy me a coffeeBuy me a coffee

CentOS 7에서 Python 3.10 이상 버전 사용하기 전 OpenSSL 1.1.1을 RPM으로 설치하는 방법

PEP644 문서에는 Python 3.10 이상부터 OpenSSL 1.1.1 이상을 요구하고 있습니다.

PEP 644 — Require OpenSSL 1.1.1 or newer 

https://peps.python.org/pep-0644/

 

PEP 644 – Require OpenSSL 1.1.1 or newer | peps.python.org

PEP 644 – Require OpenSSL 1.1.1 or newer PEP 644 Title Require OpenSSL 1.1.1 or newer Author Christian Heimes BDFL-Delegate n/a Discussions-To https://discuss.python.org/t/pep-644-require-openssl-1-1-or-newer/5584 Status Final Type Standards Track Create

peps.python.org

 

그러나, 여러 대기업, 관공서등에서 CentOS 7을 아직도 많이 사용을 하고 있고, CentOS 7은 OpenSSL 1.1.1이 아닌 OpenSSL 1.0.2가 설치되어있습니다.

$ openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017

CentOS 7에서 Python 3.10을 사용하고 싶은데, OpenSSL 1.1.1이 설치가 되지 않아 소스 컴파일하여 사용해야 하나 이런 고민을 많이 했습니다.

그러나, 일본의 파이썬 개발자가 공유한 글을 보고, CentOS 7에서 OpenSSL 1.1.1을 소스 컴파일이 아닌 RPM설치로도 가능하다는 걸 알게 되었습니다.

아래는 일본 파이썬 개발자가 작성한 글 “Python 3.10の新機能(その8) OpenSSL 1.1.1が必須に”[번역: Python 3.10의 신기능(8번째 부분) OpenSSL 1.1.1이 필수임] 입니다.

 

Python 3.10の新機能(その8) OpenSSL 1.1.1が必須に - python.jp

Pythonでは、https通信やメッセージダイジェストの作成などの暗号関連機能に、OpenSSLを利用しています。 これまで、Pythonでは OpenSSL のVersion 1.0.2以降が利用可能でしたが、Python 3.10からは、OpenSS

www.python.jp

여기에서는 CentOS 7에서 OpenSSL1.1.1을 설치하려면 Fedora Project에서 제공하는 EPEL(Extra Packages for Enterprise Linux) 저장소를 추가하여 설치하면 된다고 하더군요.

다음의 명령어로 CentOS 7에서 OpenSSL1.1.1을 설치할 수 있습니다.

yum install epel-release
yum install openssl11 openssl11-devel

OpenSSL1.1.1 설치가 끝나면 아래의 명령어로 확인 가능합니다

$ openssl11 version 
OpenSSL 1.1.1k  FIPS 25 Mar 2021

pyenv로 설치 시 아래와 같이 환경변수를 지정해야 CentOS 7에서 Python을 설치할 수 있습니다

export CFLAGS=$(pkg-config --cflags openssl11)
export LDFLAGS=$(pkg-config --libs openssl11)
pyenv install 3.10.4

만약, Python을 소스 빌드로 설치하려면 아래와 같이 명령어를 입력하면 됩니다.

yum install epel-release
yum install openssl11 openssl11-devel
export CFLAGS=$(pkg-config --cflags openssl11)
export LDFLAGS=$(pkg-config --libs openssl11)
./configure
make
sudo make install

여담으로, 3월 24일에 예정된 일정 이전에 Python 3.10.4 및 3.9.12 버전이 출시되었다고 글이 공개되었습니다.

Python 3.10.4 and 3.9.12 are now available out of schedule

https://blog.python.org/2022/03/python-3104-and-3912-are-now-available.html

 

Python Insider: Python 3.10.4 and 3.9.12 are now available out of schedule

Did anybody say cursed releases? Well, it turns out that 3.10.3 and 3.9.11 both shipped a regression which caused those versions not to build on Red Hat Enterprise Linux 6. While this 11-year-old version is now out of maintenance support, it’s still used

blog.python.org

글 내용을 보면, “Red Hat Enterprise Linux 6”에서 Python3.10.3 및 3.9.11 버전이 빌드가 되지 않는 문제 때문이라고 하더군요. RHEL(Red Hat Enterprise Linux) 6은 11년 전에 출시되었고, 이제는 유지보수 지원이 끝났습니다만, 많은 사무 업무분야에서 여전히 많이 사용되고 있다고 합니다. 게다가 자체 manylinux2010 이미지는 CentOS 6을 기반으로 합니다….

아직도 RHEL 6/Cent OS6기반으로 이미지를 사용하는 경우도 많군요

 

보안 이슈때문에 라이브러리를 새로 바꿔줘야 하는데 Legacy(낡은 것)를 뺄 수가 없으니, 버리는 것이 쉽지 않다는 걸, CentOS 7에서 Python 3.10(지금 기준 — 3.10.4)을 설치하며 알게 되었습니다.

ps.CentOS 7에서 pyenv 로 3.11-dev설치할때도, OpenSSL1.1.1에 대한 환경변수 설정 후에 설치를 해야 정상 설치 됩니다.

export CFLAGS=$(pkg-config --cflags openssl11)
export LDFLAGS=$(pkg-config --libs openssl11)
pyenv install 3.11-dev

참고: PEP(Python Enhancement Proposal)는 “파이썬 언어의 개선된 제안”으로 번역하며, 파이썬 커뮤니티에서 수많은 사람들이 의견을 내고 토론하고 발전하며 논의된 주제를 PEP(Python Enhancement Proposal)로 문서화를 하였습니다 

출처: https://wikidocs.net/21733

 

 

1) PEP

## PEP 파이썬 창시자 귀도를 중심으로 수많은 사람들이 기여해서 발전해온 언어입니다. 귀도라는 최종 결정권자 혹은 그리고 결정을 하는데 가장 큰 영향력을 끼치는 독재 ...

wikidocs.net

 

Buy me a coffeeBuy me a coffee

+ Recent posts