Thanks Kevin, I tried both options and it seems to have worked. Not sure
which one actually got it work.

Claude, Maybe now you can test the new Makevar on your end. Let me know how
it goes.

---------- Forwarded message ---------
From: Kevin Ushey <kevinus...@gmail.com>
Date: Wed, May 21, 2025 at 8:26 PM
Subject: Re: [R-pkg-devel] How to use O4 flag in an RCpp project?
To: Peiyuan Zhu <garyzh...@gmail.com>


If that's the case, then I think you may need to set the requisite
flags in your own file at `~/.R/Makevars`. I had thought you would be
able to override CFLAGS and CXXFLAGS via a package's own src/Makevars,
but that seems to not be the case. Fortunately, you can override that
in your own user Makevars file.

Alternatively, you can try setting something like this in your
package's src/Makevars:

    CXX_DEFS = -O3

and those flags should be added after (rather than before) the default
compilation flags. I believe this would only work for recent versions
of R though.

Alternatively, you can manually force this by installing the package
with the MAKEFLAGS environment variable set appropriately; e.g.

> Sys.setenv(MAKEFLAGS = "CXXFLAGS+=-O3")
> remotes::install_github("RAPLER/dst-1")

Best,
Kevin

On Wed, May 21, 2025 at 8:03 PM Peiyuan Zhu <garyzh...@gmail.com> wrote:
>
> Hi Kevin,
>
> This is the package that I'm trying to build:
https://github.com/RAPLER/dst-1. The Makefile is in the src folder. I don't
think I have something like you said in Makevars and DESCRIPTION.
>
> I tried CFLAGS and CXXFLAGS but still the Makeconf flags are used. I have
no control over this Makeconf file as this is read only on Compute Canada.
Same for ~/.R/Makevars.
>
> Best regards,
> Gary
>
>
> On Wed, May 21, 2025 at 7:50 PM Kevin Ushey <kevinus...@gmail.com> wrote:
>>
>> > The manual seems unreadable at this point. Every sentence has at least
two words which I don't understand.
>>
>> There's definitely a lot to learn if you haven't spent much time in
>> this space before. The somewhat short description here is:
>>
>> - make is a (now somewhat older) program commonly used to build
>> software projects; e.g. compile C / C++ sources to object files
>> - It commonly accepts flags like CFLAGS, CXXFLAGS, and so on to
>> control the flags used during compilation
>> - R builds / extends on this by using things like etc/Makeconf +
>> Makevars files to define / augment these compiler flags
>>
>> It will become more familiar with practice.
>>
>> All that said, I believe you should be able to override these flags by
>> setting CFLAGS or CXXFLAGS, either in
>>
>> - your own ~/.R/Makevars, or
>> - your package's src/Makevars
>>
>> The specific flag you need to set will depend on where the default
>> optimization flags are being set, though. For example, in my R
>> installation, I have:
>>
>> $ cat /Library/Frameworks/R.framework/Resources/etc/Makeconf | grep -- -O
>> # configure  'FW_VERSION=4.5-arm64' 'CC=clang -arch arm64'
>> 'CXX=clang++ -arch arm64' 'OBJC=clang -arch arm64'
>> 'FC=/opt/gfortran/bin/gfortran -arch arm64'
>> 'CFLAGS=-falign-functions=64 -Wall -g -O2'
>> 'CXXFLAGS=-falign-functions=64 -Wall -g -O2'
>> 'OBJCFLAGS=-falign-functions=64 -Wall -g -O2' 'FCFLAGS=-Wall -g -O2'
>> 'F77FLAGS=-Wall -g -O2' 'LDFLAGS=-L/opt/R/arm64/lib'
>> 'CPPFLAGS=-I/opt/R/arm64/include' '--enable-memory-profiling'
>> '--enable-R-framework'
>> '--with-tcl-config=/opt/R/arm64/lib/tclConfig.sh'
>> '--with-tk-config=/opt/R/arm64/lib/tkConfig.sh'
>> '--build=aarch64-apple-darwin20' 'build_alias=aarch64-apple-darwin20'
>>
'PKG_CONFIG_PATH=/usr/lib/pkgconfig:/opt/R/arm64/lib/pkgconfig:/opt/R/arm64/share/pkgconfig:/opt/X11/lib/pkgconfig:/opt/X11/share/pkgconfig'
>> CFLAGS = -falign-functions=64 -Wall -g -O2 $(LTO)
>> C17FLAGS = -falign-functions=64 -Wall -g -O2 $(LTO)
>> C90FLAGS = -falign-functions=64 -Wall -g -O2 $(LTO)
>> C99FLAGS = -falign-functions=64 -Wall -g -O2 $(LTO)
>> CXXFLAGS = -falign-functions=64 -Wall -g -O2 $(LTO)
>> CXX11FLAGS = -falign-functions=64 -Wall -g -O2 $(LTO)
>> CXX14FLAGS = -falign-functions=64 -Wall -g -O2 $(LTO)
>> CXX17FLAGS = -falign-functions=64 -Wall -g -O2 $(LTO)
>> CXX20FLAGS = -falign-functions=64 -Wall -g -O2 $(LTO)
>> CXX23FLAGS = -falign-functions=64 -Wall -g -O2 $(LTO)
>> FCFLAGS = -Wall -g -O2 $(LTO_FC)
>> FFLAGS = -Wall -g -O2 $(LTO_FC)
>> OBJCFLAGS = -falign-functions=64 -Wall -g -O2 -fobjc-exceptions $(LTO)
>> SAFE_FFLAGS = -Wall -g -O2
>>
>> Unfortunately, there are a lot of different default flags set
>> depending on the C (or C++) standard being used, and that could also
>> affect the flags depending on the C / C++ standard required by the
>> project you're compiling.
>>
>> In short, you should try doing something like:
>>
>>     CFLAGS = -g -O3
>>     CXXFLAGS = -g -O3
>>
>> in either your own ~/.R/Makevars, or your package's src/Makevars.
>>
>> If that doesn't work, you may need to override one of the variants
>> like CXX17FLAGS -- this would depend on if that package has something
>> like CXX_STD = <...> in its src/Makevars file, or SystemRequirements:
>> C++17 (or similar) in its DESCRIPTION file. (All of this is much
>> easier to be concrete about if you can share the package you're trying
>> to build.)
>>
>> Best,
>> Kevin
>>
>> On Wed, May 21, 2025 at 7:00 PM Peiyuan Zhu <garyzh...@gmail.com> wrote:
>> >
>> > Unfortunately this still doesn't work.
>> >
>> > > devtools::install("/home/zhupy/projects/def-kwalley/zhupy/dst-1")
>> >
>> > ── R CMD build
─────────────────────────────────────────────────────────────────
>> >
>> > ✔  checking for file ‘/project/6046455/zhupy/dst-1/DESCRIPTION’ (847ms)
>> >
>> > ─  preparing ‘dst’: (17.8s)
>> >
>> > ✔  checking DESCRIPTION meta-information ...
>> >
>> > ─  cleaning src
>> >
>> > ─  checking for LF line-endings in source and make files and shell
scripts (638ms)
>> >
>> > ─  checking for empty or unneeded directories
>> >
>> >    Removed empty directory ‘dst/.idea’
>> >
>> > ─  building ‘dst_1.9.0.tar.gz’
>> >
>> >    Warning: invalid uid value replaced by that for user 'nobody'
>> >
>> >    Warning: invalid gid value replaced by that for user 'nobody'
>> >
>> >
>> >
>> > Running \
>> >
>> >   /cvmfs/
soft.computecanada.ca/easybuild/software/2023/x86-64-v3/Compiler/gcccore/r/4.4.0/lib64/R/bin/R
\
>> >
>> >   CMD INSTALL /tmp/RtmpwaSy51/dst_1.9.0.tar.gz --install-tests
>> >
>> > * installing to library ‘/home/zhupy/R/x86_64-pc-linux-gnu-library/4.4’
>> >
>> > * installing *source* package ‘dst’ ...
>> >
>> > ** using staged installation
>> >
>> > ** libs
>> >
>> > using C++ compiler: ‘g++ (Gentoo 12.3.1_p20230526 p2) 12.3.1 20230526’
>> >
>> > g++ -std=gnu++17 -I"/cvmfs/
soft.computecanada.ca/easybuild/software/2023/x86-64-v3/Compiler/gcccore/r/4.4.0/lib64/R/include"
-DNDEBUG  -I'/home/zhupy/R/x86_64-pc-linux-gnu-library/4.4/Rcpp/include'
-I'/home/zhupy/R/x86_64-pc-linux-gnu-library/4.4/BH/include'
-I'/home/zhupy/R/x86_64-pc-linux-gnu-library/4.4/RcppProgress/include'
-I'/home/zhupy/R/x86_64-pc-linux-gnu-library/4.4/RcppArmadillo/include'
-I/cvmfs/
soft.computecanada.ca/easybuild/software/2023/x86-64-v3/Core/java/17.0.6/include
-I/cvmfs/
soft.computecanada.ca/easybuild/software/2023/x86-64-v3/Core/flexiblascore/3.3.1/include
-I/cvmfs/
soft.computecanada.ca/easybuild/software/2023/x86-64-v3/Core/flexiblascore/3.3.1/include/flexiblas
 -O3 -fpic  -O2 -ftree-vectorize -march=x86-64-v3 -fno-math-errno   -c
RcppExports.cpp -o RcppExports.o
>> >
>> > g++ -std=gnu++17 -I"/cvmfs/
soft.computecanada.ca/easybuild/software/2023/x86-64-v3/Compiler/gcccore/r/4.4.0/lib64/R/include"
-DNDEBUG  -I'/home/zhupy/R/x86_64-pc-linux-gnu-library/4.4/Rcpp/include'
-I'/home/zhupy/R/x86_64-pc-linux-gnu-library/4.4/BH/include'
-I'/home/zhupy/R/x86_64-pc-linux-gnu-library/4.4/RcppProgress/include'
-I'/home/zhupy/R/x86_64-pc-linux-gnu-library/4.4/RcppArmadillo/include'
-I/cvmfs/
soft.computecanada.ca/easybuild/software/2023/x86-64-v3/Core/java/17.0.6/include
-I/cvmfs/
soft.computecanada.ca/easybuild/software/2023/x86-64-v3/Core/flexiblascore/3.3.1/include
-I/cvmfs/
soft.computecanada.ca/easybuild/software/2023/x86-64-v3/Core/flexiblascore/3.3.1/include/flexiblas
 -O3 -fpic  -O2 -ftree-vectorize -march=x86-64-v3 -fno-math-errno   -c
belplauHFast.cpp -o belplauHFast.o
>> >
>> >
>> >
>> > On Wed, May 21, 2025 at 6:50 PM Peiyuan Zhu <garyzh...@gmail.com>
wrote:
>> >>
>> >> I saw this line from the manual:
>> >>
>> >> Flags that are already set (for example in file etcR_ARCH/Makeconf)
can be overridden by the environment variable MAKEFLAGS (at least for
systems using a POSIX-compliant make), as in (Bourne shell syntax)
>> >>
>> >> MAKEFLAGS="CFLAGS=-O3" R CMD SHLIB *.c
>> >>
>> >> I can give it a try.
>> >>
>> >>
>> >>
>> >> On Wed, May 21, 2025 at 6:44 PM Peiyuan Zhu <garyzh...@gmail.com>
wrote:
>> >>>
>> >>> The manual seems unreadable at this point. Every sentence has at
least two words which I don't understand.
>> >>>
>> >>> That said, I was able to find the compiler flags. They're still in
Makeconf in the system. I don't know how I can control this in a package.
>> >>>
>> >>> dhcp-128-189-214-31:src garyzhubc$ R CMD SHLIB --dry-run closure.cpp
>> >>>
>> >>> make cmd is
>> >>>
>> >>>   make -f 'Makevars' -f
'/Library/Frameworks/R.framework/Resources/etc/Makeconf' -f
'/Library/Frameworks/R.framework/Resources/share/make/shlib.mk'
SHLIB_LDFLAGS='$(SHLIB_CXXLDFLAGS)' SHLIB_LD='$(SHLIB_CXXLD)'
SHLIB='closure.so' OBJECTS='closure.o'
>> >>>
>> >>>
>> >>> make would use
>> >>>
>> >>> if test  "zclosure.o" != "z"; then \
>> >>>
>> >>>   echo clang++ -arch x86_64 -std=gnu++17 -dynamiclib
-Wl,-headerpad_max_install_names -undefined dynamic_lookup
-L"/Library/Frameworks/R.framework/Resources/lib" -L/opt/R/x86_64/lib -o
closure.so closure.o    -F/Library/Frameworks/R.framework/.. -framework R
-Wl,-framework -Wl,CoreFoundation; \
>> >>>
>> >>>   clang++ -arch x86_64 -std=gnu++17 -dynamiclib
-Wl,-headerpad_max_install_names -undefined dynamic_lookup
-L"/Library/Frameworks/R.framework/Resources/lib" -L/opt/R/x86_64/lib -o
closure.so closure.o    -F/Library/Frameworks/R.framework/.. -framework R
-Wl,-framework -Wl,CoreFoundation; \
>> >>>
>> >>> fi
>> >>>
>> >>>
>> >>>
>> >>>
>> >>> On Wed, May 21, 2025 at 2:22 PM Kevin Ushey <kevinus...@gmail.com>
wrote:
>> >>>>
>> >>>> Peiyuan,
>> >>>>
>> >>>> Respectfully -- RTFM.
>> >>>>
>> >>>> https://cran.r-project.org/doc/manuals/R-exts.html#Using-Makevars
>> >>>>
https://cran.r-project.org/doc/manuals/R-admin.html#Customizing-package-compilation
>> >>>>
>> >>>> The compilation flags are coming either from your R installation's
>> >>>> etc/Makeconf, etc/Makevars.site, a user Makevars, or the package's
>> >>>> Makevars.
>> >>>>
>> >>>> You can also use R CMD SHLIB --dry-run to figure out what `make`
>> >>>> invocation R is using, so you can know where these compiler flags
are
>> >>>> coming from. For example:
>> >>>>
>> >>>> $ R CMD SHLIB --dry-run example.cpp
>> >>>> make cmd is
>> >>>>   make -f 'Makevars' -f
>> >>>> '/Library/Frameworks/R.framework/Resources/etc/Makeconf' -f
>> >>>> '/Library/Frameworks/R.framework/Resources/share/make/shlib.mk' -f
>> >>>> '/Users/kevin/.R/Makevars' SHLIB_LDFLAGS='$(SHLIB_CXXLDFLAGS)'
>> >>>> SHLIB_LD='$(SHLIB_CXXLD)' SHLIB='example.so' OBJECTS='example.o'
>> >>>>
>> >>>> Kevin
>> >>>>
>> >>>> On Wed, May 21, 2025 at 2:12 PM Dirk Eddelbuettel <e...@debian.org>
wrote:
>> >>>> >
>> >>>> >
>> >>>> > On 21 May 2025 at 13:55, Peiyuan Zhu wrote:
>> >>>> > | Thanks Kasper, but I don’t know how exactly to accomplish this.
As Dirk says
>> >>>> > | the system overwrites it every time.
>> >>>> >
>> >>>> > That is *not* what Dirk said.
>> >>>> >
>> >>>> > Dirk
>> >>>> >
>> >>>> > --
>> >>>> > dirk.eddelbuettel.com | @eddelbuettel | e...@debian.org
>> >>>> >
>> >>>> > ______________________________________________
>> >>>> > R-package-devel@r-project.org mailing list
>> >>>> > https://stat.ethz.ch/mailman/listinfo/r-package-devel

        [[alternative HTML version deleted]]

______________________________________________
R-package-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-package-devel

Reply via email to