Não é possível construir numpy v1.17.0 no CentOS 7.
A versão anterior funciona bem.
Estou vendo muitos recursos C99 / C11 na mensagem de erro e avx512f.
Não tenho certeza se a opção --std
está definida, mas não acho que o gcc 4.8.5 (o compilador padrão do sistema no CentOS 7) pode lidar com tudo isso.
Basta construir a roda no CentOS 7 com python3.
Algum log de erro anexado.
A história toda é muito longa para ser colada aqui.
#6 356.1 compile options: '-Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/usr/include/python3.6m -c'
#6 356.1 gcc: _configtest.c
#6 356.1 _configtest.c: In function 'main':
#6 356.1 _configtest.c:5:3: warning: implicit declaration of function '__builtin_mul_overflow' [-Wimplicit-function-declaration]
#6 356.1 __builtin_mul_overflow(5, 5, (int*)5);
#6 356.1 ^
#6 356.1 gcc -pthread _configtest.o -o _configtest
#6 356.1 _configtest.o: In function `main':
#6 356.1 /tmp/pip-req-build-poiltggx/_configtest.c:5: undefined reference to `__builtin_mul_overflow'
#6 356.1 collect2: error: ld returned 1 exit status
#6 356.1 failure.
#6 356.1 removing: _configtest.c _configtest.o _configtest.o.d
#6 356.1 C compiler: gcc -pthread -Wno-unused-result -Wsign-compare -DDYNAMIC_ANNOTATIONS_ENABLED=1 -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -fPIC
#6 356.1
#6 356.1 compile options: '-Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/usr/include/python3.6m -c'
#6 356.1 gcc: _configtest.c
#6 356.1 _configtest.c: In function 'main':
#6 356.1 _configtest.c:7:16: warning: unused variable 'r' [-Wunused-variable]
#6 356.1 volatile int r = __builtin_cpu_supports("sse");
#6 356.1 ^
#6 356.1 gcc -pthread _configtest.o -o _configtest
#6 356.1 success!
#6 356.1 removing: _configtest.c _configtest.o _configtest.o.d _configtest
#6 356.1 C compiler: gcc -pthread -Wno-unused-result -Wsign-compare -DDYNAMIC_ANNOTATIONS_ENABLED=1 -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -fPIC
#6 356.1
#6 356.1 compile options: '-Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/usr/include/python3.6m -c'
#6 356.1 gcc: _configtest.c
#6 356.1 _configtest.c: In function 'main':
#6 356.1 _configtest.c:7:3: error: Parameter to builtin not valid: avx512f
#6 356.1 volatile int r = __builtin_cpu_supports("avx512f");
#6 356.1 ^
#6 356.1 _configtest.c:7:16: warning: unused variable 'r' [-Wunused-variable]
#6 356.1 volatile int r = __builtin_cpu_supports("avx512f");
#6 356.1 ^
#6 356.1 failure.
#6 356.1 removing: _configtest.c _configtest.o
#6 356.1 C compiler: gcc -pthread -Wno-unused-result -Wsign-compare -DDYNAMIC_ANNOTATIONS_ENABLED=1 -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -fPIC
#6 356.1
#6 356.1 compile options: '-Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/usr/include/python3.6m -c'
#6 356.1 gcc: _configtest.c
#6 356.1 gcc -pthread _configtest.o -o _configtest
#6 356.1 success!
#6 356.1 removing: _configtest.c _configtest.o _configtest.o.d _configtest
#6 356.1 C compiler: gcc -pthread -Wno-unused-result -Wsign-compare -DDYNAMIC_ANNOTATIONS_ENABLED=1 -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -fPIC
#6 356.1
#6 356.1 compile options: '-Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/usr/include/python3.6m -c'
#6 356.1 gcc: _configtest.c
#6 356.1 gcc -pthread _configtest.o -o _configtest
#6 356.1 success!
#6 356.1 removing: _configtest.c _configtest.o _configtest.o.d _configtest
#6 358.3 C compiler: gcc -pthread -Wno-unused-result -Wsign-compare -DDYNAMIC_ANNOTATIONS_ENABLED=1 -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -fPIC
#6 358.3
#6 358.3 compile options: '-Ibuild/src.linux-x86_64-3.6/numpy/core/src/common -Inumpy/core/include -Ibuild/src.linux-x86_64-3.6/numpy/core/include/numpy -Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/usr/include/python3.6m -Ibuild/src.linux-x86_64-3.6/numpy/core/src/common -Ibuild/src.linux-x86_64-3.6/numpy/core/src/npymath -Ibuild/src.linux-x86_64-3.6/numpy/core/src/common -Ibuild/src.linux-x86_64-3.6/numpy/core/src/npymath -c'
#6 358.3 gcc: build/src.linux-x86_64-3.6/numpy/core/src/npysort/radixsort.c
#6 358.3 numpy/core/src/npysort/radixsort.c.src: In function 'radixsort_bool':
#6 358.3 numpy/core/src/npysort/radixsort.c.src:112:5: error: 'for' loop initial declarations are only allowed in C99 mode
#6 358.3 for (npy_intp i = 1; i < num; i++) {
#6 358.3 ^
#6 358.3 numpy/core/src/npysort/radixsort.c.src:112:5: note: use option -std=c99 or -std=gnu99 to compile your code
#6 358.3 numpy/core/src/npysort/radixsort.c.src: In function 'aradixsort_bool':
#6 358.3 numpy/core/src/npysort/radixsort.c.src:202:5: error: 'for' loop initial declarations are only allowed in C99 mode
#6 358.3 for (npy_intp i = 1; i < num; i++) {
#6 358.3 ^
#6 358.3 numpy/core/src/npysort/radixsort.c.src: In function 'radixsort_byte':
#6 358.3 numpy/core/src/npysort/radixsort.c.src:112:5: error: 'for' loop initial declarations are only allowed in C99 mode
#6 358.3 for (npy_intp i = 1; i < num; i++) {
#6 358.3 ^
#6 358.3 numpy/core/src/npysort/radixsort.c.src: In function 'aradixsort_byte':
#6 358.3 numpy/core/src/npysort/radixsort.c.src:202:5: error: 'for' loop initial declarations are only allowed in C99 mode
#6 358.3 for (npy_intp i = 1; i < num; i++) {
#6 358.3 ^
#6 358.3 numpy/core/src/npysort/radixsort.c.src: In function 'radixsort_ubyte':
#6 358.3 numpy/core/src/npysort/radixsort.c.src:112:5: error: 'for' loop initial declarations are only allowed in C99 mode
#6 358.3 for (npy_intp i = 1; i < num; i++) {
#6 358.3 ^
#6 358.3 numpy/core/src/npysort/radixsort.c.src: In function 'aradixsort_ubyte':
#6 358.3 numpy/core/src/npysort/radixsort.c.src:202:5: error: 'for' loop initial declarations are only allowed in C99 mode
#6 358.3 for (npy_intp i = 1; i < num; i++) {
#6 358.3 ^
#6 358.3 numpy/core/src/npysort/radixsort.c.src: In function 'radixsort_short':
#6 358.3 numpy/core/src/npysort/radixsort.c.src:112:5: error: 'for' loop initial declarations are only allowed in C99 mode
#6 358.3 for (npy_intp i = 1; i < num; i++) {
#6 358.3 ^
#6 358.3 numpy/core/src/npysort/radixsort.c.src: In function 'aradixsort_short':
#6 358.3 numpy/core/src/npysort/radixsort.c.src:202:5: error: 'for' loop initial declarations are only allowed in C99 mode
#6 358.3 for (npy_intp i = 1; i < num; i++) {
#6 358.3 ^
#6 358.3 numpy/core/src/npysort/radixsort.c.src: In function 'radixsort_ushort':
#6 358.3 numpy/core/src/npysort/radixsort.c.src:112:5: error: 'for' loop initial declarations are only allowed in C99 mode
#6 358.3 for (npy_intp i = 1; i < num; i++) {
#6 358.3 ^
#6 358.3 numpy/core/src/npysort/radixsort.c.src: In function 'aradixsort_ushort':
#6 358.3 numpy/core/src/npysort/radixsort.c.src:202:5: error: 'for' loop initial declarations are only allowed in C99 mode
#6 358.3 for (npy_intp i = 1; i < num; i++) {
#6 358.3 ^
#6 358.3 numpy/core/src/npysort/radixsort.c.src: In function 'radixsort_int':
#6 358.3 numpy/core/src/npysort/radixsort.c.src:112:5: error: 'for' loop initial declarations are only allowed in C99 mode
#6 358.3 for (npy_intp i = 1; i < num; i++) {
#6 358.3 ^
#6 358.3 numpy/core/src/npysort/radixsort.c.src: In function 'aradixsort_int':
#6 358.3 numpy/core/src/npysort/radixsort.c.src:202:5: error: 'for' loop initial declarations are only allowed in C99 mode
#6 358.3 for (npy_intp i = 1; i < num; i++) {
#6 358.3 ^
#6 358.3 numpy/core/src/npysort/radixsort.c.src: In function 'radixsort_uint':
#6 358.3 numpy/core/src/npysort/radixsort.c.src:112:5: error: 'for' loop initial declarations are only allowed in C99 mode
#6 358.3 for (npy_intp i = 1; i < num; i++) {
#6 358.3 ^
#6 358.3 numpy/core/src/npysort/radixsort.c.src: In function 'aradixsort_uint':
#6 358.3 numpy/core/src/npysort/radixsort.c.src:202:5: error: 'for' loop initial declarations are only allowed in C99 mode
#6 358.3 for (npy_intp i = 1; i < num; i++) {
#6 358.3 ^
#6 358.3 numpy/core/src/npysort/radixsort.c.src: In function 'radixsort_long':
#6 358.3 numpy/core/src/npysort/radixsort.c.src:112:5: error: 'for' loop initial declarations are only allowed in C99 mode
#6 358.3 for (npy_intp i = 1; i < num; i++) {
#6 358.3 ^
#6 358.3 numpy/core/src/npysort/radixsort.c.src: In function 'aradixsort_long':
#6 358.3 numpy/core/src/npysort/radixsort.c.src:202:5: error: 'for' loop initial declarations are only allowed in C99 mode
#6 358.3 for (npy_intp i = 1; i < num; i++) {
#6 358.3 ^
#6 358.3 numpy/core/src/npysort/radixsort.c.src: In function 'radixsort_ulong':
#6 358.3 numpy/core/src/npysort/radixsort.c.src:112:5: error: 'for' loop initial declarations are only allowed in C99 mode
#6 358.3 for (npy_intp i = 1; i < num; i++) {
#6 358.3 ^
#6 358.3 numpy/core/src/npysort/radixsort.c.src: In function 'aradixsort_ulong':
#6 358.3 numpy/core/src/npysort/radixsort.c.src:202:5: error: 'for' loop initial declarations are only allowed in C99 mode
#6 358.3 for (npy_intp i = 1; i < num; i++) {
#6 358.3 ^
#6 358.3 numpy/core/src/npysort/radixsort.c.src: In function 'radixsort_longlong':
#6 358.3 numpy/core/src/npysort/radixsort.c.src:112:5: error: 'for' loop initial declarations are only allowed in C99 mode
#6 358.3 for (npy_intp i = 1; i < num; i++) {
#6 358.3 ^
#6 358.3 numpy/core/src/npysort/radixsort.c.src: In function 'aradixsort_longlong':
#6 358.3 numpy/core/src/npysort/radixsort.c.src:202:5: error: 'for' loop initial declarations are only allowed in C99 mode
#6 358.3 for (npy_intp i = 1; i < num; i++) {
#6 358.3 ^
#6 358.3 numpy/core/src/npysort/radixsort.c.src: In function 'radixsort_ulonglong':
#6 358.3 numpy/core/src/npysort/radixsort.c.src:112:5: error: 'for' loop initial declarations are only allowed in C99 mode
#6 358.3 for (npy_intp i = 1; i < num; i++) {
#6 358.3 ^
#6 358.3 numpy/core/src/npysort/radixsort.c.src: In function 'aradixsort_ulonglong':
#6 358.3 numpy/core/src/npysort/radixsort.c.src:202:5: error: 'for' loop initial declarations are only allowed in C99 mode
#6 358.3 for (npy_intp i = 1; i < num; i++) {
#6 358.3 ^
#6 358.3 error: Command "gcc -pthread -Wno-unused-result -Wsign-compare -DDYNAMIC_ANNOTATIONS_ENABLED=1 -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -fPIC -Ibuild/src.linux-x86_64-3.6/numpy/core/src/common -Inumpy/core/include -Ibuild/src.linux-x86_64-3.6/numpy/core/include/numpy -Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/usr/include/python3.6m -Ibuild/src.linux-x86_64-3.6/numpy/core/src/common -Ibuild/src.linux-x86_64-3.6/numpy/core/src/npymath -Ibuild/src.linux-x86_64-3.6/numpy/core/src/common -Ibuild/src.linux-x86_64-3.6/numpy/core/src/npymath -c build/src.linux-x86_64-3.6/numpy/core/src/npysort/radixsort.c -o build/temp.linux-x86_64-3.6/build/src.linux-x86_64-3.6/numpy/core/src/npysort/radixsort.o -MMD -MF build/temp.linux-x86_64-3.6/build/src.linux-x86_64-3.6/numpy/core/src/npysort/radixsort.o.d" failed with exit status 1
#6 358.3 ----------------------------------------
#6 358.4 ERROR: Command errored out with exit status 1: /usr/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-req-build-poiltggx/setup.py'"'"'; __file__='"'"'/tmp/pip-req-build-poiltggx/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-50nzprh1/install-record.txt --single-version-externally-managed --compile Check the logs for full command output.
CentOS 7
Python 3 padrão (3.6)
Gcc padrão (4,8)
Registro completo em anexo:
O Numpy 1.17 precisa de pelo menos --std=c99
.
Acho que a decisão foi deixar de passar essa bandeira para o distribuidor, em vez de fazer isso automaticamente, mas esqueci o raciocínio. @rgommers , você participou dessa discussão?
Isso soa terrível se não for definido por padrão.
No entanto, de alguma forma funciona com o Ubuntu 18.04.
Além disso, qual é a maneira correta de passar sinalizadores de compilador?
Tentei export CC="gcc --std=c11"
e export CFLAGS="--std=c11"
mas ambos foram ignorados.
Parece que no Ubuntu 18.04, o padrão do gcc 7.4.0 é gnu11
enquanto no CentOS 7, o padrão do gcc 4.8.5 é gnu90
.
Eu corro . scl_source enable devtoolset-8
para mudar para o gcc 8, que usa gnu17
por padrão.
Mas parece que todos os env. Relacionados foram ignorados por numpy.
Não se preocupe, o entorpecido pode captar o env corretamente.
Há um sudo antes da instalação do pip que elimina tudo.
Mas o problema permanece: ainda temos o suporte padrão para CentOS 7 e seu gcc 4.8.5?
Não sei se está relacionado, mas tive um problema semelhante ao tentar instalar no Amazon Linux. A seguinte solução me ajudou:
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc48-c99 100 --slave /usr/bin/c89 c89 /usr/bin/gcc48-c89 --slave /usr/bin/c99 c99 /usr/bin/gcc48-c99 --slave /usr/bin/cc cc /usr/bin/gcc48 --slave /usr/bin/gcov gcov /usr/bin/gcov48
update-alternatives --config gcc
@xkszltl Você deve passar --std=c99
na variável de ambiente CFLAGS
. Seguindo problemas de compilação resolvidos para mim.
CFLAGS="--std=c99" python3.6 -mpip wheel "numpy>=1.17,<1.18"
@sashkab Resolvi para mim simplesmente usando gcc-8. Mas --std=c99
ser adicionado automaticamente durante a compilação se nenhuma configuração de usuário for detectada?
O numpy 1.17 também não consegue construir no pypy, usando uma imagem do ubuntu 14.04: https://travis-ci.org/antocuni/pypy-wheels/jobs/566563056
parece que o numpy deve se esforçar mais para compilar mesmo em sistemas mais antigos, a menos que você tenha um bom motivo para não fazê-lo.
Eu acho que passar os sinalizadores std por padrão em um compilador e de maneira agnóstica de plataforma pode ser complicado e, como acontece com muitas coisas distutils, difícil de testar completamente.
O Numpy 1.17 precisa de pelo menos
--std=c99
.Acho que a decisão foi deixar de passar essa bandeira para o distribuidor, em vez de fazer isso automaticamente, mas esqueci o raciocínio. @rgommers , você participou dessa discussão?
Isso soa um sino. Eu tentei consertar isso antes e concluí que não há um bom lugar para inserir a correção: https://github.com/numpy/numpy/pull/12620#issuecomment -451348138. Esta tentativa tem alguns comentários sobre qual é o problema: https://github.com/rgommers/numpy/commit/8aaf4d8ff4828cd7302788af05f65f667ff1ba45
Dando um passo para trás, o problema de design de numpy.distutils
que encontramos aqui é que todos os sinalizadores são (a) retirados do Python distutils
, em seguida, codificados por compilador em numpy/distutils/<compilername>.py
. E no momento em que fazemos essa codificação, não sabemos o que vem de distutils
. E inserir sinalizadores dinamicamente mais tarde (o que eu tentei) é igualmente complicado.
É possível que eu tenha perdido uma maneira sensata de consertar isso. Sugestões / RP bem-vindos.
IIRC a versão mínima do gcc que funciona para construir numpy é 4.8. Para gcc <5.1, os usuários precisam adicionar --std=c99
.
Esta é uma duplicata do gh-12766.
Isso está incomodando pessoas suficientes que irei marcá-lo para 1.17.1 - deve ser possível inserir uma correção de hacky de alguma forma.
A maioria das distribuições de Linux deve ter um script de compilador c99 que define o sinalizador
charris<strong i="6">@fc</strong> [~]$ c99 --version
gcc (GCC) 9.1.1 20190503 (Red Hat 9.1.1-1)
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
@xkszltl O que isso faz por você? Deve haver uma maneira de usar isso nas plataformas Linux.
@charris
Bom saber! É parte do gcc 4.8.5 rpm no CentOS, então acho que deve funcionar.
Também disponível para SCL (eu verifiquei devtoolset-6/7/8).
E ... Nossa, vocês já têm gcc-9 ?!
Aguardando SCL no CentOS ...
BTW, será melhor se pudermos encontrar uma maneira de injetar $CFLAGS
automaticamente em vez de pesquisar o executável c99 como $CC
, porque $CC
pode ser ainda mais personalizado para gcc-xxx
, clang
, ccache gcc
, distcc
...
Empurrado para 1.17.2. Tento remover o marco porque há uma solução alternativa e a questão parece ser "existe uma maneira melhor."
Problema semelhante aqui no CentOS 7, python 3.6.3+ (configurado com --with-pydebug
) e gcc 4.8.5. Isso funcionou para mim quando ativado em meu venv
CFLAGS=-std=c99 pip install numpy==1.17.0
Esse problema também afeta as imagens de contêiner RHEL e RHEL, a instalação do pip numpy falha em arquiteturas não intel.
Corrigido em gh-14771, que adicionou o sinalizador e um CI executado com gcc4.8
O problema pode ser reproduzido em nvidia/cuda-ppc64le:10.0-cudnn7-devel-centos7
@ sh1ng com qual versão do NumPy? Você está adicionando o sinalizador -std = c99?
Sem adicionar a bandeira
| Versão Numpy | Status |
| ------------- | -----: |
| 1.17.0 | Falha |
| 1.17.1 | Reprovado |
| 1.17.2 | Reprovado |
| 1.17.3 | Reprovado |
| 1.17.4 | Reprovado |
| 1.17.5 | Reprovado |
| 1.18.0 | Sucesso |
| 1.18.1 | Reprovado |
| 1.18.2 | Reprovado |
Adicioná-lo resolve o problema, mas torna o processo de instalação dependente da plataforma.
@mattip o problema ocorre quando o miniconda é usado, não um pacote centos python. Provavelmente o problema de conda.
Comentários muito úteis
@xkszltl Você deve passar
--std=c99
na variável de ambienteCFLAGS
. Seguindo problemas de compilação resolvidos para mim.