почему duckdb компилируется с помощью проверки R CMD, но не УСТАНОВКИ R CMD?

#c #r #r-package #rtools #duckdb

#c #r #r-пакет #инструменты #duckdb

Вопрос:

Я пытаюсь скомпилировать пакет duckdb (0.3.1 из CRAN) из исходного tar-файла в Windows 10, используя набор инструментов R Tools gt;4.0 (из оболочки MSYS2 terminal x64 BASH).

Компиляция необходима, потому что наш брандмауэр блокирует загрузку готовых двоичных файлов из CRAN.

Я сначала проверил посылку с:

 R CMD check -l . --no-stop-on-test-error --install-args="--no-test-load" duckdb_0.3.1-1.tar.gz  

Это --no-test-load потому, что у нас есть белый список DLL, поэтому мне нужно сначала создать библиотеки DLL, а затем внести их в белый список, прежде чем им будет разрешено загружаться.

Это дает ожидаемый результат: пакет может быть скомпилирован (как для архитектуры i386, так и для архитектуры x64) и установлен, но при check попытке загрузить пакет возникают ошибки:

 * using log directory 'P:/tmp/duckdb.Rcheck' * using R version 4.0.2 (2020-06-22) * using platform: x86_64-w64-mingw32 (64-bit) * using session charset: ISO8859-1 * using option '--no-stop-on-test-error' * checking for file 'duckdb/DESCRIPTION' ... OK * this is package 'duckdb' version '0.3.1-1' * package encoding: UTF-8 * checking package namespace information ... OK * checking package dependencies ... OK * checking if this is a source package ... OK * checking if there is a namespace ... OK * checking for executable files ... OK * checking for hidden files and directories ... OK * checking for portable file names ... OK * checking whether package 'duckdb' can be installed ... OK * checking installed package size ... NOTE  installed size is 32.4Mb  sub-directories of 1Mb or more:  libs 32.1Mb * checking package directory ... OK * checking DESCRIPTION meta-information ... OK * checking top-level files ... OK * checking for left-over files ... OK * checking index information ... OK * checking package subdirectories ... OK * checking R files for non-ASCII characters ... OK * checking R files for syntax errors ... OK * loading checks for arch 'i386' ** checking whether the package can be loaded ... ERROR Loading this package had a fatal error status code 1 Loading log: Loading required package: DBI Error: package or namespace load failed for 'duckdb' in inDL(x, as.logical(local), as.logical(now), ...):  unable to load shared object 'P:/tmp/duckdb/libs/i386/duckdb.dll':  LoadLibrary failure: Access is denied. Execution halted ** DONE  Status: 1 ERROR, 1 NOTE See  'P:/tmp/duckdb.Rcheck/00check.log' for details.  

В журнале установки есть несколько предупреждений, связанных со сравнением подписанных и неподписанных значений, но ничего фатального. Вот конец i386 раздела журнала установки, демонстрирующего отсутствие ошибок при ld создании окончательного duckdb.dll :

 lt;secret-pathgt;/Rtools40/mingw32/bin/g   -shared -s -static-libgcc -o duckdb.dll tmp.def rapi.o database.o connection.o statement.o register.o scan.o utils.o altrep.o types.o duckdb/extension/parquet/column_reader.o duckdb/extension/parquet/parquet-extension.o duckdb/extension/parquet/parquet_metadata.o duckdb/extension/parquet/parquet_reader.o duckdb/extension/parquet/parquet_statistics.o duckdb/extension/parquet/parquet_timestamp.o duckdb/extension/parquet/parquet_writer.o duckdb/amalgamation-1.o duckdb/amalgamation-2.o duckdb/amalgamation-3.o duckdb/amalgamation-4.o duckdb/amalgamation-5.o duckdb/amalgamation-6.o duckdb/amalgamation-7.o duckdb/third_party/fmt/format.o duckdb/third_party/hyperloglog/hyperloglog.o duckdb/third_party/hyperloglog/sds.o duckdb/third_party/libpg_query/pg_functions.o duckdb/third_party/libpg_query/postgres_parser.o duckdb/third_party/libpg_query/src_backend_nodes_list.o duckdb/third_party/libpg_query/src_backend_nodes_makefuncs.o duckdb/third_party/libpg_query/src_backend_nodes_value.o duckdb/third_party/libpg_query/src_backend_parser_gram.o duckdb/third_party/libpg_query/src_backend_parser_parser.o duckdb/third_party/libpg_query/src_backend_parser_scan.o duckdb/third_party/libpg_query/src_backend_parser_scansup.o duckdb/third_party/libpg_query/src_common_keywords.o duckdb/third_party/miniz/miniz.o duckdb/third_party/parquet/parquet_constants.o duckdb/third_party/parquet/parquet_types.o duckdb/third_party/re2/re2/bitstate.o duckdb/third_party/re2/re2/compile.o duckdb/third_party/re2/re2/dfa.o duckdb/third_party/re2/re2/filtered_re2.o duckdb/third_party/re2/re2/mimics_pcre.o duckdb/third_party/re2/re2/nfa.o duckdb/third_party/re2/re2/onepass.o duckdb/third_party/re2/re2/parse.o duckdb/third_party/re2/re2/perl_groups.o duckdb/third_party/re2/re2/prefilter.o duckdb/third_party/re2/re2/prefilter_tree.o duckdb/third_party/re2/re2/prog.o duckdb/third_party/re2/re2/re2.o duckdb/third_party/re2/re2/regexp.o duckdb/third_party/re2/re2/set.o duckdb/third_party/re2/re2/simplify.o duckdb/third_party/re2/re2/stringpiece.o duckdb/third_party/re2/re2/tostring.o duckdb/third_party/re2/re2/unicode_casefold.o duckdb/third_party/re2/re2/unicode_groups.o duckdb/third_party/re2/util/rune.o duckdb/third_party/re2/util/strutil.o duckdb/third_party/snappy/snappy-sinksource.o duckdb/third_party/snappy/snappy.o duckdb/third_party/thrift/thrift/protocol/TProtocol.o duckdb/third_party/thrift/thrift/transport/TBufferTransports.o duckdb/third_party/thrift/thrift/transport/TTransportException.o duckdb/third_party/utf8proc/utf8proc.o duckdb/third_party/utf8proc/utf8proc_wrapper.o duckdb/third_party/zstd/common/entropy_common.o duckdb/third_party/zstd/common/error_private.o duckdb/third_party/zstd/common/fse_decompress.o duckdb/third_party/zstd/common/xxhash.o duckdb/third_party/zstd/common/zstd_common.o duckdb/third_party/zstd/compress/fse_compress.o duckdb/third_party/zstd/compress/hist.o duckdb/third_party/zstd/compress/huf_compress.o duckdb/third_party/zstd/compress/zstd_compress.o duckdb/third_party/zstd/compress/zstd_compress_literals.o duckdb/third_party/zstd/compress/zstd_compress_sequences.o duckdb/third_party/zstd/compress/zstd_compress_superblock.o duckdb/third_party/zstd/compress/zstd_double_fast.o duckdb/third_party/zstd/compress/zstd_fast.o duckdb/third_party/zstd/compress/zstd_lazy.o duckdb/third_party/zstd/compress/zstd_ldm.o duckdb/third_party/zstd/compress/zstd_opt.o duckdb/third_party/zstd/decompress/huf_decompress.o duckdb/third_party/zstd/decompress/zstd_ddict.o duckdb/third_party/zstd/decompress/zstd_decompress.o duckdb/third_party/zstd/decompress/zstd_decompress_block.o duckdb/amalgamation-8.o -LC:lt;secret-pathgt;/R-40~1.2/bin/i386 -lR There were 50 or more warnings (use warnings() to see the first 50)  installing to P:/tmp/00LOCK-duckdb/00new/duckdb/libs/i386    *** arch - x64 lt;snip similar log for x64 architecture...gt;  

At the end of this I have a fully-compiled and installed package in the «duckdb» directory — I just can’t load it into my R session due to DLL whitelisting. So far so good.

Then I try to install the package using R CMD INSTALL --no-test-load -l . duckdb_0.3.1-1.tar.gz (and variations). Unfortunately the build fails. The log seems identical up to the point where it tries to link the .o files into the duckdb.dll , at which point:

 lt;secret-pathgt;/Rtools40/mingw32/bin/g   -shared -s -static-libgcc -o duckdb.dll tmp.def rapi.o database.o connection.o statement.o register.o scan.o utils.o altrep.o types.o duckdb/extension/parquet/column_reader.o duckdb/extension/parquet/parquet-extension.o duckdb/extension/parquet/parquet_metadata.o duckdb/extension/parquet/parquet_reader.o duckdb/extension/parquet/parquet_statistics.o duckdb/extension/parquet/parquet_timestamp.o duckdb/extension/parquet/parquet_writer.o duckdb/amalgamation-1.o duckdb/amalgamation-2.o duckdb/amalgamation-3.o duckdb/amalgamation-4.o duckdb/amalgamation-5.o duckdb/amalgamation-6.o duckdb/amalgamation-7.o duckdb/third_party/fmt/format.o duckdb/third_party/hyperloglog/hyperloglog.o duckdb/third_party/hyperloglog/sds.o duckdb/third_party/libpg_query/pg_functions.o duckdb/third_party/libpg_query/postgres_parser.o duckdb/third_party/libpg_query/src_backend_nodes_list.o duckdb/third_party/libpg_query/src_backend_nodes_makefuncs.o duckdb/third_party/libpg_query/src_backend_nodes_value.o duckdb/third_party/libpg_query/src_backend_parser_gram.o duckdb/third_party/libpg_query/src_backend_parser_parser.o duckdb/third_party/libpg_query/src_backend_parser_scan.o duckdb/third_party/libpg_query/src_backend_parser_scansup.o duckdb/third_party/libpg_query/src_common_keywords.o duckdb/third_party/miniz/miniz.o duckdb/third_party/parquet/parquet_constants.o duckdb/third_party/parquet/parquet_types.o duckdb/third_party/re2/re2/bitstate.o duckdb/third_party/re2/re2/compile.o duckdb/third_party/re2/re2/dfa.o duckdb/third_party/re2/re2/filtered_re2.o duckdb/third_party/re2/re2/mimics_pcre.o duckdb/third_party/re2/re2/nfa.o duckdb/third_party/re2/re2/onepass.o duckdb/third_party/re2/re2/parse.o duckdb/third_party/re2/re2/perl_groups.o duckdb/third_party/re2/re2/prefilter.o duckdb/third_party/re2/re2/prefilter_tree.o duckdb/third_party/re2/re2/prog.o duckdb/third_party/re2/re2/re2.o duckdb/third_party/re2/re2/regexp.o duckdb/third_party/re2/re2/set.o duckdb/third_party/re2/re2/simplify.o duckdb/third_party/re2/re2/stringpiece.o duckdb/third_party/re2/re2/tostring.o duckdb/third_party/re2/re2/unicode_casefold.o duckdb/third_party/re2/re2/unicode_groups.o duckdb/third_party/re2/util/rune.o duckdb/third_party/re2/util/strutil.o duckdb/third_party/snappy/snappy-sinksource.o duckdb/third_party/snappy/snappy.o duckdb/third_party/thrift/thrift/protocol/TProtocol.o duckdb/third_party/thrift/thrift/transport/TBufferTransports.o duckdb/third_party/thrift/thrift/transport/TTransportException.o duckdb/third_party/utf8proc/utf8proc.o duckdb/third_party/utf8proc/utf8proc_wrapper.o duckdb/third_party/zstd/common/entropy_common.o duckdb/third_party/zstd/common/error_private.o duckdb/third_party/zstd/common/fse_decompress.o duckdb/third_party/zstd/common/xxhash.o duckdb/third_party/zstd/common/zstd_common.o duckdb/third_party/zstd/compress/fse_compress.o duckdb/third_party/zstd/compress/hist.o duckdb/third_party/zstd/compress/huf_compress.o duckdb/third_party/zstd/compress/zstd_compress.o duckdb/third_party/zstd/compress/zstd_compress_literals.o duckdb/third_party/zstd/compress/zstd_compress_sequences.o duckdb/third_party/zstd/compress/zstd_compress_superblock.o duckdb/third_party/zstd/compress/zstd_double_fast.o duckdb/third_party/zstd/compress/zstd_fast.o duckdb/third_party/zstd/compress/zstd_lazy.o duckdb/third_party/zstd/compress/zstd_ldm.o duckdb/third_party/zstd/compress/zstd_opt.o duckdb/third_party/zstd/decompress/huf_decompress.o duckdb/third_party/zstd/decompress/zstd_ddict.o duckdb/third_party/zstd/decompress/zstd_decompress.o duckdb/third_party/zstd/decompress/zstd_decompress_block.o duckdb/amalgamation-8.o -LC:lt;secret-pathgt;/R-4.0.2/bin/i386 -lR lt;secret-pathgt;Rtools40mingw32i686-w64-mingw32binld.exe: cannot open output file duckdb.dll: No such file or directory collect2.exe: error: ld returned 1 exit status no DLL was created ERROR: compilation failed for package 'duckdb' * removing 'P:/tmp/duckdb'  

Note I have obfuscated the full path to executables but I have had no problems building and installing packages without compiled code so I know that R Tools generally works in this environment. I have diffed the install logs of the check and INSTALL runs but I can’t seem to find anything that seems significant. The only real difference is that in the check logs, a shortened path using the tilde seems to be passed to build utilities e.g. the argument -LC:lt;secret-path-with-tildesgt;/R-40~1.2/bin/i386 -lR passed to ld by check whereas in the INSTALL run the expanded path is used. These paths are somewhat long (about 110 chars) and I wonder whether that is somehow causing ld to choke — but there are no embedded spaces. I doubt this is the problem but mention it for completeness.

It would be very helpful to know the exact parameters with with R CMD check invokes INSTALL so that I can narrow things down. I could not find this documented in the «Writing R Extensions» manual or the «Tools» section of the «R Internals» manual. I’ve also had a quick search through the ld manual but no mention of long paths. In case it’s not obvious, I have no experience using compilers (beyond the automagical stuff that happens on my Debian box at home). My next strategy is to go source-code diving but I am hoping to avoid that if possible.

Вероятно, также стоит упомянуть , что наша библиотека пакетов сайта добавлена в мою .Rprofile (которая ничего не делает, кроме настройки .libPaths() ), и я знаю check , что она должна работать --vanilla , поэтому я попытался также запустить, например R --vanilla CMD INSTALL ... , но с тем же результатом. Я также задавался вопросом , может ли быть что-то другое в каталоге поэтапной установки, поэтому я попытался перейти --no-staged-install в INSTALL него, снова с тем же результатом, и в этот момент я решил, что было бы лучше обратиться за помощью в понимании проблемы, а не продолжать методом проб и ошибок.