Setelah melalui ini beberapa kali dengan produk komersial, menurut saya jawaban terbaik adalah menggunakan penginstal asli untuk setiap platform yang didukung. Apa pun yang lain menghasilkan pengalaman yang tidak menyenangkan bagi pengguna akhir, dan dalam praktiknya Anda harus menguji pada setiap platform yang ingin Anda dukung, jadi memelihara paket untuk masing-masing platform bukanlah beban yang signifikan. Gagasan bahwa Anda dapat membuat biner yang dapat "berfungsi" di setiap platform di luar sana, termasuk beberapa platform yang belum pernah Anda dengar, benar-benar tidak berfungsi dengan baik.
Rekomendasi saya adalah Anda memilih satu atau dua platform untuk didukung pada awalnya (Red Hat dan Ubuntu akan menjadi saran saya) dan kemudian biarkan permintaan pengguna mendorong pembuatan paket instalasi tambahan. Mungkin beri tahu bahwa Anda bersedia mendukung platform tambahan, dengan biaya rendah yang mencakup waktu dan upaya Anda dalam mengemas dan menguji platform tersebut. Jika suatu platform terbukti sangat berbeda, Anda mungkin perlu mengenakan biaya lebih untuk dukungan berkelanjutan.
Oh, dan saya tidak bisa terlalu menekankan nilai mesin virtual untuk skenario seperti ini. Anda perlu membuat VM untuk setiap platform yang Anda dukung, dan mungkin beberapa VM per platform untuk memudahkan pengujian konfigurasi yang berbeda.
Ada banyak jawaban bagus (termasuk saya :)) di sini. Meskipun itu lebih tentang kompatibilitas biner (yang perlu Anda khawatirkan).
Untuk penginstal saya akan merekomendasikan autopackage (kami berhasil merilis beberapa versi perangkat lunak kami dengannya), mereka sudah melakukan bagian "installer.sh" dan lebih banyak lagi (integrasi desktop misalnya).
Anda harus berhati-hati dan menguji skenario dan hal-hal pemutakhiran Anda, tergantung pada seberapa rumit struktur paket Anda, tetapi secara keseluruhan cukup rapi. Saya memperbaiki beberapa bug dengan penanganan ketergantungan di 1.2.6, jadi seharusnya tidak masalah.
PEMBARUAN :Pertanyaan asli telah dihapus, jadi posting ulang jawaban lengkap di sini, abaikan semua referensi ke paket otomatis, yang digabungkan ke Listaller, tidak yakin apakah bagian yang relevan bertahan.
Untuk pustaka standar (seperti crypto++, pthreads, dll) yang mungkin tersedia dalam distribusi -- tautkan secara dinamis dan beri tahu pengguna untuk mendapatkannya dari repositori distro mereka. Atau tautkan secara statis jika memungkinkan.
Untuk perpustakaan aneh yang versinya harus Anda kontrol (jika Anda ingin menerapkan aplikasi Qt4 di wilayah gnome musuh misalnya), kompilasi sendiri dan instal ke tempat pribadi yang hanya diketahui oleh aplikasi Anda.
Jangan pernah menginstal lib pribadi ke tempat standar kecuali Anda yakin tidak mengganggu sistem paket dari semua distro yang Anda dukung. (dan mereka juga tidak dapat mengganggu Anda).
Gunakan rpath alih-alih LD_LIBRARY_PATH, dan setel dengan benar untuk semua binari Anda dan semua dll yang saling merujuk satu sama lain. Anda dapat mengatur rpath pada biner Anda ke "$ORIGIN;$ORIGIN/../lib;/opt/my/private/libs" dan meminta linker mencari tempat-tempat itu sebelum jalur standar apa pun. (saya pikir harus menetapkan beberapa bendera linker agar Origin berfungsi). Pastikan untuk mengatur rpath pada lib Anda juga:misalnya QtGui membutuhkan QtCore, dan jika pengguna kebetulan menginstal paket standar dengan versi yang berbeda, Anda benar-benar tidak ingin mengambilnya (exe -> ../lib/QtGui.so ( 4.4.3) -> /usr/local/lib/QtCore.so (4.4.2) -- cara yang pasti untuk mati dini).
Jika Anda mengompilasi dengan rpath apa pun, Anda dapat mengubahnya nanti dengan chrpath, sehingga memungkinkan untuk men-tweak lokasi penginstalan sebagai bagian dari pemrosesan pos atau skrip penginstalan.
Pertahankan kompatibilitas biner. GLIB_C cukup statis untuk pengguna Anda, jadi Anda harus menautkan ke beberapa versi yang cukup lama. 2.3 adalah taruhan yang aman. Anda dapat menggunakan APBuild -- pembungkus gcc yang menerapkan versi GLIB_C dan melakukan beberapa trik kompatibilitas biner lainnya, sehingga Anda tidak perlu mengompilasi semua aplikasi Anda di distro yang sangat lama.
Jika Anda menautkan ke sesuatu secara statis, umumnya harus dibangun kembali dengan APBuild juga, jika tidak maka akan menyeret simbol GLIB_C yang lebih baru. Semua .so yang Anda instal secara pribadi tentu saja harus dibuat dengannya juga. Terkadang Anda harus menambal lib pihak ketiga untuk menggunakan simbol lama. (Saya harus menambal ruby untuk mengembalikan izin yang sebenarnya dan bukan yang efektif, karena tidak ada fungsi seperti itu di GLIB_C lama. Masih tidak yakin apakah saya merusak sesuatu :)).
Untuk integrasi dengan lingkungan desktop (asosiasi file, tipe mime, ikon, entri menu mulai, dll) gunakan xdg-utils. Hati-hati, seperti semua yang ada di linux, mereka tidak terlalu suka spasi di nama file :). Pastikan untuk menguji hal-hal tersebut di setiap distro target -- implementasi xdg penuh dengan bug dan keanehan.
Untuk penginstalan aktual, Anda dapat menyediakan berbagai paket asli (rpm, deb, dan beberapa lainnya), atau meluncurkan penginstal Anda sendiri, atau menemukan penginstal yang berfungsi di semua distro yang melewati pengelola paket asli. Kami berhasil menggunakan Autopackage (orang yang sama yang membuat APbuild) untuk itu.
Anda mungkin ingin mencoba InstallBuilder. Ini adalah crossplatform (berjalan di Windows, Linux, Mac OS X, Solaris dan hampir semua platform Unix lainnya di luar sana). Ini digunakan oleh Intel, Motorola, GitHub, MySQL, Nokia/Trolltech dan banyak perusahaan lain sehingga Anda akan berada di perusahaan yang baik :) Selain penginstal biner, ini juga dapat membuat paket RPM dan DEB lintas-distro.
InstallBuilder bersifat komersial, tetapi kami menawarkan lisensi gratis untuk program sumber terbuka dan diskon yang sangat signifikan untuk mISV atau pengembang tunggal, cukup hubungi kami.