官方 CRAN R 包能否依赖英特尔 MKL 和 CMake? (和检查?)
Can an official CRAN R package depend on Intel MKL and CMake? (and Check ?)
在我的 R 包中,我有 C 代码,它使用 Intel MKL (and an open source library for C unit testing). I use CMake to build the C code. I also have Rcpp 接口代码,我用它来从 R 调用 C 代码。
我想知道 CRAN 是否会接受这个软件包,因为您必须在系统上安装 Intel MKL 和 CMake 才能工作?
我不太担心单元测试,我总能摆脱它,但我绝对需要英特尔 MKL,因为我使用的是特定于 MKL 的线性代数例程,例如稀疏矩阵-密集矩阵相乘等
我需要 CMake 的原因是因为目前我正在使用它从 C 代码构建静态库并操作包的 src
文件夹中的 Makevars
文件,以便我可以 link 针对 C 库的 Rcpp 接口代码。
我的 Makevars
看起来如下:
PKG_CPPFLAGS=-I/usr/local/lib/R/site-library/Rcpp/include -I/opt/intel/compilers_and_libraries_2019.4.243/linux/mkl/include -I./C
PKG_LIBS=-L./C/cmake-build-release -lbcd -llog -Wl,--start-group /opt/intel/compilers_and_libraries_2019.4.243/linux/mkl/lib/intel64/libmkl_intel_ilp64.a /opt/intel/compilers_and_libraries_2019.4.243/linux/mkl/lib/intel64/libmkl_sequential.a /opt/intel/compilers_and_libraries_2019.4.243/linux/mkl/lib/intel64/libmkl_core.a -Wl,--end-group -lpthread -lm -ldl
这适用于 Ubuntu,但我担心 OS X,尤其是 Windows。例如,here 有人声称英特尔 MKL 与 minGW
不兼容。
我知道有许多使用 MKL 或 CMake 的 CRAN 包。但对于我调查过的那些,MKL 用作可选的 BLAS 库,CMake 用于构建 inst
文件夹下的内容,这不依赖于外部库。我查看了 writing R extensions and also the CRAN submission page 但找不到答案。我认为既然有越来越多的人对将 CMake 和 MKL 与 R 一起使用感兴趣,那么有一个 SO post 会很好。
看来你把事情搞错了。
您创建了一个范围更窄、更专业的解决方案(MKL、CMake)。
现在你担心它可能太专业了。你走在正确的道路上。首先,CMake 是 被其他包使用,因此您可以将其声明为 SystemRequirements:
。其次,MKL 更难但......也真正专业。
我认为 更广泛的 CRAN 上传 的一般建议是
- 放宽您的代码要求:如果存在则使用 MKL,但在不存在时提供回退;现在您不再需要 MKL
- CMake 同上:保留它并依赖它,最好还是尽量不要要求它,因为大多数 15000 个其他 CRAN 包也不需要它。
点击这两项后,您就可以进行 CRAN 上传了。如果这一切看起来很繁琐,请坚持使用 GitHub 存储库或 drat 存储库。
在我的 R 包中,我有 C 代码,它使用 Intel MKL (and an open source library for C unit testing). I use CMake to build the C code. I also have Rcpp 接口代码,我用它来从 R 调用 C 代码。
我想知道 CRAN 是否会接受这个软件包,因为您必须在系统上安装 Intel MKL 和 CMake 才能工作?
我不太担心单元测试,我总能摆脱它,但我绝对需要英特尔 MKL,因为我使用的是特定于 MKL 的线性代数例程,例如稀疏矩阵-密集矩阵相乘等
我需要 CMake 的原因是因为目前我正在使用它从 C 代码构建静态库并操作包的 src
文件夹中的 Makevars
文件,以便我可以 link 针对 C 库的 Rcpp 接口代码。
我的 Makevars
看起来如下:
PKG_CPPFLAGS=-I/usr/local/lib/R/site-library/Rcpp/include -I/opt/intel/compilers_and_libraries_2019.4.243/linux/mkl/include -I./C
PKG_LIBS=-L./C/cmake-build-release -lbcd -llog -Wl,--start-group /opt/intel/compilers_and_libraries_2019.4.243/linux/mkl/lib/intel64/libmkl_intel_ilp64.a /opt/intel/compilers_and_libraries_2019.4.243/linux/mkl/lib/intel64/libmkl_sequential.a /opt/intel/compilers_and_libraries_2019.4.243/linux/mkl/lib/intel64/libmkl_core.a -Wl,--end-group -lpthread -lm -ldl
这适用于 Ubuntu,但我担心 OS X,尤其是 Windows。例如,here 有人声称英特尔 MKL 与 minGW
不兼容。
我知道有许多使用 MKL 或 CMake 的 CRAN 包。但对于我调查过的那些,MKL 用作可选的 BLAS 库,CMake 用于构建 inst
文件夹下的内容,这不依赖于外部库。我查看了 writing R extensions and also the CRAN submission page 但找不到答案。我认为既然有越来越多的人对将 CMake 和 MKL 与 R 一起使用感兴趣,那么有一个 SO post 会很好。
看来你把事情搞错了。
您创建了一个范围更窄、更专业的解决方案(MKL、CMake)。
现在你担心它可能太专业了。你走在正确的道路上。首先,CMake 是 被其他包使用,因此您可以将其声明为 SystemRequirements:
。其次,MKL 更难但......也真正专业。
我认为 更广泛的 CRAN 上传 的一般建议是
- 放宽您的代码要求:如果存在则使用 MKL,但在不存在时提供回退;现在您不再需要 MKL
- CMake 同上:保留它并依赖它,最好还是尽量不要要求它,因为大多数 15000 个其他 CRAN 包也不需要它。
点击这两项后,您就可以进行 CRAN 上传了。如果这一切看起来很繁琐,请坚持使用 GitHub 存储库或 drat 存储库。