CMake find package
find_package adalah command CMake untuk mendeteksi library eksternal yang sudah terinstall di sistem. CMake akan mencari konfigurasi library tersebut, lalu mengekspos imported target yang bisa langsung dipakai di target_link_libraries.
find_package(<NamaPackage> [version] [REQUIRED] [COMPONENTS ...])
REQUIRED- Build langsung gagal jika library tidak ditemukan.
COMPONENTS- Beberapa package punya sub-komponen (misal Boost punya
filesystem,thread, dll).
Dua Mode Pencarian
1. Module Mode (Find<Package>.cmake)
CMake mencari file bernama Find<NamaPackage>.cmake di direktori built-in-nya:
/usr/share/cmake/Modules/FindMPI.cmake /usr/share/cmake/Modules/FindOpenCL.cmake /usr/share/cmake/Modules/FindBoost.cmake ... dst
File ini ditulis oleh tim CMake dan sudah bundled bersama instalasi CMake. File inilah yang berisi logika untuk mendeteksi library (scan path, cek header, cek linker flags, dll), sekaligus mendefinisikan imported target yang tersedia setelah find_package berhasil.
Untuk melihat daftar semua Find modules bawaan:
ls /usr/share/cmake/Modules/Find*.cmake
2. Config Mode (<Package>Config.cmake)
Jika tidak ada Find module bawaan, CMake mencari file <NamaPackage>Config.cmake yang di-install oleh library itu sendiri ke sistem (biasanya di /usr/lib/cmake/ atau /usr/local/lib/cmake/).
/usr/lib/cmake/OpenCV/OpenCVConfig.cmake /usr/lib/cmake/fmt/fmtConfig.cmake
Library modern biasanya menyediakan file ini agar bisa ditemukan oleh CMake.
Cara Tau Nama Package yang Valid
Nama yang ditulis di find_package(XYZ) harus persis cocok (case-sensitive) dengan nama file FindXYZ.cmake atau XYZConfig.cmake.
# Lihat semua Find modules yang tersedia di sistem
ls /usr/share/cmake/Modules/Find*.cmake
# Atau cari nama spesifik
ls /usr/share/cmake/Modules/ | grep -i mpi
Cara Tau Nama Imported Target
Setelah find_package sukses, dia membuat satu atau lebih imported target. Nama target ini didefinisikan di dalam file Find<Package>.cmake.
Cara menemukannya:
A. Baca langsung file .cmake-nya
# Cari baris yang mendefinisikan imported target
grep -i "add_library.*IMPORTED\|INTERFACE_INCLUDE\|MPI::" \
/usr/share/cmake/Modules/FindMPI.cmake
B. Baca dokumentasi CMake
Setiap Find module bawaan punya halaman dokumentasi resmi di https://cmake.org/cmake/help/latest/module/FindMPI.html (ganti FindMPI dengan nama module yang dicari).
C. Gunakan cmake --help-module
cmake --help-module FindMPI
cmake --help-module FindOpenCL
Contoh: MPI dan OpenCL
MPI
find_package(MPI REQUIRED)
Imported target yang tersedia setelah ini:
| Target | Kegunaan |
|---|---|
MPI::MPI_C |
Untuk kode C |
MPI::MPI_CXX |
Untuk kode C++ |
MPI::MPI_Fortran |
Untuk kode Fortran |
Cara CMake mendeteksi MPI: mencari program mpicc / mpicxx di PATH, lalu mengekstrak flags compile dan link dari sana.
OpenCL
find_package(OpenCL REQUIRED)
Imported target yang tersedia:
| Target | Kegunaan |
|---|---|
OpenCL::OpenCL |
Satu-satunya target, untuk semua bahasa |
Cara CMake mendeteksi OpenCL: mencari header CL/cl.h atau OpenCL/cl.h, dan library libOpenCL.so di path sistem.
Alur Kerja Lengkap
find_package(MPI REQUIRED)
│
▼
CMake baca FindMPI.cmake
│
▼
FindMPI.cmake scan sistem
- cek PATH untuk mpicc/mpicxx
- ekstrak -I (include) dan -l (link) flags
│
├─ Tidak ketemu ──► Error (karena REQUIRED)
│
└─ Ketemu ──► Buat imported target MPI::MPI_CXX
│
▼
target_link_libraries(matmul PRIVATE MPI::MPI_CXX)
│
▼
CMake otomatis tambahkan include path
dan linker flags dari MPI ke binary matmul
Variabel yang Di-set oleh find_package
Selain imported target (cara modern), find_package juga men-set variabel lama (cara lama, masih valid):
| Variabel | Isi |
|---|---|
MPI_FOUND |
TRUE jika ditemukan
|
MPI_CXX_INCLUDE_DIRS |
Path ke header MPI |
MPI_CXX_LIBRARIES |
Path ke file library MPI |
MPI_CXX_COMPILE_FLAGS |
Flag compiler untuk MPI |
Cara modern (imported target) lebih direkomendasikan karena tidak perlu urus variabel-variabel ini secara manual.
Tips Debugging
Jika find_package gagal:
# Jalankan cmake dengan output verbose untuk melihat apa yang dicari
cmake -DCMAKE_FIND_DEBUG_MODE=ON ..
# Cek apakah library terinstall
dpkg -l | grep -i libmpi # Debian/Ubuntu
pacman -Q | grep -i mpi # Arch Linux
# Cek apakah mpicc tersedia di PATH
which mpicc
mpicc --showme # Lihat flags yang dipakai