If I try to run
make build on RHEL 6, I get the following errors:
clang++ -Wall -I . -isystem stan/lib/stan_math/lib/eigen_3.3.3 -isystem stan/lib/stan_math/lib/boost_1.64.0 -isystem stan/lib/stan_math/lib/cvodes_2.9.0/include -std=c++1y -DBOOST_RESULT_OF_USE_TR1 -DBOOST_NO_DECLTYPE -DBOOST_DISABLE_ASSERTS -DBOOST_PHOENIX_NO_VARIADIC_EXPRESSION -I src -I stan/src -isystem stan/lib/stan_math/ -DEIGEN_NO_DEBUG -DFUSION_MAX_VECTOR_SIZE=12 -stdlib=libc++ -Wno-unused-function -Wno-uninitialized -DNO_FPRINTF_OUTPUT -pipe -c -O3 -o bin/cmdstan/stanc.o src/cmdstan/stanc.cpp make: clang++: Command not found make: *** [bin/cmdstan/stanc.o] Error 127
The immediate reason for the error is obvious: I don’t have clang++. The problem is why the build process is even invoking clang++ in the first place.
It looks like the makefile setup is buggy. In the top level makefile, the variable
CC is set to
g++, but after that, the makefile includes the file
stan/lib/stan_math/make/default_compiler_options which sets
clang++, making the original initialization of
CC completely pointless. The file
stan/lib/stan_math/make/detect_cc doesn’t seem to make much sense either. It apparently tries to detect the C++ compiler by looking for strings in the variable
CC, but either the user has already set
CC, in which case detection already falls on the user, or the “detection” just regurgitates the default. It’s not like there’s any attempt to see if a compiler executable is in some path or the like.
This is also not a one-time problem affecting the build. Any time I need to compile a Stan file, I’d need to do
make CC=my-compiler path/to/stan_file.
(There’s also the questionable decision to set
CC to be the name of a C++ compiler, even though
CC is a variable often traditionally set to a C compiler, especially on Linux clusters.)
In any case, compiler detection seems to be a mess. As a “chicken wire and duct tape” fix, I suggest removing the variables
stan/lib/stan_math/make/default_compiler_options. That way, at least if the end user sets those variables in the top-level makefile, they’ll actually do what it looks like they’re supposed to do.