QMake не соответствует регулярному выражению для обнаружения дистрибутива - PullRequest
0 голосов
/ 31 мая 2019

У меня есть проект C ++, использующий QMake. Я пытаюсь установить некоторые параметры компилятора, основываясь на простом тесте, на котором работает дистрибутив Linux, но тест не проходит. Мой файл qmake содержит:

OSDISTRO = $$(cat /proc/version)
contains(OSDISTRO, "Ubuntu"): {
  message(Found ubuntu)
}

Я протестировал регулярное выражение из командной строки, и оно работает!

cat /proc/version | pcregrep "Ubuntu"
Linux version 4.18.0-20-generic (buildd@lcy01-amd64-020) (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) #21~18.04.1-Ubuntu SMP Wed May 8 08:43:37 UTC 2019

Есть ли что-то особенное в синтаксисе регулярных выражений в qmake? Любая причина, почему это не работает?

1 Ответ

0 голосов
/ 31 мая 2019

Для RegEx:

Это работает для меня:

OSDISTRO = $$system(cat /proc/version)
contains(OSDISTRO, .*Ubuntu.*){
  message("Found Ubuntu")
}

Примечание: Совпадение чувствительно к регистру.

Например, .*[uU]buntu.* можно использовать для сопоставления ubuntu и Ubuntu.

Объяснение , почему ваше решение не работает:

Функция QMake contains работает с списками значений.

Итак, выполнение вашего решения будет таким:

1) Первая инструкция OSDISTRO = $$(cat /proc/version):

  • QMake выполнит $$system(cat /proc/version).

  • Затем результатразделяется (через пробел в качестве разделителя) на список значений.OSDISTRO будет содержать этот список.

Предполагая, что результат будет вашим.Результат первой инструкции выглядит следующим образом: OSDISTRO = "Linux" "version" "4.18.0-20-generic"....

2) Вторая инструкция contains(OSDISTRO, "Ubuntu") : message(Found ubuntu):

  • QMake будет искать, если переменная OSDISTRO содержитзначение Ubuntu и отобразить сообщение Found ubuntu в случае успеха.

Здесь, в вашем случае, QMake никогда не найдет Ubuntu, потому что значение, которое содержит его, выглядит следующим образом (Ubuntu 7.3.0-16ubuntu3)и QMake ищите только значение Ubuntu.

Надеюсь, оно вам поможет.

...