Для того щоб знайти усі файли вихідного джерельного коду у системі побудови Meson не вийде використати вбудовану функцію. Натомість необхідно скористатися функцією для виконання команд run_command перед цим створивши відповідний скрипт, у даному випадку на мові Python.

Скрипт пошуку файлів на мові Python

Розглянемо приклад використовуваного скрипта для пошуку усіх файлів вихідного джерельного коду програми на мові C++:

import glob

sources = glob.glob("src/**/*.cpp", recursive=True)
sources += glob.glob("src/**/*.h", recursive=True)

for i in sources:
  print(i)

В даному простому скрипті використовується об'єкт glob і його метод пошуку glob.

Перший позиційний параметр приймає шаблон пошуку файлів. У даному випадку використовується простий шаблон з символами * і ** що означають будь-які директорії і будь-яку назву файлу, що у свою чергу з суфіксом .h або .cpp буде означати будь-яку назву файлу який закінчується на .h або .cpp.

Суфікси розширень файлів можна замінити на будь-які необхідні і виконати пошук для, наприклад, файлів Java або-що.

Метод glob виконує пошук рекурсивно завдяки переданому іменованому параметру recursive=True.

Результати викликів методу glob записуються у змінну sources. Після чого скрипт друкує усі знайдени файли на стандартний вивід, де їх може прочитати Meson.

Щоб виконати його у командному рядку необхідно скористатися командою python3 з прапорцем -c:

python3 -c 'import glob

sources = glob.glob("src/**/*.cpp", recursive=True)
sources += glob.glob("src/**/*.h", recursive=True)

for i in sources:
  print(i)'

Приклад виконання і виводу даної команди:

Python source search execution example

Інтеграція скрипта пошуку Python у Meson

В загальному не рекомендується виконувати пошук файлів через скрипти і створювати з них цілі для побудови - це може призвести до некоректних результатів. Але може виникнути потреба у такому пошуку щоб визначити користувацькі цілі побудови, що не створюють цільові артефакти, а являються супровідніми для проекту.

Розглянемо інтеграцію даного Python скрипта у скрипт системи побудови Meson:

python3 = import('python').find_installation()

cmd_py = '''
import glob

sources = glob.glob('@0@/src/**/*.cpp', recursive=True)
sources += glob.glob('@0@/src/**/*.h', recursive=True)

for i in sources:
  print(i)
'''.format(meson.project_source_root())

all_CPP_sources = run_command(
  python3, 
  '-c', 
  cmd_py
).stdout().strip().split('\n')

Даний Meson-скрипт і його приклад використання можна знайти у, наприклад, репозиторії шаблонного проекту для C++ програм за адресою https://github.com/yuriysydor1991/cpp-app-template/blob/e83065eaaa1fa2cdc6c3c4518df91900b52bc730/meson/template-project-all-source-files/meson.build.

У даному скрипті побудови Meson визначається використовувана команда python і її шлях записується у змінну python3; свторюється і форматується рядок який визначає команду для інтерпретатора Python у змінну cmd_py (замість @0@ підставляється значення виразу meson.project_source_root()); після чого новостворений скрипт передається у функцію run_command.

Результат виконання run_command зчитується з стандартного виводу використовуваного інтерпретатора Python, видаляють надмірні пробіли і отриманий рядок символів розділяється по символу \n що перетворює отриманий результат на список. І в результаті змінна all_CPP_sources містить список усіх знайдених файлів вихідного джерельного коду C++.

Приклад використання знайдених файлів вихідного коду

Розглянемо приклад використання отриманого списку файлів у змінній all_CPP_sources для створення цілі перевірки файлів вихідного коду за допомогою статичного аналізатора коду cppcheck:

custom_target(
  'cppcheck',
  command: [
  'cppcheck',
  '--language=c++',
  '--std=c++17',
  '--error-exitcode=1',
  '--inconclusive',
  '--enable=all',
  '-v',
  '-I' + project_include_root,
  '-I' + meson.global_build_root(),
  '-I' + template_project_config_include,
  ] + all_CPP_sources,
  build_always_stale: false,
  output: 'cppcheck-output-stub.txt'
)

Приклад даного скрипта можна переглянути у загаданому вище шаблонну проекті C++ програм за адресою https://github.com/yuriysydor1991/cpp-app-template/blob/e83065eaaa1fa2cdc6c3c4518df91900b52bc730/meson/template-project-cppcheck-target/meson.build.

Опис як склонувати і побудувати проект у відповідному README.md файлі проекту.

Категорії: