change default compiler on osx from llvm-g++ to g++ - c++

I'd like to change my default compiler from llvm-g++ to g++ on osx, whats the cleanest/simplest way to do this?

There is no “default” compiler as such. The operating system is compiler unaware. Tools will choose different compilers depending on different factors. Xcode for instance can be configured to use a different default compiler.
If, on the other hand, you want to configure your terminal to use a different default compiler, simply adjust the $PATH variable so that your GCC installation is found before your LLVM installation. In the simplest case, this can be done by adding the following line to your $HOME/.bashrc file (assuming you are using bash as the shell):
export PATH=path/to/gcc/:$PATH
(After that you need to reload your shell before the changes take effect.)

Related

Show compiler info in Bazel

I am trying to report a bug for a project using Bazel. As part of the issue report I would like to include information about the used C++ compiler.
Which command can I use to do so?
bazel build -s //the_target shows me that external/local_config_cc/wrapped_clang seems to be the compiler. In bazel-<project>/... I can find that path, but running the executable wrapped_clang in there, just leads to an abort.
This answer only applies if you're using Bazel autoconfigured C++ toolchain. If you don't you'll have to modify it.
So for debugging the best would be to zip entire local_config_cc and also to provide version of the compiler ($CC --version). You get the local_config_cc at:
`bazel info output_base`/external/local_config_cc
Path to the compiler is written into the wrapped_clang script in case of the toolchain that supports both C++ and ObjC (this one gets enabled when Xcode is properly detected). C++ only toolchain invokes compiler directly (but the CROSSTOOL file can still be useful for debugging). And just in case, you can force C++ only toolchain by setting BAZEL_USE_CPP_ONLY_TOOLCHAIN=1 environment variable.

How to set c++ compiler on OS X with bazel?

How can you tell bazel to use a different C++ compiler on OS X?
bazel build --action_env CC=/path/to/compiler //:target
works on linux.
But -s shows that bazel always runs with external/local_config_cc/wrapped_clang (clang) on OSX regardless of what CC is.
CC correctly works only when you use the C++-only toolchain. If you have Xcode installed, bazel will detect this and automatically pick a different toolchain, the one that supports both C++ and ObjC. This toolchain can only use Xcode-provided clang.
This is unfortunate and I propose two solutions:
File a feature request for bazel to make it possible to select which toolchain is used. This will allow you to tell bazel that even though you have Xcode installed, you want to use C++ only toolchain with a custom compiler. This is quite simple and doable in a short time.
File a feature request for bazel to make it possible to select which compiler is used with C++/ObjC toolchain. I cannot comment on viability of this, I know next to nothing about osx, and I have no idea if it makes any sense to compile ObjC with a compiler that is not provided with Xcode...
Actually with the latest version of bazel specifying
BAZEL_USE_CPP_ONLY_TOOLCHAIN=1
build --action_env CC=/path/to/compiler [...]
does work, in the sense that the specified compiler is used. However there is still a problem with the compiler flags. If the compiler flags of the old compiler are incompatible with the new one, there is a problem. I still have to find out how to change compiler flags.
Use --crosstool_top.
See also --host_crosstool_top and --apple_crosstool_top.

How do I force cmake to use cl.exe without full path?

I am building an open source project (kst, v2.0.8) that uses CMake. I am using CMake v2.8.12.2 and MSVC 2008 as a compiler and am generating NMake makefiles to build it on the command line. I can get it to build successfully with this setup. These versions are mandated so I cannot currently use a later version of CMake or MSVC.
I need to be able to perform a source code analysis of kst using HP's Fortify and to be able to use it from the command line it works in one of two ways:
Touchless mode where it creates it's own "cl.exe", sets the path to it before the path to the real cl.exe and therefore gets launched during build.
Set the compiler in the makefile to the Fortify command line, e.g. sourceanalyzer -b build_id cl instead of cl.
Either way I need to force the compiler that cmake generates into its makefiles to be something that cmake does not automatically detect.
I've tried setting the compiler when running cmake following the same method in this question but cmake still insists on putting the full path to the MSVC cl.exe in the makefiles.
cmake -DCMAKE_C_COMPILER=cl -DCMAKE_C_COMPILER_FORCED=ON -DCMAKE_CXX_COMPILER=cl -DCMAKE_CXX_COMPILER_FORCED=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=%CFITSIO_DIR% -G"NMake Makefiles" ..\cfit3250
I also tried setting the compiler to invoke Fortify but when cmake tests the compiler it fails saying that it cannot find the compiler. (I have also tried this without the FORCED=ON arguments and in that case it says the compiler fails.)
cmake -DCMAKE_C_COMPILER="sourceanalyzer -b %BUILDID% cl" -DCMAKE_C_COMPILER_FORCED=ON -DCMAKE_CXX_COMPILER="sourceanalyzer -b %BUILDID% cl" -DCMAKE_CXX_COMPILER_FORCED=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=%CFITSIO_DIR% -G"NMake Makefiles" ..\cfit3250
I could probably search and replace all the compiler invocations in the makefiles but I'd have to remember to do that after every cmake, and it would be tedious seeing as there are multiple projects / makefiles / calls to cl (rather than defining a CC variable in the makefile). I'd rather have a way to make cmake use the desired compiler right from the offset.
UPDATED: Testing showed the original suggested approach didn't work as expected on at least some platforms. It seems using a wrapper script is likely the way to go.
If you really want to force a particular compiler and by-pass CMake's compiler checks, the CMakeForceCompiler module may be what you are looking for. That link to the CMake docs contains a trivial toolchain file example which shows how to use a specific compiler invoked as a simple command with no path. Unfortunately, CMake still converts this to an absolute path, so on its own, this won't solve your problem. You could, however, use a toolchain file to point at a wrapper script and use CMakeForceCompiler to bypass the compiler checks. This combination should yield the behaviour you've asked for, but note that CMakeForceCompiler is now deprecated.
Note that when using the CMakeForceCompiler module, you take on a bit more responsibility for telling CMake information, notably the compiler ID of the particular compiler you want to force using, but from the CMake docs it seems pretty clear this will just be MSVC in your case.
To use a toolchain file, invoke CMake with a -DCMAKE_TOOLCHAIN_FILE=path/to/file option pointing at your own custom toolchain file. The CMake docs have a specific section covering the use of toolchains, although it does gloss over some of the important nitty gritty details.
As mentioned in #Tsyvarev's comment, the use of a wrapper script is likely to be your best way of dealing with this. That wrapper script just needs to forward the call to the usual compiler command without specifying a path. You then take responsibility for ensuring the command will be on your PATH when you do a build. Something as simple as the following should suffice as a wrapper batch file on Windows (untested):
cl %*
Now, you can control whether the Visual Studio compiler or Fortify gets invoked purely by the PATH the build sees. Personally, I think this is a bit fragile, but it's what you asked for. ;)
As a more robust alternative, is it possible to use two completely separate builds? If so, then I'd recommend that as a better alternative. Build one with the default Visual Studio compiler as normal and for the other build, use a toolchain file to point at the Fortify compiler to get CMake to bypass its compiler checks. That way you aren't relying on the build environment being set up a particular way.

How to enable SSE/SSE2 on Code::Blocks?

So I was trying to compile some code (Bullet Physics demos to be specific), and an error came up that said SSE and SSE2 were not enabled. I checked the compiler flags in Code::Blocks, and SSE/SSE2 were not on there. I tried to put the flags in "other options" instead (-msse, -msse2) and that did not work.
Then I saw a post here on stackoverflow that said to try "-march=native", which I did. That did not work either.
I am using G++ (MinGW) to compile, and I am on Windows 7 x64.
If it means anything, the project is using a custom makefile.
To make this work, you need to have march set to something that supports SSE2 (say, Pentium4 or Core2, in your case "native" might also do since you're running on x86_64, but I've never used "native") and enable SSE2 via -msse2.
But: Since you use a custom makefile, you must do this in your makefile or you must use environment variables (forget environment vars, I just looked, and it seems you can control pretty much everything via these, except target/optimization options).
Code::Blocks sets compiler options when you compile from a project file, but not when using a custom makefile. With a custom makefile, it is assumed that you know what you're doing and that the makefile "works correctly".
Worded differently, you can set any options you like, they won't have any effect as long as you use a cutom makefile.

llvmc: Can't find program 'llvm-g++'

I am getting this error while using the command "llvmc -O3 -Wall hello.cpp" where hello.cpp is some cpp file on my machine. llvmc is the driver calling a bunch of tools like llvm-g++, opt, llc etc. I think the llvmc tool could not probably locate the llvm-g++ tool. I would like to know where should I specify the path to llvm-g++ for llvmc to find them. Also can someone give me the link to some tutorial on llvmc because i couldn't find it on llvm.org webpage. My llvmc is in /llvm/tools/llvmc. While llvm-g++ is inside /llvm/Debug/bin/.
thanks.
IIRC, llvmc just use your PATH environment variable, so you should set it to /path/to/llvm/Debug/bin:$PATH
Also take a look at llvmc --help output, there should be a flag to set path to llvm-g++.
Be aware that llvmc have been removed in LLVM 3.0.
If you are not restricted to gcc frontend, try to compile with clang . clang uses llvm as backend as well (so you can --emit-llvm if you like).
If you cannot use clang, you might want to use DragonEgg at llvm