Есть ли хороший способ включить данные внешних ресурсов в исходный код Rust?

Представьте следующий пример:

let SHADER: &'static str = "
#version 140

attribute vec2 v_coord;
uniform sampler2D fbo_texture;
varying vec2 f_texcoord;

void main(void) {
    gl_Position = vec4(v_coord, 0.0, 1.0);
    f_texcoord = (v_coord + 1.0) / 2.0;
}";

fn main() {
    // compile and use SHADER
}

Конечно, вы можете написать встроенный шейдер, как показано выше, но это становится очень сложным при разработке шейдеров с использованием внешнего программного обеспечения или при наличии нескольких шейдеров. Вы также можете загружать данные из внешних файлов, но иногда вы хотите предоставить только один небольшой исполняемый файл без необходимости определять, где хранятся ресурсы.

Было бы здорово, если бы решение также работало для двоичных файлов (например, значков, шрифтов).

Я знаю, что можно писать плагины rustc, и насколько я понимаю, должна быть возможность предоставить такую ​​функцию, но писать мой собственный плагин довольно сложно, и я хотел бы знать, есть ли уже хороший плагин/lib/стандартный способ включения файлов ресурсов. Другим моментом является то, что он должен работать без использования ручного компоновщика + указателя.

Ответ 1

Я считаю, что вы ищете макрос include_str!():

static SHADER: &'static str = include_str!("shader.glsl");

Файл shader.glsl должен быть расположен рядом с исходным файлом, чтобы это работало.

Также есть include_bytes!() Для данных не-UTF-8:

static SHADER: &'static [u8] = include_bytes!("main.rs");

Не путайте это с include! , который импортирует файл как код Rust.