[CMake] Need suggestions for implementation of new feature in cmake.

Carlo Wood carlo at alinoe.com
Fri Mar 27 00:53:39 EDT 2020


Hello!

I'm writing a patch for cmake to address
https://gitlab.kitware.com/cmake/cmake/issues/19703

but I need a little help; I'm only familiar with
GNU/Linux and single target generator Makefile.

In terms of a Makefile, if one uses ExternalProject_Add_Step, see

https://cmake.org/cmake/help/latest/module/ExternalProject.html#explicit-step-management

then something like this is generated:

    /path/to/stamp_dir/myname-mystep: /path/to/some/dependency
            @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) \
                --blue --bold \
                --progress-dir=/path/to/buildir/CMakeFiles \
                --progress-num=$(CMAKE_PROGRESS_9) "My Comment"
            cd /path/to/workingdir && \
                my_COMMAND my_arg1 my_arg2 ... \
            cd /path/to/workingdir && \
                cmake -E touch /path/to/stamp_dir/myname-mystep

Now, I'm not sure about the portability of the COMMAND that
is passed to ExternalProject_Add_Step. Are we assuming that
every operating system supports a POSIX (unix) shell, like bash?

Otherwise it seems that the only way to be portable is to run
cmake in script mode there.

Note how the last command does this: it runs cmake in order to portably
'touch' the target file (a stamp file).

What I need is way to generate a rule where depending on a
condition (to be decided by the COMMAND (my_COMMAND)) that
touch is or is not done.

In the single target target POSIX Makefile case this could look like
this (I'm leaving out the COMMENT here for brevity),

     /path/to/stamp_dir/myname-mystep: /path/to/some/dependency
            (cd /path/to/workingdir && \
                if my_COMMAND my_arg1 my_arg2 ...; then \
                  cmake -E touch /path/to/stamp_dir/myname-mystep; \
                fi)

which uses the return value of my_COMMAND to decide whether or
not to touch the stamp file.

However, this is pure shell coding: using a '(' to open a sub shell
and then using 'if ...; then ... fi'.

I'm looking for ideas on how to implement this in a portable way.

How can I extract a boolean from a user defined COMMAND and then
use that to conditionally execute the touch?

-- 
Carlo Wood <carlo at alinoe.com>


More information about the CMake mailing list