Untuk waktu yang lama, menambahkan paket ke sistem Linux turunan RedHat disebut "RPM Hell", untuk alasan yang baik. Terutama sebelum utilitas yum datang untuk membantu, membuat RPM melakukan hal yang benar sering kali menjadi tugas yang merepotkan. Saya diingatkan lagi hari ini, ketika mencoba mengkompilasi ekstensi PostgreSQL pada dua sistem CentOS yang hampir identik.
PostgreSQL menyediakan API bernama PGXS yang memungkinkan Anda membangun ekstensi server yang memanfaatkan pustaka kode server dan berkomunikasi dengannya. Kami menggunakan PGXS untuk menginstal utilitas repmgr kami, dan memiliki API yang terdefinisi dengan baik memungkinkan program dikembangkan secara eksternal dari inti server utama. Banyak pengaya PostgreSQL yang populer mengandalkan PGXS untuk membangun diri mereka sendiri. Faktanya, berkontribusi modul yang disertakan dengan PostgreSQL sendiri sering dibuat dengan cara ini. Meraih kontribusi yang serupa modul dan meretasnya dari sana adalah jalan yang baik untuk membangun ekstensi PostgreSQL baru.
PGXS bergantung pada pg_config utilitas berada di PATH Anda. pg_config hadir dengan paket postgresql-devel, yang saat ini sebenarnya bernama postgresql90-devel . Sayangnya itu tidak ada di jalur untuk siapa pun secara default. Jadi langkah pertama yang Anda butuhkan untuk membangun menggunakan PGXS adalah membuatnya di sana. Sesuatu seperti ini akan bekerja untuk sebagian besar sistem UNIX:
Berikut tampilan repmgr bangunan pada sistem kerja:
Ini termasuk –m64 -mtune=generic , yang merupakan opsi gcc untuk mengatakan build untuk platform 64 bit, tetapi biarkan kompiler mengetahui dengan tepat di mana Anda berada relatif terhadap batasan lainnya. Saat ini hasilnya biasanya keluar dioptimalkan untuk x86_64 jika Anda memiliki sistem 64-bit. Deteksi otomatis lebih berguna saat pilihannya adalah i386, i468, i586, dan i686.
Ke sistem yang merepotkan. Saya pikir saya akan menempatkan PostgreSQL di sini secara identik, namun build tidak berfungsi sama sekali:
Apa? Ini mencoba membuat kode 32 bit: “-m32 -march=i386 -mtune=generic”. Karena itu, ketika mencoba menautkan dengan semua pustaka 64-bit di server seperti libpq dan libtermcap, tidak bisa. Bagaimana ini bisa terjadi?
Anda dapat melihat dari mana informasi yang masuk ke perintah build PGXS berasal menggunakan pg_config . Berikut cara memeriksa bagian yang terkait dengan CFLAGS , bagian tempat info ukuran bit berada di:
Sekarang aku kesal. Ini mengatakan build untuk 64 bit juga, namun masih menemukan informasi 32-bit. Dari mana asalnya?
Beberapa menggali ke antarmuka PGXS mencoba melacak ini kembali akhirnya membiarkan saya /usr/pgsql-9.0/lib/pgxs/src/Makefile.global dan inilah petunjuk yang mulai muncul. Itu file terdaftar opsi kompiler 32-bit! Dari mana mereka berasal?
Pada titik ini saya mulai melihat RPM apa yang diinstal pada setiap server,
karena ada sesuatu yang berbeda di antara mereka. Berikut perintah praktis untuk diketahui:
RHEL5 mampu menjalankan aplikasi 32 dan 64 bit secara berdampingan, Anda hanya perlu berhati-hati dalam mengkompilasinya. Jadi wajar jika paket kompatibilitas database compat-postgresql-libs dan postgresql90-libs mencakup kedua arsitektur. Anda mungkin memiliki 32 dan 64 aplikasi yang ingin berbicara dengan server yang sama. Ini sering mengganggu, misalnya ketika Anda ingin menghapus sebuah paket dan memberitahu permintaan Anda cocok lebih dari satu dan tidak melakukan apa-apa–Anda perlu –semua cocok untuk memperbaikinya.
Apa yang kita lihat di server yang tidak bisa dikompilasi? Tidak persis sama:
Apa itu postgresql90-devel paket untuk i386 dan x86_64 lakukan di sana? Itu sama sekali tidak masuk akal!
Sekarang, setelah pengujian untuk mencoba dan memahami hal ini, jika Anda memiliki salah satu paket -devel dan mencoba menginstal yang lain, itu mengembalikan rangkaian kesalahan yang tepat untuk file yang bentrok, seperti ini:
Pembuat paket tahu betul bahwa mereka menimpa Makefile.global yang sama. Bagaimana saya mengakhiri dengan keduanya? Setelah menghapus semuanya, saya menemukan caranya:
Ini tentu tidak OK! yum sangat senang menggabungkannya, dan saya pasti telah melakukannya tanpa menyadarinya sebelumnya. Ternyata jika Anda membiarkan keduanya menginstal seperti ini, salinan yang tersisa mungkin tidak melaporkan informasi yang benar kembali ke PGXS–tidak mengherankan, ini membingungkan. Begitulah cara saya menyelesaikan masalah saya. Saya menggunakan Makefile.global diinstal oleh versi i386, tetapi semua yang lain di sistem adalah x86_64.
Lalu bagaimana cara membersihkannya? Mengingat campuran file di sini, Anda tidak dapat benar-benar percaya bahwa hanya menghapus yang tidak diinginkan saja sudah cukup. Maka Anda mungkin tidak memiliki salinan yang tersisa dari semua yang berkonflik. Satu-satunya pilihan yang aman adalah nuke keduanya, lalu instal yang x86_64, sekarang kita tahu persis versi yang tersedia dari pengujian di atas:
Setelah ini diselesaikan, sekarang ekstensi PGXS saya dibangun dengan baik, dan pengembangan
di repmgr dilanjutkan lagi, setelah seharian kehilangan waktu untuk menyelesaikan semua ini.
Pelajaran hari ini: berhati-hatilah saat memasang postgresql90-devel paket melalui yum, dan jangan biarkan kedua arsitektur file itu berada di sana. Hanya gunakan yang cocok dengan platform postgresql90 utama Anda kemasan. Dan jika Anda mencoba membuat ekstensi PGXS pada sistem RHEL/CentOS, dan Anda melihat melewati tidak kompatibel perpustakaan, mulailah dengan melihat paket pengembangan PostgreSQL yang telah Anda instal.
Kami mungkin akan mendapatkan kombinasi buruk ini diblokir oleh pembaruan mendatang untuk paket PostgreSQL 9.0. Saya pikir itu menarik untuk dibagikan, karena tidak banyak contoh bagus untuk melakukan pemecahan masalah seperti ini di RPM. Saya pernah menulis satu yang berjudul Menginstal PostgreSQL 8.2 RPM pada RHEL 5/CentOS 5 yang membahas lebih banyak latar belakang di sini. Tetapi itu adalah hari-hari yang lebih sederhana, sebelum platform 64-bit populer, dan sebelum Anda dapat menginstal lebih dari satu versi PostgreSQL melalui RPM pada saat yang bersamaan. Mengetahui mantra RPM yang tepat untuk membuat daftar paket yang diinstal dengan arsitektur terkaitnya adalah trik penting saat ini untuk menavigasi jalan keluar dari neraka RPM.