[cmake-developers] CMAKE_ARGC and CMAKE_ARGVx

Alexander Neundorf neundorf at kde.org
Thu Apr 28 14:50:36 EDT 2011


On Thursday 28 April 2011, Nicolas Desprès wrote:
> 2011/4/28 David Cole <david.cole at kitware.com>:
> > 2011/4/28 Nicolas Desprès <nicolas.despres at gmail.com>
> >
> >> 2011/4/27 Alexander Neundorf <neundorf at kde.org>:
> >> > On Wednesday 27 April 2011, Nicolas Desprès wrote:
> >> >> Hi,
> >> >>
> >> >> I'm experimenting with the variables available in script mode in the
> >> >> current master (a3a581f8cd):
> >> >>
> >> >> CMAKE_SCRIPT_MODE_FILE
> >> >> CMAKE_ARGC
> >> >> CMAKE_ARGVx
> >> >>
> >> >> Apparently they are not available in 2.8.4 yet.
> >> >>
> >> >> Using this test script:
> >> >>
> >> >> ##################
> >> >> message("Begin")
> >> >> message("CMAKE_SCRIPT_MODE_FILE=${CMAKE_SCRIPT_MODE_FILE}")
> >> >> message("CMAKE_ARGC=${CMAKE_ARGC}")
> >> >> foreach(i RANGE 0 ${CMAKE_ARGC})
> >> >>   message("CMAKE_ARGV${i}=${CMAKE_ARGV${i}}")
> >> >> endforeach(i)
> >> >> message("CMAKE_ARGV=${CMAKE_ARGV}")
> >> >> message("CMAKE_ARGN=${CMAKE_ARGN}")
> >> >> message("End")
> >> >> #################
> >> >>
> >> >> I have the following behavior:
> >> >>
> >> >> $ ~/build/cmake/git/_build/bin/cmake -P /tmp/test.cmake a1 a2
> >> >> Begin
> >> >> CMAKE_SCRIPT_MODE_FILE=/tmp/test.cmake
> >> >> CMAKE_ARGC=5
> >> >> CMAKE_ARGV0=/home/despre_n/build/cmake/git/_build/bin/cmake
> >> >> CMAKE_ARGV1=-P
> >> >> CMAKE_ARGV2=/tmp/test.cmake
> >> >> CMAKE_ARGV3=a1
> >> >> CMAKE_ARGV4=a2
> >> >> CMAKE_ARGV5=
> >> >> CMAKE_ARGV=
> >> >> CMAKE_ARGN=
> >> >> End
> >> >>
> >> >> I think the user does not care about having CMAKE_ARGV1=-P and
> >> >> CMAKE_ARGV2=/tmp/test.cmake
> >> >> I have attached a patch that do this behavior:
> >> >>
> >> >> $ ~/build/cmake/git/_build/bin/cmake -P /tmp/test.cmake a1 a2
> >> >> Begin
> >> >> CMAKE_SCRIPT_MODE_FILE=/tmp/test.cmake
> >> >> CMAKE_ARGC=2
> >> >> CMAKE_ARGV0=a1
> >> >> CMAKE_ARGV1=a2
> >> >> CMAKE_ARGV2=
> >> >> CMAKE_ARGV=
> >> >> CMAKE_ARGN=
> >> >> End
> >> >
> >> > I'm not sure I like this special handling.
> >> > See this example:
> >> > $ /opt/cmake-HEAD/bin/cmake -DFOO=TRUE -P test.cmake abc 123
> >> > Begin
> >> > CMAKE_SCRIPT_MODE_FILE=/home/alex/src/tests/cmakeargs/test.cmake
> >> > CMAKE_ARGC=6
> >> > CMAKE_ARGV0=/opt/cmake-HEAD/bin/cmake
> >> > CMAKE_ARGV1=-DFOO=TRUE
> >> > CMAKE_ARGV2=-P
> >> > CMAKE_ARGV3=test.cmake
> >> > CMAKE_ARGV4=abc
> >> > CMAKE_ARGV5=123
> >> > CMAKE_ARGV6=
> >> > CMAKE_ARGV=
> >> > CMAKE_ARGN=
> >> > End
> >> >
> >> >
> >> > I think it's ok to just hand all the arguments to the cmake script, so
> >> > it can
> >> > look at everything and figure out what to do.
> >>
> >> You score a point :-) But then command line arguments parsing starts
> >> to be tedious from the script point of view.
> >> Plus in your use case FOO will be set as a variable anyway so the
> >> script can picked it up from the cache. Actually, most of the cmake's
> >> options will have side effects of this type. Even the script name is
> >> made available as CMAKE_SCRIPT_MODE_FILE. The script will have to
> >> parse cmake's options that have already been parsed by cmake. I don't
> >> see any reason to pass these options to the script.
> >>
> >> Imagine something like that:
> >> $ cmake -DFOO=ON -Wdev --trace --debug-output --debug-trycompile
> >> --warn-uninitialized --warn-unused-vars -P test.cmake a1 a2
> >>
> >> I truely think the script writer don't want to hear about all the
> >> options before -P.
> >>
> >> --
> >> Nicolas Desprès
> >> _______________________________________________
> >> cmake-developers mailing list
> >> cmake-developers at cmake.org
> >> http://public.kitware.com/cgi-bin/mailman/listinfo/cmake-developers
> >
> > For these to be really useful, we should also introduce the notion of
> > arguments that CMake will ignore. (i.e. : put a "--" at the end, and the
> > stuff after that gets ignored by CMake, and only passed on to the script
> > itself.) For example, in the above case, a1 and a2 may well trigger a
> > command line error from CMake itself. Perhaps even after the script has
> > run...
>
> I like the "--" idea.

AFAIK right now cmake simply ignores all arguments it doesn't know.
I think without changing this, which requires some serious work AFAIK, adding 
a "--" does not really make sense.

...
> I am very interested by this feature in the context of the generator
> for Ninja. Ninja accepts only one command per rule contrary to make.
> So when several commands must be called (for example: ar and ranlib),
> one possibility is to bundle the commands in a cmake scripts and to
> pass as arguments the value of $in and $out and other variables
> containing flags so that the script can be reused for linking other
> static libraries. If I cannot pass arguments to the script then I have

You know that you can pass variables into cmake scripts ?
cmake -DMY_VAR=whatever -Pmyscript.cmake
and in myscript.cmake MY_VAR will have the value "whatever".

Doesn't that work in this case ?

Alex



More information about the cmake-developers mailing list