r - 如何制作适用于两个系统的 .R/Makevars 文件?
问题描述
我在两个不同的操作系统上使用相同的用户目录。我可以根据操作系统指定一组有条件的 Makevars 规则吗?我的一个操作系统较旧,无法支持另一个操作系统的所有功能。如果是这样,你能举个例子吗?
我想它会是这样的:
os = $(uname -a | awk '{print $2}')
ifeq(os, "redhat7")
CC=/opt/rh/devtoolset-7/root/usr/bin/gcc
CXX=/opt/rh/devtoolset-7/root/usr/bin/g++
...
endif
但我不确定如何制作变量 os.
解决方案
由于似乎没有人关心,我敢于提出gmtt,一个 GNUmake 辅助库。它的设计考虑了这些用例。您可以使用选项标志定义表,并select
通过列(或它们的组合)非常类似于 SQL 选择的适度形式:
include gmtt-master/gmtt-master/gmtt.mk
# Table with two (indicator "2" as first element) columns. First column is a glob which matches the OS, second is option string
# Warning! No spaces in either column are allowed - use $(call spc-mask,...options...) if there are.
define CC_OPTIONS_TBL
2
redhat[!7]* /opt/rh/devtoolset-6/root/usr/bin/gcc
redhat7 /opt/rh/devtoolset-7/root/usr/bin/gcc
suse* /opt/bin/rh/devtoolset-7/root/usr/bin/gcc
endef
CC_OPT := $(call select,2,$(CC_OPTIONS_TBL),$$(call glob-match,$(MY_OS),$$1))
$(info CC_OPT = $(CC_OPT))
define CXX_OPTIONS_TBL
2
redhat[!7]* $(call spc-mask, /opt/rh/devtoolset-6/root/usr/bin/gcc -DREDHAT -O2)
redhat7 $(call spc-mask, /opt/rh/devtoolset-7/root/usr/bin/gcc -DREDHAT_7 -O3)
suse* $(call spc-mask, /opt/bin/rh/devtoolset-7/root/usr/bin/gcc -DSUSE -O0)
suse8 $(call spc-mask, -DFOO -DBAR)
endef
CXX_OPT := $(call spc-unmask,$(call select,2,$(CXX_OPTIONS_TBL),$$(call glob-match,$(MY_OS),$$1)))
$(info CXX_OPT = $(CXX_OPT))
输出:
mark@zws103 ~
$ make MY_OS=suse
CC_OPT = /opt/bin/rh/devtoolset-7/root/usr/bin/gcc
CXX_OPT = /opt/bin/rh/devtoolset-7/root/usr/bin/gcc -DSUSE -O0
make: *** Keine Ziele. Schluss.
mark@zws103 ~
$ make MY_OS=redhat6.1
CC_OPT = /opt/rh/devtoolset-6/root/usr/bin/gcc
CXX_OPT = /opt/rh/devtoolset-6/root/usr/bin/gcc -DREDHAT -O2
make: *** Keine Ziele. Schluss.
mark@zws103 ~
$ make MY_OS=redhat7
CC_OPT = /opt/rh/devtoolset-7/root/usr/bin/gcc
CXX_OPT = /opt/rh/devtoolset-7/root/usr/bin/gcc -DREDHAT_7 -O3
make: *** Keine Ziele. Schluss.
mark@zws103 ~
$ make MY_OS=redhat7.1
CC_OPT =
CXX_OPT =
make: *** Keine Ziele. Schluss.
请注意,最后一个 OS 字符串“redhat7.1”与表中的任何 glob 都不匹配。
另请注意,select
返回所有匹配的行:
$ make MY_OS=suse8
CC_OPT = /opt/bin/rh/devtoolset-7/root/usr/bin/gcc
CXX_OPT = /opt/bin/rh/devtoolset-7/root/usr/bin/gcc -DSUSE -O0 -DFOO -DBAR
make: *** Keine Ziele. Schluss.
推荐阅读
- node.js - 在 nodeJS 中解析 X509 证书包
- python - MYSQL // 在减少不同条目的数量时,“DISTINCT”的性能下降了大约 100000 个条目
- python-3.x - 使用 Tkinter 创建登录系统
- r - R:上下移动调用堆栈(帧)
- powershell - POWERSHELL - 仅在指定参数时定义默认参数集名称
- r - 管道内 n_distinct 的意外行为
- java - Java:从字符串数组中删除一个空元素
- erlang - 如何注册 Ejabberd pubsub 节点的自定义实现?
- android - 如何在android中创建类数组
- swift - Audiokit 4.9.3 中可靠的 midi 排序的哪条途径?