Jump to content

CMake find package

From Haidhi Wiki
Revision as of 03:32, 19 June 2026 by SanzSkuy (talk | contribs) (Created page with "<code>find_package</code> 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 <code>target_link_libraries</code>. <syntaxhighlight lang="cmake"> find_package(<NamaPackage> [version] [REQUIRED] [COMPONENTS ...]) </syntaxhighlight> ; <code>REQUIRED</code> : Build langsung gagal jika library tidak ditemukan. ; <code>COMP...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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

Referensi