у меня нет ~/.R/Makevars
файл и
> tools::makevars_user()
character(0)
> tools::makevars_site()
character(0)
Еще, R
должен читать конфигурацию откуда-то как .cpp
файлы, содержащие Rcpp
экспорт в упаковке src
Подкаталог компилируется нормально.
Мне интересно знать, как написать Makefile.win
в src
каталог, так что Rcpp
файлы продолжают компилироваться вместе с TMB
.cpp
файлы. В настоящее время make-файл похож на:
all: fn1.dll fn2.dll
fn1.dll: fn1.cpp
Rscript --vanilla -e "TMB::compile('fn1.cpp')"
fn2.dll: fn2.cpp
Rscript --vanilla -e "TMB::compile('fn2.cpp')"
clean:
rm -rf *o
прекрасно работает для компиляции TMB
файлы, и фактически предлагается: https://github.com/kaskr/adcomp/issues/43
Я пытался изменить makefile
предложенный Дирком Вот но не удалось повторить R
поведение по умолчанию даже с новым новым тестовым пакетом.
Информация о моей сессии:
> sessionInfo()
R version 3.3.2 (2016-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1
Я до сих пор не знаю, как использовать Makevars
делать то, что я хочу, что по существу:
make
в Rstudio (Windows 7) через Build and Reload
пакет для всех Rcpp
экспортировать файлы. Под капотом это называет Rcpp::compileAttributes()
затем приступает к выполнению других команд построения пакетов.make
используя Rstudio Build and Reload
кроме как теперь читает Makefile
это только компилирует TMB
код.Тем не менее, у меня есть обходной путь. По сути, Руководство по расширениям R говорится, что:
Нечто похожее на поведение по умолчанию может быть воспроизведено в следующем файле `src / install.libs.R ‘:
…
Поскольку код для компиляции TMB
.cpp
файлы просто R
Команды, достаточно легко интегрировать их в такой файл:
# replicate default R
files <- Sys.glob(paste("*", SHLIB_EXT, sep=''))
libarch <- if (nzchar(R_ARCH)) paste('libs', R_ARCH, sep='') else 'libs'
dest <- file.path(R_PACKAGE_DIR, libarch)
dir.create(dest, recursive = TRUE, showWarnings = FALSE)
file.copy(files, dest, overwrite = TRUE)
# now do TMB files
cpp_files <- list.files('./TMB/', full.names = T, pattern = '*.cpp')
for (f in cpp_files) {
TMB::compile(f)
}
files <- Sys.glob(paste("./TMB/*", SHLIB_EXT, sep=''))
libarch <- if (nzchar(R_ARCH)) paste('libs', R_ARCH, sep='') else 'libs'
dest <- file.path(R_PACKAGE_DIR, libarch)
dir.create(dest, recursive = TRUE, showWarnings = FALSE)
file.copy(files, dest, overwrite = TRUE)
Этот файл читает и компилирует все TMP
тип .cpp
файлы, хранящиеся в подкаталоге <pkgdir>/src/TMB
, а затем копирует все последующие .dll
в <pkgdir>/src/
а также <pkgdir>/src/TMB
в каталог установки пакета.
Заметка, это возможно, но возможно очень сложно использовать Makevars
чтобы выполнить компиляцию, когда файлы TMB хранятся в подкаталоге. Дирк рекомендовал пример в матричный пакет, но мне не повезло изменить код там, чтобы сделать то, что я хочу.
Других решений пока нет …