meson-build: файл ресурсов wxWidgets для Windows не строится - PullRequest
0 голосов
/ 26 января 2020

Я разрабатываю приложение, используя wxWidgets для пользовательского интерфейса. Проект может быть нацелен на Windows и Linux, я использую meson / ninja для сборки.

Сборка в целом работает нормально для обеих платформ, если я не использую Resource (.r c) файл в Windows.

Когда я добавляю файл .r c, он не компилируется. Я использую MSYS2 / mingw_w64 на Windows в качестве набора инструментов.

В целях тестирования я создал небольшой пример для тестирования и воспроизведения.

В этом примере используются следующие файлы:

  • cpp -файл с некоторыми тестовыми кодами wxWidgets «Hello World».
  • .r c -файл , определяя тему и приложение для windows.
  • meson.build-file, конфигурацию для meson
  • Некоторые файлы значков

Я запускаю следующую команду из в интерфейсе командной строки MSYS2-MINGW64 в Windows:

meson build_win && cd build_win && ninja

Некоторые файлы / папки создаются, но процесс сборки завершается неудачно. Вывод из терминала:

The Meson build system
Version: 0.53.0
Source dir: //192.168.122.1/VMShare_1/Tests/meson-test
Build dir: //192.168.122.1/VMShare_1/Tests/meson-test/build_win
Build type: native build
Project name: TestWXApp
Project version: undefined
C compiler for the host machine: cc (gcc 9.2.0 "cc (Rev2, Built by MSYS2 project) 9.2.0")
C linker for the host machine: cc GNU ld.bfd 2.33.1
Host machine cpu family: x86_64
Host machine cpu: x86_64
C++ compiler for the host machine: c++ (gcc 9.2.0 "c++ (Rev2, Built by MSYS2 project) 9.2.0")
C++ linker for the host machine: c++ GNU ld.bfd 2.33.1
wx-config found: YES (sh C:\msys64\mingw64\bin/wx-config) 3.0.4
Run-time dependency WxWidgets found: YES 3.0.4
Windows resource compiler: GNU windres (GNU Binutils) 2.33.1
Build targets in project: 2

Found ninja.EXE-1.9.0 at C:\msys64\mingw64\bin/ninja.EXE
[1/3] Generating Windows resource for file '._resources_theme_win32.rc' with a custom command.
FAILED: ._resources_theme_win32.rc_theme_win32.o
"C:/msys64/mingw64/bin/windres.EXE" ".././resources/theme_win32.rc" "._resources_theme_win32.rc_theme_win32.o" "--preprocessor-arg=-MD" "--preprocessor-arg=-MQ._resources_theme_win32.rc_theme_win32.o" "--preprocessor-arg=-MF._resources_theme_win32.rc_theme_win32.o.d"
.././resources/theme_win32.rc:2:10: fatal error: wx/msw/wx.rc: No such file or directory
    2 | #include "wx/msw/wx.rc"
      |          ^~~~~~~~~~~~~~
compilation terminated.
C:/msys64/mingw64/bin/windres.EXE: preprocessing failed.
[2/3] Compiling C++ object TestWXApp@exe/src_wxExample.cpp.obj.
ninja: build stopped: subcommand failed.

Похоже, мне нужно добавить зависимость wxWidgets для компилятора ресурсов, но я не понимаю, как.

meson.build:

project('TestWXApp', 'c')

add_languages('cpp', required : true)

src_data = []

if build_machine.system() == 'windows'
    #compile static wxWidgets on windows
    wxDep = dependency('wxwidgets',
                       version : '>=3.0.0',
                       required : true,
                       modules : ['--static', 'std', 'stc'])

    mod_rescomp = import('windows')
    src_data += mod_rescomp.compile_resources('./resources/theme_win32.rc')
else
    #build for linux
    wxDep = dependency('wxwidgets',
                       version : '>=3.0.0',
                       required : true,
                       modules : ['std', 'stc'])
endif

src_data += ['./src/wxExample.cpp']
inc_tool = include_directories('./src')

inc_res = include_directories('./resources')

executable('TestWXApp',
           sources : [src_data],
           include_directories : [inc_res],
           dependencies : wxDep)

Я поместил тарбол, включая весь Проект (+ сгенерированная папка build_win) здесь: https://lots-of.space/s/NLqmJzjcrknKqbX

Если требуется дополнительная информация, дайте мне знать , Я надеюсь, что кто-то может указать мне правильное направление.

С уважением,

XXXBold

Обновление, 26.01.2020

I Теперь я могу построить проект, однако сейчас требуются жестко заданные пути. Я нашел эти пути, запустив wx-config в терминале и вручную скопировав вывод:

wx-config --cppflags --static

Документация для компилятора ресурсов на meson может быть найдена здесь: https://mesonbuild.com/Windows-module.html#page -описание

Новый файл meson.build:

project('TestWXApp', 'c')

add_languages('cpp', required : true)

src_data = []

if build_machine.system() == 'windows'
    #compile static wxWidgets on windows
    wxDep = dependency('wxwidgets',
                       version : '>=3.0.0',
                       required : true,
                       modules : ['--static', 'std', 'stc'])

    mod_rescomp = import('windows')
    src_data += mod_rescomp.compile_resources('./resources/theme_win32.rc',
                                             args : ['-IC:/msys64/mingw64/lib/wx/include/msw-unicode-static-3.0',
                                                     '-IC:/msys64/mingw64/include/wx-3.0',
                                                     '-D_FILE_OFFSET_BITS=64',
                                                     '-D__WXMSW__'])

else
    #build for linux
    wxDep = dependency('wxwidgets',
                       version : '>=3.0.0',
                       required : true,
                       modules : ['std', 'stc'])
endif

src_data += ['./src/wxExample.cpp']
inc_tool = include_directories('./src')

inc_res = include_directories('./resources')

executable('TestWXApp',
           sources : [src_data],
           include_directories : [inc_res],
           dependencies : wxDep)

Я уверен, что есть лучший способ сделать это ...

Ответы [ 3 ]

0 голосов
/ 26 марта 2020

Я столкнулся с той же проблемой, что и вы, после обновления 26.01.2020.

Я опубликовал связанный вопрос: Как получить включаемые каталоги из зависимости в системе сборки мезонов

Один из способов - получить переменную cppflags из wxDep, разделить ее на массив и передать параметру args compile_resources. Но у этого недостатка не работает, если какой-либо из путей включения содержит пробел. Это небольшой пример:

project('project1', ['cpp'])
windows = import('windows')
src = ['main.cpp']

wxDep = dependency('wxwidgets')
wx_cppflags = wxDep.get_configtool_variable('cppflags')
wx_cppflags_arr = wx_cppflags.split(' ')

src += windows.compile_resources('test.rc', args: wx_cppflags_arr)

executable('testapp',
           sources : src,
           dependencies : wxDep)
0 голосов
/ 18 апреля 2020

Вот как я это делаю (кредит @ dcbaker , github.com / mesonbuild / meson # 6897 ).

Действительно, wx-config есть способ дать нам все необходимые аргументы (этот пример взят из моей установки MSYS2):

$ wx-config --rescomp
windres --include-dir C:/msys64/mingw64/include/wx-3.0 --define __WIN32__ --define __GNUWIN32__ --define WX_CPU_AMD64

Мы можем запустить эту команду, удалить предыдущие «windres» и использовать оставшуюся строку как args для compile_resources.

"Здесь есть одна уродливая вещь, что мезонные массивы не имеют хорошего способа взять срезы, поэтому я сделал небольшой хак, чтобы удалить windres из списка аргументов"

wx_dep = dependency('wxwidgets')
raw_wx_windres_args = wx_dep.get_variable(configtool : 'rescomp').split()
wx_windres_args = []
foreach a : raw_wx_windres_args
  if a != 'windres'
    wx_windres_args += a
  endif
endforeach

win = import('windows')
rc_file = win.compile_resources('resources/windows.rc', args : wx_windres_args)
0 голосов
/ 28 января 2020

Я не знаю Meson, но вам нужно указать путь к каталогу wxWidgets, включающему каталог для компилятора ресурсов (rc.exe), а не только сам компилятор C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...