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 <dave2008...@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

-- 

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

Reply via email to