Как скопировать файл в Meson в подкаталог - PullRequest
3 голосов
/ 08 апреля 2020

Мое приложение использует файл 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?

1 Ответ

2 голосов
/ 09 апреля 2020

Вы можете сделать это, сделав скрипт и позвонив из 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')
)
...