[R-pkg-devel] C++ library USING_R
On 15 October 2020 at 10:36, Joseph Park wrote:
| Apologies for the mis-directed reply, and, imprecise syntax/context re
| environment variable.
|
| Just to close the loop, it seems that using a -D macro assignment inside
| the make command (macro?) is interpreted as a make option:
(I think 'make target' is a common expression.)
| $(LIBEDM):
| ??? @(cd $(CPPEDM_SRC_PATH) && $(MAKE) clean && $(MAKE) \
| ??? CXX="$(CXX11) $(CXX11STD)" CXXFLAGS="$(CXX11FLAGS) $(CXX11PICFLAGS)" \
| ??? AR="$(AR)" RANLIB="$(RANLIB)" -DUSING_R=1)
|
| ...
|
| ?? make[1]: Entering directory
| '/tmp/RtmpxVmJkT/Rbuild1553f22c7484d/rEDM/src/cppEDM/src'
| ?? rm -f API.o CCM.o Common.o DateTime.o EDM.o EDM_Formatting.o
| EDM_Neighbors.o Eval.o Multiview.o Parameter.o Simplex.o SMap.o libEDM.a
| ?? make[1]: Leaving directory
| '/tmp/RtmpxVmJkT/Rbuild1553f22c7484d/rEDM/src/cppEDM/src'
| ?? make: invalid option -- 'D'
|
| Hmm... since I use an R-specific makefile inside the C++ library
| directory anyway, adding -DUSING_R there seems like a decent solution.
Yes, exactly, that was my initial suggestion. It's been a while since I
needed this but when do I tend to just go back to simple examples to check I
am on the right track:
edd at rob:/tmp$ g++ -o io io.cpp; ./io # default: empty
Hello boring world
edd at rob:/tmp$ g++ -DFOO -o io io.cpp; ./io # with a defined
We see foo
edd at rob:/tmp$ cat io.cpp
#include <iostream>
int main() {
#if defined(FOO)
std::cout << "We see foo\n";
#else
std::cout << "Hello boring world\n";
#endif
}
edd at rob:/tmp$
So setting -Dsomething is really equivalent to doing in the code via #define
but allows you to have it done conditional on when/where/how you compile.
| Thanks a-million for the support & guidance to get me to the obvious
| solution!
No worries. Is your repo public? Good _portable_ cross-language solutions
are rare, it would be good to have another one to look at / refer people to.
Dirk
https://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org