动态设置 PKG_LIBS 和 PKG_CPPFLAGS

Dynamically setting PKG_LIBS and PKG_CPPFLAGS

在 Windows 机器上使用 RCPP 和 RStudio/RTools,我创建了一个包来批量对 NYC 地址进行地理编码。该软件包使用免费的 NYC DCP Geosupport 地理编码软件中的 DLL 和 C 头文件。我很想分享我的包,但是当涉及到 Makevars/Makevars.win 文件中的路径时,运行 成为障碍。由于我是在自己的机器上 运行 进行此操作,因此我有幸找到地理编码软件在我的机器上的安装位置,并将此信息用于我的 Makevars/Makevars.win 文件:

##path 1 = location of NYCgeo.dll file after GBAT install
PKG_LIBS = -L"C:/Program Files/Geosupport Desktop Edition/Bin" -lNYCgeo 
##path 1 = location of NYCgeo.h and pac.h files after GBAT install
PKG_CPPFLAGS =  -I"C:/Program Files/Geosupport Desktop Edition/Include"

如果我共享这个包,我需要这个过程是动态的,因为用户可能将地理编码软件安装在与我不同的位置。在地理编码软件安装过程中设置了一个名为 GEOFILES 的环境变量:

Sys.getenv("GEOFILES")
[1] "C:\Program Files\Geosupport Desktop Edition\fls\"

我想知道是否有一种方法可以使用这个变量来设置 PKG_LIBS 和 PKG_CPPFLAGS...也许是这样的:

Sys.setenv("PKG_LIBS"=paste0("-L'",gsub("\\", "/", gsub("fls.*$","Bin",Sys.getenv("GEOFILES"))),"' -lNYCgeo"))

Sys.setenv("PKG_CPPFLAGS"=paste0("-I'",gsub("\\", "/", gsub("fls.*$","Include",Sys.getenv("GEOFILES"))),"'"))

如果可能的话,我会将前面几行 R 代码放在哪里?他们会进入 Rcpp.Exports.R 文件吗?我假设通过动态设置 PKG_LIBS 和 PKG_CPPFLAGS,将不再需要 Makevars/Makevars.win 文件。

编辑:嗨,德克。我注意到几个包在 makevars/makevars.win 文件中使用了环境变量。我的问题是我的环境变量需要更改(用 "Bin" 代替 "fls\" 代替 PKG_LIBS,用 "src" 代替 PKG_CPPFLAGS)。我的 shell 脚本很弱,所以我想我可以在 R 中应用正则表达式和设置环境。虽然我的机器是 Windows,但我希望我的包可用于其他操作系统。

谢谢。 格雷琴

德克书中的第 166-167 页给出了答案。我需要创建一个 configure.win 文件:

#check if Geosupport  software is installed
if test -z "${GEOFILES}"; then
  echo "Please install Geosupport Software"
  exit 1
fi

GC_ROOT="$(echo ${GEOFILES} | sed 's/\/\//g')"
GBAT_PATH="$(echo ${GC_ROOT} | sed 's/\/fls\///g')"


#check if installation is valid (i.e., dll is where it is supposed to be)
if [ -e "${GBAT_PATH}/Bin/NYCgeo.dll" ]; then
  GBAT_DLL="NYCgeo"
else
  echo "Please reinstall Geosupport Software"
  exit 1
fi

# replace all in Makevars.win
sed -e "s#@GBAT_PATH@#${GBAT_PATH}#g" -e "s#@GBAT_DLL@#${GBAT_DLL}#g"  \
src/Makevars.win.in > src/Makevars.win

...和 ​​src 目录中的 Makevars.win.in 文件:

GBAT_PATH = @GBAT_PATH@
GBAT_DLL = @GBAT_DLL@

##path 1 = location of NYCgeo.dll file after GBAT install
PKG_LIBS = -L"$(GBAT_PATH)/Bin" -l$(GBAT_DLL)

##path 1 = location of NYCgeo.h and pac.h files after GBAT install
PKG_CPPFLAGS =  -I"$(GBAT_PATH)/Include"

编译包时,会在 src 目录中创建一个 Makevars.win 文件。