动态设置 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 文件。
在 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 文件。