Как скопировать файл в Meson в подкаталог

Мое приложение использует файл Glade, а также кэширует данные в файле JSON. Когда я делаю следующее, все работает нормально, пока пользователь устанавливает приложение с ninja install

    #Install cached JSON file
    install_data(
        join_paths('data', 'dataCache.json'),
        install_dir: join_paths('myapp', 'resources')
    )
    #Install the user interface glade file
    install_data(
        join_paths('src', 'MainWindow.glade'),
        install_dir: join_paths('myapp', 'resources')
    )

Обратной стороной является то, что пользователю необходимо установить приложение. Я хочу, чтобы пользователь мог просто собрать приложение с ninja и запустить его без установки, если он не хочет устанавливать его в своей системе. Проблема в том, что когда я это делаю

    #Copy the cached JSON file to the build output directory
    configure_file(input : join_paths('data', 'dataCache.json'),
        output : join_paths('myapp', 'resources', 'dataCache.json'),
        copy: true
    )

    #Copy the Glade file to the build output directory
    configure_file(input : join_paths('src', 'MainWindow.glade'),
        output : join_paths('myapp', 'resources', 'MainWindow.glade'),
        copy: true
    )

Я получаю ОШИБКА: имя выходного файла не должно содержать подкаталог.

Есть ли способ запустить ninja и создать каталоги myapp/resources в папке сборки, а затем скопировать туда файлы Glade и JSON для использования в качестве ресурсов? Например, чтобы позволить пользователю запускать приложение, не делая ninja install?


person g_l    schedule 08.04.2020    source источник


Ответы (1)


Вы можете сделать это, создав скрипт и вызвав его из Meson.

Например, в файле copy.py, который принимает в качестве аргументов относительные пути ввода и вывода:

#!/usr/bin/env python3 

import os, sys, shutil

# get absolute input and output paths
input_path = os.path.join(
    os.getenv('MESON_SOURCE_ROOT'), 
    os.getenv('MESON_SUBDIR'),
    sys.argv[1])

output_path = os.path.join(
    os.getenv('MESON_BUILD_ROOT'), 
    os.getenv('MESON_SUBDIR'),
    sys.argv[2])

# make sure destination directory exists
os.makedirs(os.path.dirname(output_path), exist_ok=True)

# and finally copy the file
shutil.copyfile(input_path, output_path)

а затем в вашем meson.build файле:

copy = find_program('copy.py')

run_command(
    copy,
    join_paths('src', 'dataCache.json'), 
    join_paths('myapp', 'resources', 'dataCache.json')
)
run_command(
    copy, 
    join_paths('src', 'MainWindow.glade'), 
    join_paths('myapp', 'resources', 'MainWindow.glade')
)
person vvanpelt    schedule 09.04.2020