[CMake] How to set environment variables with spaces in commands
Attila Krasznahorkay
attila.krasznahorkay at gmail.com
Thu Dec 10 08:24:14 EST 2015
Hi Ruslan,
Thanks, this is good to know.
I absolutely agree that one needs to avoid using "&&" in the commands themselves. As it also causes problems when you try to use CTEST_USE_LAUNCHERS=1. (I myself ran into that issue...)
But I did not have any issues so far with putting "whatever" into a shell script that I then later execute. This is how I got around not being able to use wildcards in some installation commands for instance.
However, I quite like your solution of using a CMake script instead of a *nix shell one. As that should be indeed much more portable. Even if my current project will not work on Windows for a lot of reasons anyway...
Cheers,
Attila
> On 10 Dec 2015, at 13:38, Ruslan Baratov <ruslan_baratov at yahoo.com> wrote:
>
> 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
>
More information about the CMake
mailing list