Upgrade เป็น Ruby 1.8.6 กับปัญหา IRB, Readline

หลังจากใช้ Ruby 1.8.5 มานาน ก็อยากจะลองของไปเล่น 1.8.6 ซึ่งมันก็ออกมาได้ซักพักแล้วล่ะ ซึ่งเราก็ลงตาม step ล่ะนะ ไม่ยากไม่เย็น

  • Download source ของมันมาก่อน อันนี้หาไม่ยาก แล้วก็เอามา untar ตามปกติ
  • configure มันไปซะ ใช้ pthread กับ readline ด้วย แล้วก็เอาไว้ที่ /usr/local ตามปกติ
    ./configure --prefix=/usr/local \ 
    --enable-pthread --with-readline-dir=/usr/local
  • ไม่มีปัญหาอะไร ก็ make แล้วก็ sudo make install ซะ ก็ไม่มีอะไร
  • check version ซะหน่อย
    [rawitat@entropy rawitat]$ ruby -v
    ruby 1.8.6 (2007-03-13 patchlevel 0) [i686-darwin8.10.1]
    
  • น่าจะปกติ แต่ว่าพอเรียก irb ปุ๊บ
    [rawitat@entropy rawitat]$ irb
    dyld: NSLinkModule() error
    dyld: Symbol not found: _rl_clear_signals
      Referenced from: /usr/local/lib/ruby/1.8/i686-darwin8.10.1/readline.bundle
      Expected in: flat namespace
    
    Trace/BPT trap
    [rawitat@entropy rawitat]
    

เฮ้ย อะไรเนี่ย!!!!!

ไม่เป็นไรๆ ไม่ต้อง panic มันต้องมีคนเจอปัญหานี้ก่อนหน้าเราบ้างล่ะน่า ว่าแล้วเราก็ลอง search google ดูหน่อย อืมม มันไม่มีคนเจอปัญหาเดียวกันเป๊ะๆ แฮะ เจอแต่ใกล้เคียงมากๆ เพราะว่าชาวบ้านเค้าเจอ _rl_filename_completion_function กัน แต่ว่าเราดันเจอ _rl_clear_signals แทน

อืมมมๆ ไม่เป็นไรๆ ลองทำตามวิธีแก้ปัญหาของเขาดูก็แล้วกัน

  • วิธีนี้ เคยใช้ได้ผลมาแล้วตอนลง 1.8.5 (แล้วทำไมตอนนั้นไม่ได้ blog ไว้ก็ไม่รู้) ก็คือให้ไป rebuild readline.bundle ใหม่ แล้วก็ copy ไปลงที่ปกติมันเก็บ readline.bundle ไว้ แต่ว่าคราวนี้ ล้มเหลว
  • วิธีนี้ ก็คือวิธีเดียวกัน แต่ว่า verbose หน่อย ไม่ต้องบอกก็รู้ว่าผลเป็นไง
  • วิธีนี้ ให้แก้ rbconfig.rb ไปเพิ่ม -lreadline ใน CONFIG[“LIBS”] ก็ลองแล้ว สรุปว่า ล้มเหลว เหมือนกัน

ทำไงดีหว่า อืมมมมม เริ่ม panic นิดหน่อย ผิวปากกลบเกลื่อนๆ

  • เริ่มมั่ว เอา readline 5.1 มาลงใหม่ (ตอนแรกใช้ 5.2 อยู่ แต่ว่าเห็นตาม web มันยังเขียน 5.1 อยู่ เออ ไม่เสียหลายน่า)… ไม่เวิร์ก
  • มั่วต่อไป ลง readline 5.2 อีกทีเด๊ะ …. ไม่ได้อยู่ดี (มันควรจะได้มั้ยล่ะนั่นน่ะ ไอ้บ้า)
  • เฮ้ย …..​ configure, build ruby ใหม่อีกรอบ (สิ้นคิด เมื่อกี้มันไม่ work คราวนี้มันจะ work ได้ไง) ก็ ไม่ได้

เฮ้อ เหนื่อย…..​ ทำไงดีหว่า พอดีเหลือบไปเห็น

 Referenced from: /usr/local/lib/ruby/1.8/i686-darwin8.10.1/readline.bundle

ใน error message ก็เลยลอง cd เข้าไปเล่นดู (อีกที จริงๆ เข้าไปหลายครั้งแล้ว) ก็เห็นว่านอกจาก i686-darwin8.10.1 แล้ว ข้างในนั้นยังมี i686-darwin8.9.1 ด้วย ก็เลยลองเข้าไปดู …… ก็เห็น readline.bundle อยู่ตัวนึง คงเป็นตัวที่เรา build ครั้งก่อนๆ หน้าโน้น (ไม่รู้เมื่อไหร่ ก็ตั้งแต่ darwin 8.9.1 น่ะแหละ ตอนนี้ใช้ darwin 8.10.1 อยู่) ……​

ก็ในเมื่อ rebuild readline.bundle ใหม่ (configure ใหม่แล้วนะ) แล้วก็ replace มันตามวิธีที่ linkๆ ไปให้ใน link ข้างบนแล้วไม่ work ลองบ้านนอกดูเด๊ะ

sudo cp /usr/local/lib/ruby/1.8/i686-darwin8.9.1/readline.bundle \
   /usr/local/lib/ruby/1.8/i686-darwin8.10.1/readline.bundle

……
……. แล้ว

[rawitat@entropy rawitat]$ irb
irb(main):001:0> 

ดันได้ซะงั้นอ่ะ ………. เนี่ย ถ้าไม่เคย build ไว้เลย ไม่รู้จะทำไมนะเนี่ย ไม่รู้มันไปติดตรงไหนแล้ว (ตอน configure ที่จะ rebuild readline.bundle มันก็ check เจอนะ ไอ้ _rl_clear_signals เนี่ย …​ไม่รู้ว่าทำไมเวลาจริงมัน ref ไม่ได้)

เอวัง