[Work/TechInfo/other]

ソースからインストールしたNode.jsのPREFIXにシンボリックリングがある場合のmake uninstall / 2017-01-04 (水)

自分の環境ではホーム以下にシンボリックリンクが多い

自分の環境は,どのOSでも「~/Utils」以下にbin, etc, lib, include, share, src, site-lisp, libexec, info等のシンボリックリンクがあり,これが「~/Dropbox/Utils/OSX/bin」「~/Dropbox/Utils/Windows/bin」などOSごとに作ってあるディレクトリの実体へ張られている.

つまり,Dropbox以下に自分が必要なツールは基本全て入っていて,そこからそのマシンに必要なUnixファイルツリーをシンボリックリンクで貼ってくる,という形をとっている. (dotfilesも~/Dropbox/Utils/Dotfiles/(例えば).bashrcに実体があり,~/.bashrcはシンボリックリンク..bashrc内部で各OSやマシンごとに条件分岐させている.)

そのため,ソースからmake installする場合(OSXでもbrewなどは使わないため,わりと多い),

$ cd ~/Utils/src/node-v0.12.1
$ ./configure --prefix="/Users/daichi/Utils"

という感じで~/Utils以下をprefixとして,makeしてmake installする.

Node.jsはmake installでpythonスクリプトを呼んでいる

ところがNode.jsの場合,make installやmake uninstallの内部ではpythonスクリプトを呼び出している.make install時には何も問題が起きないが,make uninstallしようとしたら,

myMac:~/Utils/src/node-v0.12.1 daichi$ make uninstall
/usr/bin/python tools/install.py uninstall '' '/Users/daichi/Utils'
removing /Users/daichi/Utils/bin/node
Traceback (most recent call last):
  File "tools/install.py", line 202, in 
    run(sys.argv[:])
  File "tools/install.py", line 198, in run
    if cmd == 'uninstall': return files(uninstall)
  File "tools/install.py", line 130, in files
    action(['out/Release/node'], 'bin/node')
  File "tools/install.py", line 80, in uninstall
    def uninstall(paths, dst): map(lambda path: try_remove(path, dst), paths)
  File "tools/install.py", line 80, in 
    def uninstall(paths, dst): map(lambda path: try_remove(path, dst), paths)
  File "tools/install.py", line 77, in try_remove
    try_rmdir_r(os.path.dirname(target_path))
  File "tools/install.py", line 52, in try_rmdir_r
    os.rmdir(path)
OSError: [Errno 20] Not a directory: '/Users/daichi/Utils/bin'
make: *** [uninstall] Error 1

make uninstallから呼ばれているPythonスクリプトに怒られた.  

どうやらOSXにおいては,シンボリックリンクはPythonにとってディレクトリじゃないらしい.

解決法 シンボリックリンクを含まないフルパスでconfigureし直す

いかんせん内部でpythonスクリプトが呼ばれているため,シンボリックリンクを含まないフルパスでconfigureし直してmake uninstallできるか確証は無かったが,

$ ./configure —prefix =“/Users/daichi/Dropbox/Utils/OSX”
$ make uninstall

で無事にmake uninstallが通った.