首页 > 解决方案 > 如何制作适用于两个系统的 .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.

标签: rmakefile

解决方案


由于似乎没有人关心,我敢于提出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.

推荐阅读