Closed janvda closed 1 year ago
Going back to an older alpine/g++ fixed the issue as in that case I could install the package:
bash-5.0$ sudo su -
90f9e2f349d7:~# npm install ibm_db
added 60 packages, and audited 61 packages in 47s
4 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
npm notice
npm notice New major version of npm available! 8.1.2 -> 9.1.2
npm notice Changelog: https://github.com/npm/cli/releases/tag/v9.1.2
npm notice Run npm install -g npm@9.1.2 to update!
npm notice
90f9e2f349d7:~#
So I don't have the error with following alpine / g++ compiler version:
90f9e2f349d7:~# uname -a
Linux 90f9e2f349d7 5.10.93-0-virt #1-Alpine SMP Thu, 27 Jan 2022 09:34:38 +0000 x86_64 Linux
90f9e2f349d7:~# g++ --version
g++ (Alpine 9.3.0) 9.3.0
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.
90f9e2f349d7:~# gcc --version
gcc (Alpine 9.3.0) 9.3.0
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.
90f9e2f349d7:~#
FYI I have the error with following alpine / g++ compiler version:
bash-5.1$ uname -a
Linux f6727d6f5e15 5.10.93-0-virt #1-Alpine SMP Thu, 27 Jan 2022 09:34:38 +0000 x86_64 Linux
282110cdcbe7:~# which g++
/usr/bin/g++
282110cdcbe7:~# g++ --version
g++ (Alpine 11.2.1_git20220219) 11.2.1 20220219
Copyright (C) 2021 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.
282110cdcbe7:~# gcc --version
gcc (Alpine 11.2.1_git20220219) 11.2.1 20220219
I am having same issue when using docker image: node:19.1.0-alpine3.16
So I started container on my macbook pro with following command:
docker run node:19.1.0-alpine3.16 sh -c 'while sleep 3600; do :; done'
I had to install following packages:
apk add python3 make alpine-sdk
The error output:
/ # mkdir data
/ # cd /data
/data # npm install ibm_db
npm ERR! code 1
npm ERR! path /data/node_modules/ibm_db
npm ERR! command failed
npm ERR! command sh -c -- node installer/driverInstall.js
npm ERR! platform = linux, arch = x64, node.js version = v19.1.0
npm ERR! make version =GNU Make 4.3
npm ERR!
npm ERR! ****************************************
npm ERR! You are downloading a package which includes the Node.js module for IBM DB2/Informix. The module is licensed under the Apache License 2.0. The package also includes IBM ODBC and CLI Driver from IBM, which is automatically downloaded as the node module is installed on your system/device. The license agreement to the IBM ODBC and CLI Driver is available in /data/node_modules/ibm_db/installer/clidriver. Check for additional dependencies, which may come with their own license agreement(s). Your use of the components of the package and dependencies constitutes your acceptance of their respective license agreements. If you do not accept the terms of any license agreement(s), then delete the relevant component(s) from your device.
npm ERR! ****************************************
npm ERR!
npm ERR! Downloading DB2 ODBC CLI Driver from https://public.dhe.ibm.com/ibmdl/export/pub/software/data/db2/drivers/odbc_cli/linuxx64_odbc_cli.tar.gz ...
npm ERR!
100.00% | 25012651 bytes downloaded out of 25012651 bytes.
npm ERR!
npm ERR! Downloading and extraction of DB2 ODBC CLI Driver completed successfully.
npm ERR!
npm ERR! make: Entering directory '/data/node_modules/ibm_db/build'
npm ERR! CXX(target) Release/obj.target/odbc_bindings/src/odbc.o
npm ERR! make: Leaving directory '/data/node_modules/ibm_db/build'
npm ERR!
npm ERR! Error: Command failed: node-gyp configure build --IS_DOWNLOADED=true --IBM_DB_HOME="$IBM_DB_HOME"
npm ERR! gyp info it worked if it ends with ok
npm ERR! gyp info using node-gyp@9.1.0
npm ERR! gyp info using node@19.1.0 | linux | x64
npm ERR! gyp info find Python using Python version 3.10.8 found at "/usr/bin/python3"
npm ERR! gyp info spawn /usr/bin/python3
npm ERR! gyp info spawn args [
npm ERR! gyp info spawn args '/usr/local/lib/node_modules/npm/node_modules/node-gyp/gyp/gyp_main.py',
npm ERR! gyp info spawn args 'binding.gyp',
npm ERR! gyp info spawn args '-f',
npm ERR! gyp info spawn args 'make',
npm ERR! gyp info spawn args '-I',
npm ERR! gyp info spawn args '/data/node_modules/ibm_db/build/config.gypi',
npm ERR! gyp info spawn args '-I',
npm ERR! gyp info spawn args '/usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi',
npm ERR! gyp info spawn args '-I',
npm ERR! gyp info spawn args '/root/.cache/node-gyp/19.1.0/include/node/common.gypi',
npm ERR! gyp info spawn args '-Dlibrary=shared_library',
npm ERR! gyp info spawn args '-Dvisibility=default',
npm ERR! gyp info spawn args '-Dnode_root_dir=/root/.cache/node-gyp/19.1.0',
npm ERR! gyp info spawn args '-Dnode_gyp_dir=/usr/local/lib/node_modules/npm/node_modules/node-gyp',
npm ERR! gyp info spawn args '-Dnode_lib_file=/root/.cache/node-gyp/19.1.0/<(target_arch)/node.lib',
npm ERR! gyp info spawn args '-Dmodule_root_dir=/data/node_modules/ibm_db',
npm ERR! gyp info spawn args '-Dnode_engine=v8',
npm ERR! gyp info spawn args '--depth=.',
npm ERR! gyp info spawn args '--no-parallel',
npm ERR! gyp info spawn args '--generator-output',
npm ERR! gyp info spawn args 'build',
npm ERR! gyp info spawn args '-Goutput_dir=.'
npm ERR! gyp info spawn args ]
npm ERR! gyp info spawn make
npm ERR! gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ]
npm ERR! In file included from ../src/odbc.cpp:29:
npm ERR! ../src/odbc.h: In constructor 'ODBC::ODBC()':
npm ERR! ../src/odbc.h:142:23: error: cast from 'std::nullptr_t' to 'SQLHENV' {aka 'int'} loses precision [-fpermissive]
npm ERR! 142 | ODBC() { m_hEnv = (SQLHENV)NULL; }
npm ERR! | ^
npm ERR! ../src/odbc.cpp: In member function 'void ODBC::Free()':
npm ERR! ../src/odbc.cpp:110:14: error: cast from 'std::nullptr_t' to 'SQLHENV' {aka 'int'} loses precision [-fpermissive]
npm ERR! 110 | m_hEnv = (SQLHENV)NULL;
npm ERR! | ^
npm ERR! ../src/odbc.cpp: In static member function 'static Nan::NAN_METHOD_RETURN_TYPE ODBC::New(Nan::NAN_METHOD_ARGS_TYPE)':
npm ERR! ../src/odbc.cpp:122:17: error: cast from 'std::nullptr_t' to 'SQLHENV' {aka 'int'} loses precision [-fpermissive]
npm ERR! 122 | dbo->m_hEnv = (SQLHENV)NULL;
npm ERR! | ^
npm ERR! ../src/odbc.cpp: In static member function 'static void ODBC::UV_AfterCreateConnection(uv_work_t*, int)':
npm ERR! ../src/odbc.cpp:216:19: warning: 'v8::Local<v8::Value> Nan::Callback::Call(int, v8::Local<v8::Value>*) const' is deprecated [-Wdeprecated-declarations]
npm ERR! 216 | data->cb->Call(1, info);
npm ERR! | ~~~~~~~~~~~~~~^~~~~~~~~
npm ERR! In file included from ../src/odbc.h:23,
npm ERR! from ../src/odbc.cpp:29:
npm ERR! ../../nan/nan.h:1746:3: note: declared here
npm ERR! 1746 | Call(int argc, v8::Local<v8::Value> argv[]) const {
npm ERR! | ^~~~
npm ERR! ../src/odbc.cpp:228:19: warning: 'v8::Local<v8::Value> Nan::Callback::Call(int, v8::Local<v8::Value>*) const' is deprecated [-Wdeprecated-declarations]
npm ERR! 228 | data->cb->Call(2, info);
npm ERR! | ~~~~~~~~~~~~~~^~~~~~~~~
npm ERR! In file included from ../src/odbc.h:23,
npm ERR! from ../src/odbc.cpp:29:
npm ERR! ../../nan/nan.h:1746:3: note: declared here
npm ERR! 1746 | Call(int argc, v8::Local<v8::Value> argv[]) const {
npm ERR! | ^~~~
npm ERR! ../src/odbc.cpp: In static member function 'static v8::Local<v8::Value> ODBC::CallbackSQLError(SQLSMALLINT, SQLHANDLE, char*, Nan::Callback*)':
npm ERR! ../src/odbc.cpp:1501:11: warning: 'v8::Local<v8::Value> Nan::Callback::Call(int, v8::Local<v8::Value>*) const' is deprecated [-Wdeprecated-declarations]
npm ERR! 1501 | cb->Call(1, info);
npm ERR! | ~~~~~~~~^~~~~~~~~
npm ERR! In file included from ../src/odbc.h:23,
npm ERR! from ../src/odbc.cpp:29:
npm ERR! ../../nan/nan.h:1746:3: note: declared here
npm ERR! 1746 | Call(int argc, v8::Local<v8::Value> argv[]) const {
npm ERR! | ^~~~
npm ERR! In file included from ../src/odbc.cpp:24:
npm ERR! ../src/odbc.cpp: At global scope:
npm ERR! /root/.cache/node-gyp/19.1.0/include/node/node.h:993:7: warning: cast between incompatible function types from 'void (*)(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE)' {aka 'void (*)(v8::Local<v8::Object>)'} to 'node::addon_register_func' {aka 'void (*)(v8::Local<v8::Object>, v8::Local<v8::Value>, void*)'} [-Wcast-function-type]
npm ERR! 993 | (node::addon_register_func) (regfunc), \
npm ERR! | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
npm ERR! /root/.cache/node-gyp/19.1.0/include/node/node.h:1027:3: note: in expansion of macro 'NODE_MODULE_X'
npm ERR! 1027 | NODE_MODULE_X(modname, regfunc, NULL, 0) // NOLINT (readability/null_usage)
npm ERR! | ^~~~~~~~~~~~~
npm ERR! ../src/odbc.cpp:1665:1: note: in expansion of macro 'NODE_MODULE'
npm ERR! 1665 | NODE_MODULE(odbc_bindings, init)
npm ERR! | ^~~~~~~~~~~
npm ERR! ../src/odbc.cpp: In static member function 'static v8::Local<v8::Value> ODBC::GetColumnValue(SQLHSTMT, Column, uint16_t*, size_t)':
npm ERR! ../src/odbc.cpp:598:9: warning: this statement may fall through [-Wimplicit-fallthrough=]
npm ERR! 598 | if(column.type == SQL_BIGINT)
npm ERR! | ^~
npm ERR! ../src/odbc.cpp:603:5: note: here
npm ERR! 603 | case SQL_DBCLOB:
npm ERR! | ^~~~
npm ERR! ../src/odbc.cpp:604:9: warning: this statement may fall through [-Wimplicit-fallthrough=]
npm ERR! 604 | if(column.type == SQL_DBCLOB)
npm ERR! | ^~
npm ERR! ../src/odbc.cpp:609:5: note: here
npm ERR! 609 | default :
npm ERR! | ^~~~~~~
npm ERR! ../src/odbc.cpp: In static member function 'static v8::Local<v8::Value> ODBC::GetOutputParameter(Parameter)':
npm ERR! ../src/odbc.cpp:772:9: warning: this statement may fall through [-Wimplicit-fallthrough=]
npm ERR! 772 | if(prm.type == SQL_NUMERIC)
npm ERR! | ^~
npm ERR! ../src/odbc.cpp:774:5: note: here
npm ERR! 774 | case SQL_BIGINT :
npm ERR! | ^~~~
npm ERR! ../src/odbc.cpp:826:9: warning: this statement may fall through [-Wimplicit-fallthrough=]
npm ERR! 826 | if(prm.type == SQL_DECIMAL) {
npm ERR! | ^~
npm ERR! ../src/odbc.cpp:829:5: note: here
npm ERR! 829 | case SQL_FLOAT :
npm ERR! | ^~~~
npm ERR! ../src/odbc.cpp:871:9: warning: this statement may fall through [-Wimplicit-fallthrough=]
npm ERR! 871 | if((int) prm.type == SQL_DBCLOB)
npm ERR! | ^~
npm ERR! ../src/odbc.cpp:875:5: note: here
npm ERR! 875 | case SQL_BLOB :
npm ERR! | ^~~~
npm ERR! ../src/odbc.cpp:876:9: warning: this statement may fall through [-Wimplicit-fallthrough=]
npm ERR! 876 | if((int) prm.type == SQL_BLOB)
npm ERR! | ^~
npm ERR! ../src/odbc.cpp:880:5: note: here
npm ERR! 880 | default :
npm ERR! | ^~~~~~~
npm ERR! make: *** [odbc_bindings.target.mk:120: Release/obj.target/odbc_bindings/src/odbc.o] Error 1
npm ERR! gyp ERR! build error
npm ERR! gyp ERR! stack Error: `make` failed with exit code: 2
npm ERR! gyp ERR! stack at ChildProcess.onExit (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:201:23)
npm ERR! gyp ERR! stack at ChildProcess.emit (node:events:513:28)
npm ERR! gyp ERR! stack at ChildProcess._handle.onexit (node:internal/child_process:293:12)
npm ERR! gyp ERR! System Linux 5.10.93-0-virt
npm ERR! gyp ERR! command "/usr/local/bin/node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "configure" "build" "--IS_DOWNLOADED=true" "--IBM_DB_HOME=/data/node_modules/ibm_db/installer/clidriver"
npm ERR! gyp ERR! cwd /data/node_modules/ibm_db
npm ERR! gyp ERR! node -v v19.1.0
npm ERR! gyp ERR! node-gyp -v v9.1.0
npm ERR! gyp ERR! not ok
npm ERR!
npm ERR! at ChildProcess.exithandler (node:child_process:419:12)
npm ERR! at ChildProcess.emit (node:events:513:28)
npm ERR! at maybeClose (node:internal/child_process:1098:16)
npm ERR! at ChildProcess._handle.onexit (node:internal/child_process:304:5) {
npm ERR! code: 1,
npm ERR! killed: false,
npm ERR! signal: null,
npm ERR! cmd: 'node-gyp configure build --IS_DOWNLOADED=true --IBM_DB_HOME="$IBM_DB_HOME"'
npm ERR! }
npm ERR! A complete log of this run can be found in:
npm ERR! /root/.npm/_logs/2022-11-22T16_20_51_270Z-debug-0.log
/data # ^C
installing also didn't work when using alpine image : node:14.21.1-alpine3.16
installing works when using older alpine image : node:14-alpine3.14
@janvda It seems duplicate of your another issue #895 . Thanks.
It is not exactly a duplicate as I could install it on older alpine version as I mentioned here above. So this issue I am only getting when using newer alpine versions. While issue #895 is reported for older alpine versions.
@janvda The above compilation error is due to the difference in the header file of gcc on Alpine Linux and other Linux flavour. The gcc on Apline is /usr/lib/gcc/x86_64-alpine-linux-musl/ and if we check the /usr/include/stdlib.h file, the definition of NULL can be found as below:
#if __cplusplus >= 201103L
#define NULL nullptr
#elif defined(__cplusplus)
#define NULL 0L
#else
#define NULL ((void*)0)
#endif
We can not see file stddef.h
include in /usr/include/stdlib.h
on Alpine which has the correct definition of NULL. If we check /usr/include/stdlib.h
file on other Linux flavor, we can see stddef.h
is include in /usr/include/stdlib.h
. The NULL in stddef.h is defined as below:
#ifdef __GNUG__
#define NULL __null
#else /* G++ */
#ifndef __cplusplus
#define NULL ((void *)0)
#else /* C++ */
#define NULL 0
#endif /* C++ */
#endif /* G++ */
We can fix the compilation error by just adding a line #define NULL 0
in ibm_db/src/odbc.h
file and compilation would succeed. But, you wont be able to run any test program using ibm_db.
The reason is, ibm_db uses IBM ODBC and CLI Driver internally for communication with server and IBM Driver is not compiled using ld-musl-x86_64.so.1
, but it is compiled using ld-linux-x86-64.so.2
. To verify it, you can download https://public.dhe.ibm.com/ibmdl/export/pub/software/data/db2/drivers/odbc_cli/linuxx64_odbc_cli.tar.gz
on Alpine Linux, untar it, cd to clidriver/bin directory and execute ./db2level
. It will not run. ldd db2level
command will give info about missing symbols.
Same problem you can see if you download https://nodejs.org/dist/v19.1.0/node-v19.1.0-linux-x64.tar.gz
and try to use it. This node is also compiled using ld-linux-x86-64.so.2
and ldd node
will show you the missing symbols. The node
which get installed by apk add nodejs
is compiled using ld-musl-x86_64.so.1
, so it works on Alpine Linux.
Hence, as per previous comment https://github.com/ibmdb/node-ibm_db/issues/217#issuecomment-274738255, Alpine Linux is not a supported platform for node ibm_db. We have documented this limitation in the latest Readme.md file.
Hence, closing this issue. Thanks.
Running in alpine docker container on my macbook
Note that I have installed following packages:
Only PATH is set:
npm install ibm_db
command.