Подтвердить что ты не робот

R Makevars файл для перезаписывания R CMD по умолчанию g++ options?

У меня есть этот автономный код на С++ что я пытаюсь обернуть R пакет.

Моя проблема в том, что я абсолютно хотите, чтобы он был скомпилирован с помощью   -O3 флаг включен.

Итак, в файле src/Makevars Я положил:

PKG_CPPFLAGS = -I../inst/include
PKG_CXXFLAGS = -O3  
CXX_STD = CXX11

и все еще, когда я устанавливаю свой пакет на моем машина, я вижу:

g++ -std=c++0x -I/usr/share/R/include -DNDEBUG -I../inst/include -O3  -fpic  -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security -D_FORTIFY_SOURCE=2 -g -c mycppfunctions.cpp -o mycppfunctions.o
g++ -std=c++0x -shared -Wl,-Bsymbolic-functions -Wl,-z,relro -o mycppfunctions.so mycppfunctions.o -L/usr/lib/R/lib -lR

(страшный флаг -O2 отображается справа)

поэтому мой вопрос: как я могу перезаписать флагов cpp, когда g++ вызывается R CMD?

Изменить:

Недавно, в другом пакете, я нашел способ сделать что-то похожее на код F77 (также в пакете R). В основном, добавив это к Makevars:

PKG_FFLAGS = $(FPICFLAGS) $(SHLIB_FFLAGS) 
all: $(SHLIB)
otherf77foo.o: otherf77foo.f
    $(F77) $(PGK_FFLAGS) -O3 -pipe -g -c -o otherf77foo.o otherf77foo.f

но я не знаю, как сделать то же самое для кода cpp...

Edit2:

Итак, делать это вполне возможно. Dirk Eddelbuettel вопрос 'b)' из его ответа ниже направил меня к решению. Итак, все, что мне нужно было сделать, это поместите это в файл src/Makevars:

mycppfoo.o: mycppfoo.cpp
    g++ -std=c++0x -I/usr/share/R/include -DNDEBUG -I../inst/include -fpic  -g -O3 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security -D_FORTIFY_SOURCE=2 -g -c mycppfoo.cpp -o mycppfoo.o
    g++ -std=c++0x -shared -Wl,-Bsymbolic-functions -Wl,-z,relro -o mycppfoo.so mycppfoo.o -L/usr/lib/R/lib -lR

и моя проблема была решена!

4b9b3361

Ответ 1

Вы не можете (согласно комментарию Симона Урбанека на r-devel некоторое время назад).

Но это не имеет значения, поскольку AFAIK выигрывает наивысшая ценность. И R ставит свои значения влево и позволяет добавлять ваши значения (например, через CXX_FLAGS от, скажем, ~/.R/Makevars или PKG_CXXFLAGS от src/Makevars в вашем пакете) вправо.

Так что просто переопределите с помощью -O3, и оно должно быть -O3.

Для чего мои текущие значения в ~/.R/Makevars следующие:

CFLAGS +=              -O3 -Wall -pipe -pedantic -std=gnu99
CXXFLAGS +=            -O3 -Wall -pipe -Wno-unused -pedantic

и вы могли бы, конечно, ввести -mnative или ваш конкретный идентификатор процессора.

Наконец, если вы действительно хотите, вы могли бы отредактировать /etc/R/Makeconf, но вам нужно будет это сделать после каждого обновления пакета R. И, как я утверждаю здесь, вам не нужно, поскольку предлагаемая здесь схема должна работать.

Изменить: в ответ на ваше редактирование:

a) Четкая рекомендация по r-devel (пожалуйста, проверьте архивы) заключается в том, что вам следует избегать логики Makefile, если сможете. IIRC это повторяется в руководстве по расширению Writing R.

b) Вы объявили правило для создания файла .o (object) из файла .f (source). Вы пытались сделать то же самое с cpp вместо f?

Наконец, вы точно не объяснили, почему мир подходит к концу, если ваш файл построен с -O2, а не -O3. Вы должны понимать, что как автор источника, вы не можете полностью контролировать, с какими параметрами компилятора (не говоря уже о версиях компилятора) люди будут создавать ваш пакет.

Ответ 2

newedit: Хорошо, я дурак. Он решил проблему для Rcpp (что меня не волнует), но это не работает для пакета github.com/ohdsi/cyclops.git, о котором я забочусь. Тот, кто все еще получает -O2, застревает в крайнем случае. Это нелепо. Управление параметрами командной строки может быть самым важным элементом всей этой операции. R нуждается в лучшей сборке.

edit: Конечно, после нескольких дней неприятностей, я понимаю это сразу после публикации. Моя проблема заключалась в том, что я использовал флаг CXX_STD = CXX11. По-видимому, с этим флагом вам нужно использовать CXX11FLAGS += .... Поэтому, если ваш файл Makevars содержит CXX11FLAGS += -O0 -Wall, он правильно поместит это справа от флага -O2, если вы используете С++ 11.

Независимо от того, что я делаю, я не могу получить -O0, чтобы появиться справа. В моем ~/.R/Makevars у меня есть следующее:

CFLAGS +=       -O0 -Wall
CXXFLAGS +=     -O0 -Wall
CPPFLAGS +=     -O0 -Wall

PKG_CFLAGS +=       -O0 -Wall
PKG_CXXFLAGS +=     -O0 -Wall
PKG_CPPFLAGS +=     -O0 -Wall

Я установил Rcpp из источника (в качестве теста... меня это не интересует напрямую) с помощью

install.packages(getwd(), repos = NULL, type = "source")

и это правильно использовало -O0.

С моей текущей конфигурацией я получаю три разных -O0 слева и последний -O2 справа. Кто-нибудь еще сталкивается с этой проблемой?

Установленное мной программное обеспечение находится в github.com/ohdsi/cyclops.git, хотя я не уверен, что это было бы важно.