Успешная сборка Kicad 4.0.6 в Linux Mageia 5 с помощью исправления символа wx-3.0

Мне удалось собрать Kicad 4.0.6 в Linux Mageia 5.1 с gcc версии 4.9.2. Сначала я вручную исправил два заголовочных файла wxWidgets 3.0.2 в каталоге /usr/include/wx-3.0/wx/: regex.h и features.h. Kicad затем успешно скомпилирован. С собственными заголовками wx-3.0 компилятор сгенерировал ошибку в pcbnew/netlist_reader.cpp из-за неопределенной переменной wxRE_ADVANCED.

Заголовок features.h проверяет, определен ли макрос WX_NO_REGEX_ADVANCED. Если да, features.h отменяет определение макроса wxHAS_REGEX_ADVANCED и определяет его, если нет. Макрос wxHAS_REGEX_ADVANCED, в свою очередь, используется в regex.h, чтобы определить, присутствует ли среди перечисленных констант wxRE_ADVANCED = 1. Стандарт прекомпилированной Mageia 5 пакетов wxgtku3.0_0 и lib64wxgtku3.0-Devel, что я установил с использованием программного обеспечения менеджером URPMI Mageia в Mageia из хранилища WX_NO_REGEX_ADVANCED определен, поэтому wxHAS_REGEX_ADVANCED не определен, и, следовательно, wxRE_ADVANCED не определен либо. Исходный пакет Kicad 4.0.6 предполагает wxRE_ADVANCED = 1, поэтому процесс сборки останавливается с ошибкой.

Затем я вернул /usr/include/wx-3.0/wx/regex.h и features.h в их первоначальное состояние и узнал, как добавить определение wxRE_ADVANCED в CMakeLists.txt. Однако у меня все еще есть вопрос.

Рекомендуемый формат добавления определения в CMakeLists.txt, который я нашел в командной строке CMake для C++ #define:

if (NOT DEFINED wxRE_ADVANCED)
  set(wxRE_ADVANCED 1)
endif()

add_definitions(-DwxRE_ADVANCED=$(wxRE_ADVANCED))

Однако это не сработало! Расширение макроса для wxRE_ADVANCED в pcbnew/netlist_reader.cpp было пустым. Я напечатал его во время компиляции, вставив следующие строки в файл netlist_reader.cpp (это было трудно найти, большинство рекомендуемых форматов не работало. Правильный - в препроцессоре C: разверните макрос в #warning):

#define __STRINGIFY(TEXT) #TEXT
#define __WARNING(TEXT) __STRINGIFY(GCC warning TEXT)
#define WARNING(VALUE) __WARNING(__STRINGIFY(wxRE_ADVANCED = VALUE))

Pragma (WARNING(wxRE_ADVANCED))

Наконец, я упростил определение CMakeLists.txt до этого, и это было успешно:

if (NOT DEFINED wxRE_ADVANCED)
  set(wxRE_ADVANCED 1)
endif()

add_definitions(-DwxRE_ADVANCED=1)

Мой вопрос: что означает "-DwxRE_ADVANCED=$(wxRE_ADVANCED)", если он не работает? Можно ли не использовать set(wxRE_ADVANCED 1), а просто написать add_definitions(-DwxRE_ADVANCED=1)? Спасибо.

PS Да, процесс сборки Kicad 4.0.6 успешно завершен с добавлением только одной строки в файл CMakeLists.txt верхнего уровня:

add_definitions(-DwxRE_ADVANCED=1) 

1 ответ

Решение

Переменная вызывается через $variable или же ${variable}, Обратите внимание на фигурные скобки, а не круглые скобки.

Также рекомендуется использовать:

target_compile_definitions(mytarget PUBLIC wxRE_ADVANCED=1)

непосредственно на цель, а не на общую add_definitions() команда.

Другие вопросы по тегам