< 返回版块

minstrel1977 发表于 2020-12-12 20:33

Tags:条件编译 cfg cfg_if

在学习getrandom的源码时,碰到一个条件编译的疑惑,这里先把源码缩减如下(具体源码见链接):

cfg_if! {
    if #[cfg(any(target_os = "android", target_os = "linux"))] {
        #[path = "linux_android.rs"] mod imp;
    } else if #[cfg(windows)] {
        #[path = "windows.rs"] mod imp;
    } else if #[cfg(feature = "rdrand")] {
        #[path = "rdrand.rs"] mod imp;
    } else {
        compile_error!("XXXXXX");
    }
}

请问一下,针对这段条件编译代码,能实现把rdrand.rs文件里的代码编译进目标平台是linux的crate里吗? 如果能,该如何传递编译参数? 还是即便启用了 rdrand feature,是不是也无法走到 else if #[cfg(feature = "rdrand")] 这个分支里?


Ext Link: https://github.com/rust-random/getrandom/blob/master/src/lib.rs

评论区

写评论
作者 minstrel1977 2020-12-13 21:45

自己摸索了一下。 我在Cargo.toml里先启用 rdrand feature:

[features]
default = ["rdrand"]

在在源码里注释掉:

    // } else if #[cfg(any(target_os = "android", target_os = "linux"))] {
    //     #[path = "linux_android.rs"] mod imp;

这样就把rdrand.rs文件里的代码编译进了crate里了。 所以要针对linux平台启用 rdrand 这一 target_feature,可能还是必须得(如上)修改源码。

1 共 1 条评论, 1 页