Repository: nvm
Issue: [Bug] nodejs on FreeBSD may need to be patched
Labels: OS: FreeBSD / OpenBSD,installing node,feature requests

This may be a hard work, I hope not.

FreeBSD version via `uname -a`:

> FreeBSD vm1 10.1-RELEASE-p19 FreeBSD 10.1-RELEASE-p19 #0: Sat Aug 22 03:55:09 UTC 2015     root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC  amd64

nvm version:

```
$ git -C ~/.nvm status
HEAD detached at v0.29.0
nothing to commit, working directory clean
```

I found that I cannot do `$ nvm install 0.12` on FreeBSD 10.1 amd64 with success, and the error messages came from compiler, both clang LLVM or gcc will have the same problem, and this is not nvm's problem but nvm looks to support FreeBSD in the codes:

https://github.com/creationix/nvm/blob/master/nvm.sh#L936

``` sh
nvm_get_os() {
  local NVM_UNAME
  NVM_UNAME="$(uname -a)"
  local NVM_OS
  case "$NVM_UNAME" in
    Linux\ *) NVM_OS=linux ;;
    Darwin\ *) NVM_OS=darwin ;;
    SunOS\ *) NVM_OS=sunos ;;
    FreeBSD\ *) NVM_OS=freebsd ;;
  esac
  echo "$NVM_OS"
}
```

https://github.com/creationix/nvm/blob/master/nvm.sh#L1230-L1233

``` sh
  if [ "_$NVM_OS" = "_freebsd" ]; then
    make='gmake'
    MAKE_CXX="CXX=c++"
  fi
```

So I think we should do something to work around.

The error message:

```
gmake -C out BUILDTYPE=Release V=1
gmake[1]: Entering directory '/net/gcs/104/0456096/.nvm/src/node-v0.12.7/out'
gmake[1]: Warning: File '../deps/v8/src/base/platform/platform-freebsd.cc' has modification time 34 s in the future
  c++ '-DV8_TARGET_ARCH_X64' '-DENABLE_DISASSEMBLER' -I../deps/v8  -pthread -Wall -Wextra -Wno-unused-parameter -m64 -fno-strict-aliasing -I/usr/local/include -O3 -ffunction-sections -fdata-sections -fno-omit-frame-pointer -fdata-sections -ffunction-sections -O3 -fno-rtti -fno-exceptions -MMD -MF /net/gcs/104/0456096/.nvm/src/node-v0.12.7/out/Release/.deps//net/gcs/104/0456096/.nvm/src/node-v0.12.7/out/Release/obj.target/v8_libbase/deps/v8/src/base/platform/platform-freebsd.o.d.raw  -c -o /net/gcs/104/0456096/.nvm/src/node-v0.12.7/out/Release/obj.target/v8_libbase/deps/v8/src/base/platform/platform-freebsd.o ../deps/v8/src/base/platform/platform-freebsd.cc
  c++ '-DV8_TARGET_ARCH_X64' '-DENABLE_DISASSEMBLER' -I../deps/v8  -pthread -Wall -Wextra -Wno-unused-parameter -m64 -fno-strict-aliasing -I/usr/local/include -O3 -ffunction-sections -fdata-sections -fno-omit-frame-pointer -fdata-sections -ffunction-sections -O3 -fno-rtti -fno-exceptions -MMD -MF /net/gcs/104/0456096/.nvm/src/node-v0.12.7/out/Release/.deps//net/gcs/104/0456096/.nvm/src/node-v0.12.7/out/Release/obj.target/v8_libbase/deps/v8/src/base/platform/platform-posix.o.d.raw  -c -o /net/gcs/104/0456096/.nvm/src/node-v0.12.7/out/Release/obj.target/v8_libbase/deps/v8/src/base/platform/platform-posix.o ../deps/v8/src/base/platform/platform-posix.cc
../deps/v8/src/base/platform/platform-posix.cc:330:10: error: static_cast from 'pthread_t' (aka 'pthread *') to 'int' is not allowed
  return static_cast<int>(pthread_self());
         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../deps/v8/src/base/platform/platform-freebsd.cc:159:11: error: member reference base type 'int' is not a structure or union
    result.push_back(SharedLibraryAddress(start_of_path, start, end));
    ~~~~~~^~~~~~~~~~
1 error generated.
deps/v8/tools/gyp/v8_libbase.target.mk:100: recipe for target '/net/gcs/104/0456096/.nvm/src/node-v0.12.7/out/Release/obj.target/v8_libbase/deps/v8/src/base/platform/platform-posix.o' failed
gmake[1]: *** [/net/gcs/104/0456096/.nvm/src/node-v0.12.7/out/Release/obj.target/v8_libbase/deps/v8/src/base/platform/platform-posix.o] Error 1
1 errorgmake[1]: *** Waiting for unfinished jobs....
 generated.
deps/v8/tools/gyp/v8_libbase.target.mk:100: recipe for target '/net/gcs/104/0456096/.nvm/src/node-v0.12.7/out/Release/obj.target/v8_libbase/deps/v8/src/base/platform/platform-freebsd.o' failed
gmake[1]: *** [/net/gcs/104/0456096/.nvm/src/node-v0.12.7/out/Release/obj.target/v8_libbase/deps/v8/src/base/platform/platform-freebsd.o] Error 1
gmake[1]: Leaving directory '/net/gcs/104/0456096/.nvm/src/node-v0.12.7/out'
Makefile:45: recipe for target 'node' failed
gmake: *** [node] Error 2
```

I remember that I installed it from ports and pkg with success before, so I copied the patch from FreeBSD's ports system
(https://www.freshports.org/www/node/files/patch-deps_v8_src_base_platform_platform-posix.cc)

> /usr/ports/www/node012/files/patch-deps_v8_src_base_platform_platform-freebsd.cc 
> /usr/ports/www/node012/files/patch-deps_v8_src_base_platform_platform-posix.cc 

Apply the patches:

```
 $ patch < patch-deps_v8_src_base_platform_platform-freebsd.cc
Hmm...  Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|--- deps/v8/src/base/platform/platform-freebsd.cc.orig 2015-03-31 22:13:01 UTC
|+++ deps/v8/src/base/platform/platform-freebsd.cc
--------------------------
Patching file deps/v8/src/base/platform/platform-freebsd.cc using Plan A...
Hunk #1 succeeded at 131.
Hunk #2 succeeded at 182.
Hunk #3 succeeded at 260.
Hunk #4 succeeded at 288.
done

$ patch < patch-deps_v8_src_base_platform_platform-posix.cc
Hmm...  Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|--- deps/v8/src/base/platform/platform-posix.cc.orig   2015-03-31 22:13:01 UTC
|+++ deps/v8/src/base/platform/platform-posix.cc
--------------------------
Patching file deps/v8/src/base/platform/platform-posix.cc using Plan A...
Hunk #1 succeeded at 327 (offset -1 lines).
done
```

After the patches applied, there is no problem anymore!