[CMake] CMake 3.11: Gives wrong paths to ar/strip/etc. when overridden
Paul Smith
paul at mad-scientist.net
Thu Jun 14 01:05:11 EDT 2018
I've discovered that CMake is not correctly locating ar/strip/etc. if I
override the names of these tools on the command line. I've tried this
with 3.5.2 as well and I get the same incorrect behavior.
Here's an example (this is on a GNU/Linux system):
$ type -a my-ar
/work/bin/my-ar
$ my-ar --version | head -n1
GNU ar (GNU Binutils) 2.30
$ pwd
/tmp/obj
$ cat ../CMakeLists.txt
PROJECT(foobar)
CMAKE_MINIMUM_REQUIRED(VERSION 3.0)
$ cmake --version | head -n1
cmake version 3.11.3
$ cmake -DCMAKE_AR=my-ar ..
...
$ grep CMAKE_AR CMakeCache.txt
CMAKE_AR:FILEPATH=/tmp/obj/my-ar
//ADVANCED property for variable: CMAKE_AR
CMAKE_AR-ADVANCED:INTERNAL=1
Note how, instead of either using just "my-ar" or else the fully-
qualified path "/work/bin/my-ar", CMake uses the bogus and completely
non-existent path "/tmp/obj/my-ar". This causes my builds to fail,
obviously.
I tried enabling debug-output, trace, and trace-expand but there are no
clues there as to why CMake prefixes these paths with the local object
directory.
I should note that resetting the C and C++ compilers works:
* -DCMAKE_C_COMPILER=my-gcc --> CMAKE_C_COMPILER=/work/bin/my-gcc
* -DCMAKE_CXX_COMPILER=my-g++ --> CMAKE_CXX_COMPILER=/work/bin/my-g++
But all the other bintools variable overrides do the wrong thing:
* -DCMAKE_AR=my-ar --> CMAKE_AR=/tmp/obj/my-ar
* -DCMAKE_LINKER=my-ld --> CMAKE_LINKER=/tmp/obj/my-ld
* -DCMAKE_RANLIB=my-ranlib --> CMAKE_RANLIB=/tmp/obj/my-ranlib
* -DCMAKE_STRIP=my-strip --> CMAKE_STRIP=/tmp/obj/my-strip
* -DCMAKE_OBJCOPY=my-objcopy --> CMAKE_OBJCOPY=/tmp/obj/objcopy
Can anyone explain this, and hopefully help me find a way to fix it?
Am I just doing variables wrong here? How should I do it?
Thanks!
More information about the CMake
mailing list