我的应用程序使用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
?
您可以制作一个脚本并从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')
)
https://mesonbuild.com/Fs-module.html#copyfile
copy = fs.copyfile('input-file', 'output-file')