Pengembang perangkat lunak beralih dari Linux ke OS X, apa sajakah yang didapat?

50

Saya telah menggunakan Ubuntu / Fedora / Red Hat / Suse tetapi belum pernah menggunakan OS X sama sekali. Jika saya harus mulai menggunakan OS X secara teratur, hal-hal apa yang harus saya perhatikan?

Alat yang saya gunakan adalah rantai alat GNU, C ++ / Boost, dll.

grokus
sumber
Apakah Anda akan mengembangkan aplikasi Unix / Linux yang lebih konvensional, atau aplikasi Mac OSX?
David Thornley
1
Setidaknya pada awalnya aplikasi Unix / Linux yang lebih konvensional, saya hanya menggunakan OS X PC sebagai workstation.
grokus

Jawaban:

52

Saya melakukan langkah yang sama bertahun-tahun lalu. Inilah beberapa hal yang saya alami:

  • Rata-rata desktop Linux Anda memiliki pengguna yang lebih kaya daripada OS X.

    Anda mungkin akan kehilangan alat yang berbeda dari yang saya lakukan, jadi tidak masuk akal untuk mendapatkan rekomendasi tentang penggantian.

    Sebaliknya, cukup instal Fink , MacPorts , atau Homebrew hal pertama. Sistem ini menyediakan sistem manajemen paket khas Linux atau BSD. Masing-masing memiliki citarasa dan paket sendiri, sehingga pilihan yang tepat akan didasarkan pada selera dan kebutuhan Anda.

    Anda mungkin menemukan bahwa tidak ada satu sistem paket akan memiliki setiap program yang Anda butuhkan. Beberapa program belum porting ke OS X, jadi mereka tidak akan muncul di sistem paket apa pun . Namun demikian, sistem ini sangat memperluas apa yang dikirim dengan OS X, dan akan memudahkan transisi Anda dari Linux.

  • Kompiler baris perintah OS X sekarang membangun executable 64-bit secara default.

    Di Leopard dan sebelumnya, kompiler membuat executable 32-bit sebagai default. Ini dapat menyebabkan masalah dalam beberapa cara: mungkin Anda memiliki perpustakaan 32-bit lama yang tidak dapat Anda bangun kembali tetapi harus terhubung, mungkin Anda masih menjalankan sistem Anda dalam mode 32-bit, dll.

    Salah satu cara untuk memaksa build 32-bit adalah dengan mengesampingkan gccdefault dalam sistem build dengan gcc-4.0, yang menjadi compiler Leopard 32-bit-by-default. ( gccadalah symlink ke 64-bit-secara-default gcc-4.2pada Snow Leopard.) Dengan sistem build berbasis autoconf, ini berfungsi:

    $ ./configure CC=gcc-4.0 CXX=g++-4.0
    

    (Anda hanya perlu CXXbit jika program berisi komponen C ++.)

    Cara lain adalah dengan meneruskan -m32ke kompiler dan tautan:

    $ ./configure CFLAGS=-m32 CXXFLAGS=-m32 LDFLAGS=-m32
    

    Ini lebih banyak mengetik, tetapi memungkinkan Anda mendapatkan build 32-bit dari GCC yang lebih baru.

  • Tautan dinamis sangat berbeda.

    Jika Anda adalah orang yang menulis ldperintah dengan tangan, saatnya untuk menghentikan kebiasaan itu. Anda seharusnya menautkan program dan pustaka melalui kompiler, atau menggunakan perantara seperti libtool. Ini menangani perbedaan skema tautan platform-khusus niggly, sehingga Anda dapat menghemat daya otak untuk program pembelajaran yang tidak dapat Anda abaikan dengan mekanisme portabel.

    Misalnya, Anda harus memperbarui memori otot Anda sehingga Anda mengetik otool -L someprogramalih-alih ldd someprogramuntuk mencari tahu apa perpustakaan someprogramterhubung.

    Perbedaan lain dalam hubungan dinamis yang akan memelintir otak Anda pada awalnya adalah bahwa pada OS X, lokasi pemasangan untuk perpustakaan dicatat di perpustakaan itu sendiri , dan salinan tautan itu menjadi yang dapat dieksekusi pada waktu tautan. Ini berarti bahwa jika Anda menautkan ke pustaka yang telah diinstal /usr/local/libtetapi Anda ingin mengirimkannya ke pengguna Anda di direktori yang sama dengan yang dapat dieksekusi, Anda perlu mengatakan sesuatu seperti ini sebagai bagian dari proses instalasi Anda:

    $ cp /usr/local/lib/libfoo.dylib .
    $ install_name_tool -id @loader_path/libfoo.dylib libfoo.dylib
    $ make LDFLAGS=-L. relink
    

    Sekarang, sebagian besar di atas mungkin bervariasi untuk sistem build Anda, jadi anggap saja sebagai contoh, daripada resep. Apa yang dilakukan adalah membuat salinan pribadi dari perpustakaan yang kami tautkan, mengubah pengidentifikasi pustaka bersama dari jalur absolut menjadi relatif yang berarti "dalam direktori yang sama dengan yang dapat dieksekusi", lalu memaksa membangun kembali yang dapat dieksekusi terhadap salinan yang dimodifikasi ini. perpustakaan.

    install_name_tooladalah perintah inti di sini. Jika Anda ingin menginstal pustaka di ../libdirektori relatif terhadap yang dapat dieksekusi, -idargumennya haruslah @loader_path/../lib/libfoo.dylibsebaliknya.

    Joe Di Pol menulis artikel bagus tentang ini , dengan lebih banyak detail.

  • Tautan dinamis + paket pihak ketiga dapat menyebabkan sakit kepala sejak dini.

    Anda cenderung mengalami masalah tautan dinamis sejak awal, segera setelah Anda mulai mencoba menggunakan pustaka dari paket pihak ketiga yang tidak menginstal pustaka ke lokasi standar. MacPorts melakukan ini, misalnya, menginstal pustaka /opt/local/lib, bukan /usr/libatau /usr/local/lib. Saat Anda mengalami ini, perbaikan yang baik untuk masalah ini adalah dengan menambahkan baris seperti berikut ini ke Anda .bash_profile:

    # Tell the dynamic linker (dyld) where to find MacPorts package libs
    export DYLD_LIBRARY_PATH=/opt/local/lib:$DYLD_LIBRARY_PATH
    
    # Add MacPorts header file install dirs to your gcc and g++ include paths
    export C_INCLUDE_PATH=/opt/local/include:$C_INCLUDE_PATH
    export CPLUS_INCLUDE_PATH=/opt/local/include:$CPLUS_INCLUDE_PATH
    
  • OS X menangani masalah kompatibilitas CPU secara berbeda dari Linux.

    Pada Linux 64-bit di mana Anda juga harus mendukung 32-bit untuk alasan apa pun, Anda berakhir dengan dua salinan hal-hal seperti perpustakaan yang perlu berada dalam kedua format, dengan versi 64-bit dalam lib64direktori yang paralel dengan libdirektori tradisional .

    OS X memecahkan masalah ini secara berbeda, dengan konsep Universal binary, yang memungkinkan Anda memasukkan banyak binari ke dalam satu file. Saat ini Anda dapat memiliki executable yang mendukung hingga 4 jenis CPU: PowerPC 32- dan 64-bit, plus Intel 32- dan 64-bit.

    Sangat mudah untuk membangun binari Universal dengan Xcode, tetapi sedikit merepotkan dengan alat-alat baris perintah. Ini membuat Anda membangun Universal-only Intel dengan sistem build berbasis Autoconf:

    $ ./configure --disable-dependency-tracking CFLAGS='-arch i386 -arch x86_64' \
      LDFLAGS='-arch i386 -arch x86_64'
    

    Tambahkan -arch ppc -arch ppc64ke CFLAGSdan LDFLAGSjika Anda membutuhkan dukungan PowerPC.

    Jika Anda tidak menonaktifkan pelacakan ketergantungan, Anda akhirnya membangun hanya untuk satu platform, karena keberadaan .ofile yang baru dibangun untuk platform pertama meyakinkan make(1)bahwa itu tidak perlu dibangun untuk platform kedua juga. Semuanya harus dibangun dua kali dalam contoh di atas; empat kali untuk biner Universal sepenuhnya, jika Anda masih membutuhkan dukungan PowerPC.

    (Info lebih lanjut di Catatan Teknis Apple TN2137 .)

  • Alat pengembang tidak diinstal pada OS X secara default.

    Sebelum Lion, tempat yang paling dapat diandalkan untuk mendapatkan alat dev yang tepat untuk sistem Anda adalah pada cakram OS. Itu adalah pemasangan opsional.

    Yang menyenangkan tentang menginstal alat dev dari cakram OS adalah Anda tahu alat itu akan bekerja dengan OS. Apple menjadi Apple, Anda harus memiliki versi terbaru OS untuk menjalankan kompiler terbaru, dan mereka tidak selalu membuat unduhan alat lama yang tersedia, jadi cakram OS sering kali merupakan cara termudah untuk menemukan alat yang tepat untuk diberikan. dev atau kotak uji.

    Dengan Lion, mereka mencoba untuk menghapus instalasi media, jadi kecuali Anda membeli versi kunci USB yang mahal, Anda harus mengunduh Xcode dari App Store .

    Saya sarankan Anda menyimpan setidaknya beberapa versi Xcode DMG yang Anda unduh. Ketika penerus Lion keluar satu atau tiga tahun karena itu, Anda mungkin menemukan diri Anda tanpa cara untuk menginstal versi Xcode kontemporer pada VM uji Lion. Merencanakan ke depan jika masalah ketersediaan dan kurangnya media OS membuat versi lama Xcode tidak dapat diperoleh.

Warren Young
sumber
2
+1: khusus untuk menyebutkan hubungan dinamis. Saya terjebak berpikir itu akan sangat mirip. Kegembiraan install_name dan bagaimana editor tautan dinamis OSX dyld,, mengatasi depdendensi!
Troubadour
Tentang menjaga versi lama MacOS: Saya menggunakan Paralel untuk menjaga VM terpisah dengan versi OS X yang diberikan jika saya ingin menguji kompatibilitas ke belakang. Saya merekomendasikan ini atau alat serupa untuk pengujian aplikasi.
ogerard
Untuk versi lama alat pengembang, periksa connect.apple.com . Saya baru saja memeriksa, dan unduhan pertama yang tercantum di bagian Alat Pengembang adalah Xcode 1.0 dari 27 Oktober 2004 untuk OS X 10.3+. Bukan ProjectBuilder, tetapi SOP untuk proyek Mac hanya mendukung rilis besar saat ini dan sebelumnya, jadi 10.3+ lebih dari cukup.
Jeremy W. Sherman
@ Jeremy: Diperbarui. Saya tidak ingin meyakinkan orang bahwa mereka akan selalu dapat diunduh, karena mereka tidak selalu di masa lalu.
Warren Young
29

HUGE GOTCHA - filesystem Mac OS TIDAK peka huruf besar-kecil.

kawan
sumber
9
Untuk lebih jelasnya, mereka mempertahankan kasus dan tidak peka huruf besar-kecil secara default. Jadi kasing nama file Anda akan dipertahankan, tetapi Anda dapat mengaksesnya melalui variasi kasing apa pun. Ini bisa diubah menjadi case-sensitive ketika sistem file dibuat.
KeithB
9
@KeithB: Namun, banyak aplikasi Mac umum tidak akan berjalan pada sistem file case-sensitive, misalnya Adobe CS menolak untuk menginstal, dan World of Warcraft tidak akan berjalan. Saya terbakar oleh ini dan satu-satunya cara untuk memulihkan adalah membuat cadangan dan memulihkan sistem saya ke disk yang diformat ulang.
Neil Mayhew
1
Ini sebagian besar adalah gotcha ketika berhadapan dengan kontrol versi, dan mengerjakan proyek dalam tim multi platform.
Arafangion
Saya membuat sparsebundle case-sensitive untuk mengatasinya. Untungnya, saya memiliki partisi yang tidak digunakan pada SSD ini.
dhchdhd
9

Meskipun Fink dan MacPorts adalah cara tradisional untuk mendapatkan paket unix pada OS X, saya sarankan untuk memeriksa alat yang lebih baru brewyang telah bekerja lebih baik untuk saya dan lebih sedikit mengacaukan sistem saya, dan jauh lebih mudah digunakan. Ini pada dasarnya hanya mengunduh tarbal dan menginstal ke / usr / local, tetapi mengotomatiskan seluruh proses dengan sangat baik.

http://mxcl.github.com/homebrew/

Sandy
sumber
1
Sepakat; Homebrew telah bekerja jauh lebih lancar bagi saya daripada MacPorts.
Jonik
4

HUGE GOTCHA - filesystem Mac OS TIDAK peka huruf besar-kecil.

Anda dapat membuat image disk case sensitif pada Mac OS X yang dapat dipasang sebagai volume hard drive normal.

# cf. http://codesnippets.joyent.com/posts/show/8617
IMAGE="${HOME}/Desktop/Case Sensitive Test.dmg"
VOLNAME="Case Sensitive Test"

hdiutil create "${IMAGE}" -size 10m -fs HFSX -volname "${VOLNAME}" -layout NONE

hdiutil attach "${IMAGE}"

cd "/Volumes/${VOLNAME}"
touch foo.txt Foo.txt
open .
ls -l [Ff]oo.txt
stat -f "inode: %i  --  name: %N" [Ff]oo.txt

cd ~
hdiutil detach "/Volumes/${VOLNAME}"
taco
sumber
3

Ketika porting tumpukan jaringan dari Solaris, BSD, Linux, dan Windows ke OSX, satu-satunya poin utama yang menarik perhatian adalah seperti FreeBSD, seluruh rantai alat cukup lama.

Apple mempercepat dengan OSX Lion tetapi Leopard, Snow Leopard sangat di belakang distribusi Linux modern dan banyak standar tidak didukung. Dalam kasus saya, saya terkena RFC 3678 (Ekstensi Antarmuka Socket untuk Filter Sumber Multicast) menjadi sangat tidak nyaman.

Pada server OSX saya menginstal sistem file case-sensitive karena merekomendasikan untuk melakukannya untuk melayani HTTP.

  • GCC lama
  • Autoconf Lama, Automake, libtool
  • Tanpa spinthock Pthread, OSX menyediakan alternatif asli.
  • Tidak banyak API NSS yang disewa ulang.
  • /procSistem file tidak terlalu berguna .
  • Tidak /dev/rtc,, /dev/hpetdan RDTSCtampaknya menjadi gimped. OSX menyediakan alternatif asli.
  • Tidak epoll, tapi kamu punya polldan kqueue
Steve-o
sumber
1

OS X mendukung pthread_cond_timedwaittetapi menggunakan waktu kalender absolut dan tidak ada cara untuk menggunakan waktu yang meningkat secara monoton.

andrewrk
sumber