[CMake] How to set environment variables with spaces in commands
Ruslan Baratov
ruslan_baratov at yahoo.com
Thu Dec 10 07:38:04 EST 2015
On 10-Dec-15 12:52, Attila Krasznahorkay wrote:
> Hi QP,
>
> Probably not the intended solution, but what I’m doing in such cases is that in a patch step I create a shell script that does the configuration for me. With all the environment settings and everything. Like:
>
> PATCH_COMMAND ${CMAKE_COMMAND} -E echo “cd someDir/; CC=\”something\” ./configure” > configure.sh
> CONFIGURE_COMMAND sh configure.sh
...
> Unfortunately this makes the code quite unportable, as it will only work on POSIX platforms like this.
Even on *nix platforms such code will not always works as expected. As
documentation states
(https://cmake.org/cmake/help/v3.4/module/ExternalProject.html):
Behavior of shell operators like |&&| is not defined.
I've hit this on practice by using `LOG_* 1` feature. You can try this
example (I've moved PATCH_COMMAND to CONFIGURE_COMMAND since there is no
LOG_PATCH option):
https://gist.github.com/ruslo/e8c7be03521f167ae8f0
Result:
[ 62%] Performing configure step for 'Foo'
cd /.../Foo-prefix/src/Foo-build && /.../cmake -P
/.../Foo-prefix/src/Foo-stamp/Foo-configure-.cmake
CMake Error at /.../Foo-prefix/src/Foo-stamp/Foo-configure-.cmake:16
(message):
Command failed: 1
The reason of the failure is because CMake collect all arguments into
one command and run execute_process:
set(command "/.../cmake;-E;echo;cd ..;>;configure.sh")
execute_process(COMMAND ${command} RESULT_VARIABLE result)
which of course doesn't make sense.
This makes writing ExternalProject_Add steps with modification of
environment quite non-trivial task (at least doing it correctly). This
feature definitely missing in CMake. I've mentioned it once already:
https://cmake.org/pipermail/cmake-developers/2015-August/026053.html
but I've changed my mind about the approach because of LOG_* issue. Now
I do the next:
* wrap each step with CMake script, i.e. instead of `CC=something
./configure` do
set(ENV{CC} "something")
execute_process(COMMAND ./configure ...)
* run CMake script in *_COMMAND:
CONFIGURE_COMMAND
"${CMAKE_COMMAND}" -P "/path/to/configure.cmake"
This makes it cross-platform and *_LOG friendly but require more tricks.
Like if you're building in source (non-cmake packages) you have to copy
script before execution since CMake will remove source directory on
DOWNLOAD step. Which makes it looks like this:
CONFIGURE_COMMAND
"${CMAKE_COMMAND}" -E copy "/path/to/source/configure.cmake"
"/path/to/unpacked/configure.cmake"
COMMAND
"${CMAKE_COMMAND}" -P "/path/to/unpacked/configure.cmake"
PS I'm hitting problems in ExternalProject with environment variables
all the time. E.g. at this moment fixing MinGW + Boost:
https://github.com/ruslo/hunter/pull/273
Ruslo
> But I guess that’s the case anyway once you start setting environment variables.
>
> Cheers,
> Attila
>
> P.S. I often create build.sh and install.sh scripts as well in additional patch commands.
>
>> On Dec 10, 2015, at 5:35 AM, Qingping Hou <dave2008713 at gmail.com> wrote:
>>
>> Hi all,
>>
>> I am trying to setup an ExternalProject in cmake but got stuck in the
>> configuration step. I am using ccache to speed up the compilation:
>>
>> ```
>> ExternalProject_Add(
>> ...
>> CONFIGURE_COMMAND CC="ccache arm-linux-gnueabihf-gcc" ./configure
>> ...
>> )
>> ```
>>
>> However, when cmake generates the Makefile, it moves the quotes around
>> and breaks the command:
>>
>> ```
>> "CC=ccache arm-linux-gnueabihf-gcc" ./configure
>> ```
>>
>> I have tried various escaping method to try to get it work properly
>> without any luck. Is this a bug or an unintended feature?
>>
>> Thanks,
>> QP
>> --
>>
>> Powered by www.kitware.com
>>
>> Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ
>>
>> Kitware offers various services to support the CMake community. For more information on each offering, please visit:
>>
>> CMake Support: http://cmake.org/cmake/help/support.html
>> CMake Consulting: http://cmake.org/cmake/help/consulting.html
>> CMake Training Courses: http://cmake.org/cmake/help/training.html
>>
>> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
>>
>> Follow this link to subscribe/unsubscribe:
>> http://public.kitware.com/mailman/listinfo/cmake
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20151210/9d6a9050/attachment.html>
More information about the CMake
mailing list