Re: [CMake] How to set environment variables with spaces in commands
On Thu, Dec 10, 2015 at 4:38 AM, Ruslan Baratovwrote: > 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 Interesting, good to know that it's actually a missing feature instead of me trying to do something dumb ;) hunter is a pretty cool project! I will read through the code and see how it works around this issue. -- 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
Re: [CMake] How to set environment variables with spaces in commands
On Wed, Dec 9, 2015 at 9:52 PM, Attila Krasznahorkaywrote: > 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 Thanks Attila for the tip. In fact, since you are already constructing the command as a string, why not just run it through sh? CONFIGURE_COMMAND sh “cd someDir/; CC=\”something\” ./configure” -- 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
Re: [CMake] How to set environment variables with spaces in commands
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 Houwrote: 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 -- 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
Re: [CMake] How to set environment variables with spaces in commands
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 Baratovwrote: > > 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 >>> 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: >>>
[CMake] How to set environment variables with spaces in commands
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
Re: [CMake] How to set environment variables with spaces in commands
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. 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 Houwrote: > > 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 -- 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