2016-09-14 20 views
0

在Windows機器上使用RCPP和RStudio/RTools,我創建了批處理地理編碼NYC地址的軟件包。該軟件包使用免費的NYC DCP Geosupport地理編碼軟件的DLL和C頭文件。我很樂意分享我的軟件包,但遇到Makevars/Makevars.win文件中的路徑時遇到了障礙。因爲我是我自己的機器上運行此,我已經定位出地理編碼軟件安裝在我的機器上,並使用這些信息爲我Makevars/Makevars.win文件的奢侈品:如果我分享這個包動態設置PKG_LIBS和PKG_CPPFLAGS

##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文件中使用環境變量的幾個軟件包。我的問題是我的環境變量需要改變(用PKG_LIBS的「Bin」替換「fls」,PKG_CPPFLAGS替換爲「src」)。我的shell腳本很弱,所以我認爲我可以在R中應用正則表達式和設置環境。儘管我的機器是Windows,但我希望我的軟件包可用於其他操作系統。

謝謝。 Gretchen

+0

CRAN上的9000多個軟件包中有770+使用Rcpp ---而_many_也有同樣的問題。你可能比看現有的資源更糟糕。 _一般在Windows上,默認情況下CRAN(或用戶)將在由環境變量指定的位置具有文件。其餘的代碼可以查看。 –

+0

你好,德克。我同意,在makevars文件中使用環境變量非常簡單。我的問題是,安裝地理編碼軟件時創建的環境變量需要在其有用之前進行清理。我一直在R中使用gsub手動創建一個新的環境變量,在makevars文件中使用這個新的環境變量並編譯。我確信必須有一個更優雅的方式來做到這一點,並會感謝任何建議。謝謝。 – gmculp

回答

0

德克書中的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#@[email protected]#${GBAT_PATH}#g" -e "s#@[email protected]#${GBAT_DLL}#g" \ 
src/Makevars.win.in > src/Makevars.win 

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

GBAT_PATH = @[email protected] 
GBAT_DLL = @[email protected] 

##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" 

當包被編譯,一個Makevars.win文件是在src目錄下創建的。