Невозможно установить/скомпилировать модуль Perl DBD::DB2 в Rocky Linux 9.4 с помощью cpanm

Я пытаюсь установить/скомпилировать модуль Perl DBD::DB2 в Rocky Linux 9.4 с помощью команды cpanm, но он не работает. Я пробовал даже в RHEL и Oracle Linux, но все равно не работает.

Я получаю следующую ошибку:

    [root@ol9vm-desk01 ~]# cpanm DBD::DB2
    --> Working on DBD::DB2
    Fetching http://www.cpan.org/authors/id/R/RO/ROCKETDB/DBD-DB2-1.89.tar.gz ... OK
    Configuring DBD-DB2-1.89 ... OK
    Building and testing DBD-DB2-1.89 ... FAIL
    ! Installing DBD::DB2 failed. See /root/.cpanm/work/1720158884.3245/build.log for details. Retry with --force to force install it.

Что я сделал до сих пор:

1. Установлен Perl:

    [root@ol9vm-desk01 ~]# perl -V
    Summary of my perl5 (revision 5 version 32 subversion 1) configuration:
      Platform:
        osname=linux
        osvers=5.15.0-5.76.5.1.el9uek.x86_64
        archname=x86_64-linux-thread-multi
        uname='linux host-100-100-224-49 5.15.0-5.76.5.1.el9uek.x86_64 #2 smp fri dec 9 18:37:36 pst 2022 x86_64 x86_64 x86_64 gnulinux'
config_args='-des -Doptimize=none -Dccflags=-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m64 -march=x86-64-v2 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -Dldflags=-Wl,-z,relro -Wl,--as-needed  -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -Dccdlflags=-Wl,--enable-new-dtags -Wl,-z,relro -Wl,--as-needed  -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -Dlddlflags=-shared -Wl,-z,relro -Wl,--as-needed  -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -Dshrpdir=/usr/lib64 -DDEBUGGING=-g -Dversion=5.32.1 -Dmyhostname=localhost -Dperladmin=root@localhost -Dcc=gcc -Dcf_by=Red Hat, Inc. -Dprefix=/usr -Dvendorprefix=/usr -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl5/5.32 -Dsitearch=/usr/local/lib64/perl5/5.32 -Dprivlib=/usr/share/perl5 -Dvendorlib=/usr/share/perl5/vendor_perl -Darchlib=/usr/lib64/perl5 -Dvendorarch=/usr/lib64/perl5/vendor_perl -Darchname=x86_64-linux-thread-multi -Dlibpth=/usr/local/lib64 /lib64 /usr/lib64 -Duseshrplib -Dusethreads -Duseithreads -Dusedtrace=/usr/bin/dtrace -Duselargefiles -Dd_semctl_semun -Di_db -Ui_ndbm -Di_gdbm -Di_shadow -Di_syslog -Dman3ext=3pm -Duseperlio -Dinstallusrbinperl=n -Ubincompat5005 -Uversiononly -Dpager=/usr/bin/less -isr -Dd_gethostent_r_proto -Ud_endhostent_r_proto -Ud_sethostent_r_proto -Ud_endprotoent_r_proto -Ud_setprotoent_r_proto -Ud_endservent_r_proto -Ud_setservent_r_proto -Dscriptdir=/usr/bin -Dusesitecustomize -Duse64bitint'

 @INC:
    /usr/local/lib64/perl5/5.32
    /usr/local/share/perl5/5.32
    /usr/lib64/perl5/vendor_perl
    /usr/share/perl5/vendor_perl
    /usr/lib64/perl5
    /usr/share/perl5

2. Клиент IBM DB2 Data Server установлен.

    tdbcli@ol9vm-desk01 ~]$ db2level
    DB21085I  This instance or install (instance name, where applicable: "tdbcli") 
    uses "64" bits and DB2 code release "SQL11059" with level identifier 
    "060A010F".
    Informational tokens are "DB2 v11.5.9.0", "s2310270807", "DYN2310270807AMD64", 
    and Fix Pack "0".
    Product is installed at "/opt/ibm/db2/V11.5".

3. Модуль DBI Perl успешно установлен как необходимое условие:

    instmodsh 
    Available commands are:
       l            - List all installed modules
       m <module>   - Select a module
       q            - Quit the program
    cmd? l
    Installed modules are:
       DBI
       Perl

4. Попробуйте установить модуль perl от имени root DBD::DB2:

    DB2_HOME=/opt/ibm/db2/V11.5
    export DB2LIB=/opt/ibm/db2/V11.5/lib64

    [root@ol9vm-desk01 ~]# cpanm DBD::DB2
    --> Working on DBD::DB2
    Fetching http://www.cpan.org/authors/id/R/RO/ROCKETDB/DBD-DB2-1.89.tar.gz ... OK
    Configuring DBD-DB2-1.89 ... OK
    Building and testing DBD-DB2-1.89 ... FAIL
    ! Installing DBD::DB2 failed. See /root/.cpanm/work/1720158884.3245/build.log for details. Retry     with --force to force install it.

Вот заключительная часть ошибки журнала компиляции:

dbdimp.c: In function ‘dbd_st_cancel’:
/usr/local/lib64/perl5/5.32/auto/DBI/DBIXS.h:383:45: warning: unused variable ‘imp_dbh’ [-Wunused-variable]
  383 | #define D_imp_dbh_from_sth D_imp_from_child(imp_dbh, imp_dbh_t, imp_sth)
      |                                             ^~~~~~~
/usr/local/lib64/perl5/5.32/auto/DBI/DBIXS.h:381:39: note: in definition of macro ‘D_imp_from_child’
  381 |                                 type *name = (type*)(DBIc_PARENT_COM(child))
      |                                       ^~~~
dbdimp.c:3000:9: note: in expansion of macro ‘D_imp_dbh_from_sth’
 3000 |         D_imp_dbh_from_sth;
      |         ^~~~~~~~~~~~~~~~~~
dbdimp.c: In function ‘db2_st_finish’:
/usr/local/lib64/perl5/5.32/auto/DBI/DBIXS.h:383:45: warning: unused variable ‘imp_dbh’ [-Wunused-variable]
  383 | #define D_imp_dbh_from_sth D_imp_from_child(imp_dbh, imp_dbh_t, imp_sth)
      |                                             ^~~~~~~
/usr/local/lib64/perl5/5.32/auto/DBI/DBIXS.h:381:39: note: in definition of macro ‘D_imp_from_child’
  381 |                                 type *name = (type*)(DBIc_PARENT_COM(child))
      |                                       ^~~~
dbdimp.c:3019:9: note: in expansion of macro ‘D_imp_dbh_from_sth’
 3019 |         D_imp_dbh_from_sth;
      |         ^~~~~~~~~~~~~~~~~~
dbdimp.c: In function ‘bind_lob_column_helper’:
dbdimp.c:1081:1: warning: control reaches end of non-void function [-Wreturn-type]
 1081 | }
      | ^
dbdimp.c: In function ‘db2_describe’:
dbdimp.c:1318:20: warning: ‘db_codepage’ may be used uninitialized in this function [-Wmaybe-uninitialized]
 1318 |                 if ( app_codepage != db_codepage) {
      |                    ^
dbdimp.c:1318:20: warning: ‘app_codepage’ may be used uninitialized in this function [-Wmaybe-uninitialized]
cc1: some warnings being treated as errors
make: *** [Makefile:351: dbdimp.o] Error 1

В данный момент я действительно растерян...

Заранее спасибо за вашу помощь

Я попробовал найти среду db2 следующим образом:

source /home/tdbcli/sqllib/db2profile

но у меня такая же неудача.

Для лучшего понимания выкладываю полный лог сборки: https://drive.google.com/open?id=1-4UaeGKh_hZ__-T0v0TVwNxxce8I_6zD&usp=drive_fs

Похоже, что используемый вами Perl настроен так, чтобы компилятор C превращал определенные предупреждения в ошибки: в частности, предупреждения безопасности формата: -Werror=format-security. Вполне вероятно (хотя это и не показано в сокращенном списке предупреждений при компиляции dbdimp.c), что такое предупреждение выдается.

Dave Mitchell 06.07.2024 19:27

Вы еще не нашли фактическое сообщение об ошибке. Попробуйте grep -iw -A2 -B2 error build.log

Lorinczy Zsigmond 06.07.2024 22:47

Re «Здесь последняя часть ошибки журнала компиляции». Вы пропустили ошибки...

ikegami 07.07.2024 02:40

Для лучшего понимания выкладываю полный лог сборки: drive.google.com/…

alexraio 07.07.2024 22:45
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
128
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В вашем вопросе говорится, что вам также не удалось выполнить сборку DBD::DB2 на RHEL, хотя вы не предоставили никаких подробностей.

Этот ответ показывает текущий успешный статус этой сборки DBD::DB2 на RHEL 8.10 x64.

В приведенной ниже последовательности команд используется одноразовая копия clidriver только для того, чтобы показать, что сборка работает. Если вы хотите протестировать сборку, распакуйте clidriver в постоянное место (не в /tmp) и соответствующим образом настройте переменную среды. Однако в вашем случае у вас локально установлен клиент Db2, поэтому вы должны использовать его, если он правильно настроен (обычно путем расстановки точек в соответствующем db2profile, даже если это экземпляр клиента).

Примечание. Для выполнения этой конкретной сборки не требуется устанавливать какие-либо компоненты Db2, хотя соответствующие файлы заголовков и файлы библиотек должны присутствовать и идентифицироваться с помощью переменных среды, но это можно сделать с помощью метода нулевой установки. Но если у вас уже установлен соответствующий компонент Db2, его необходимо правильно сконфигурировать, и, в частности, соответствующие переменные среды (см. ниже) должны быть правильно установлены перед сборкой (db2profile).

Если вы получили другой результат на RHEL, проверьте свою конфигурацию.

perl -v

-- 5.26.3

cpanm DBI

-- 1,643

cd /tmp

-- загрузите копию климатического драйвера IBM.

curl -O https://public.dhe.ibm.com/ibmdl/export/pub/software/data/db2/drivers/odbc_cli/linuxx64_odbc_cli.tar.gz 

-- распаковываем клидрайвер и указываем на него переменные среды

tar xzf linuxx64_odbc_cli.tar.gz

export INCLUDE=/tmp/clidriver/include
export LIB=/tmp/clidriver/lib
export DB2_HOME=/tmp/clidriver
export LD_LIBRARY_PATH=/tmp/clidriver/LIB

-- теперь создайте драйвер DBD::DB2 и установите его.

# cpanm DBD::DB2
--> Working on DBD::DB2
Fetching http://www.cpan.org/authors/id/R/RO/ROCKETDB/DBD-DB2-1.89.tar.gz ... OK
Configuring DBD-DB2-1.89 ... OK
Building and testing DBD-DB2-1.89 ... OK
Successfully installed DBD-DB2-1.89
1 distribution installed

Если вы получили другой результат (т. е. cc1: some warnings being treated as errors), возможно, ваша версия perl скомпилирована с опцией -Werror (или аналогичной) для gcc в CCFLAGS, чтобы сообщать о предупреждениях как об ошибках.

Некоторые варианты исследования:

(1) пересобрать Perl без -Werror=format-security (не рекомендуется)

(2) не используйте cpanm для сборки DBD::DB2, а вместо этого создайте его вручную из Makefile.PL, корректируя код при необходимости (возможное изменение кода см. В другом ответе).

(3) посмотрите, могут ли дополнительные параметры cpanm корректировать cflags, например --configure-args = "--cflags=...." to remove the -Werror=format-security`

(4) Либо используйте более старую версию Perl, которая не имеет дефекта кодирования, вызывающего выдачу предупреждения format-security. Или просто подождите, пока репозиторий обновится с исправлением кода, а затем пересоберите его.

Я попытался найти среду db2 следующим образом: source /home/tdbcli/sqllib/db2profile, но получил ту же ошибку. Для лучшего понимания выкладываю полный лог сборки: drive.google.com/…

alexraio 07.07.2024 22:37

Для справки: я попытался скомпилировать Perl-модуль DBD::DB2 на Redhat 8 (perl v. 5.26), и он работает как положено. Может ли быть проблема с Perl v. 5.32 ???

alexraio 08.07.2024 08:51
Ответ принят как подходящий

Исправьте dbdimp.c:

$ diff -u dbdimp.bak dbdimp.c
--- dbdimp.bak  2021-04-07 05:43:19.000000000 +0200
+++ dbdimp.c    2024-07-08 14:30:15.240336900 +0200
@@ -2896,7 +2896,7 @@
               if ( longTruncOk )
                 warn( "%s", msg );
               else
-                croak( msg );
+                croak( "%s", msg );    
             }
             else if ( ChopBlanks && SQL_CHAR == fbh->dbtype )

Большое спасибо! Это решало мою проблему. Я загружал пакет и менял код, как вы упомянули. Ручная компиляция работала нормально.

alexraio 10.07.2024 18:34

Другие вопросы по теме