Для того щоб знайти усі файли вихідного джерельного коду у системі побудови 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 у 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 файлі проекту.