[CMake] append command

Michael Hertling mhertling at online.de
Thu Aug 11 13:48:39 EDT 2011


On 08/11/2011 05:20 PM, Michael Wild wrote:
> On Thu 11 Aug 2011 04:46:44 PM CEST, David Cole wrote:
>> On Thu, Aug 11, 2011 at 7:29 AM, Glenn Coombs <glenn.coombs at gmail.com
>> <mailto:glenn.coombs at gmail.com>> wrote:
>>
>>     The problem is that we currently already have 2 parallel systems. 
>>     Some of the variables like CMAKE_EXE_LINKER_FLAGS are passed through
>>     as-is to the compiler or linker.  So, by definition, these variables
>>     are space separated lists of options.  Attempting to use
>>     list(APPEND) on them adds semicolon characters which causes breakage
>>     unless you manually remove them.
>>
>>     Using list(APPEND), followed by string(REGEX REPLACE) is even more
>>     verbose than just using the set(foo "${foo} ...") approach.  I see
>>     an append() command as just the equivalent of the += operator in
>>     C/C++ and don't think that adding it would necessarily require
>>     adding any more space separated list functionality.  And I agree
>>     that you wouldn't really want
>>
>>     An alternative approach (but harder to implement) would be to
>>     abandon space separated lists altogether.  Variables like
>>     CMAKE_EXE_LINKER_FLAGS would be stored as lists and then cmake would
>>     format them internally as space separated strings before passing
>>     them to the native build tools.  You might have to change the way
>>     cmake internally represents lists if you ever wanted to be able to
>>     pass options with semicolons through to the build tools.
>>
>>     --
>>     Glenn
>>
>>
>>
>>     On 9 August 2011 20:34, Alan W. Irwin <irwin at beluga.phys.uvic.ca
>>     <mailto:irwin at beluga.phys.uvic.ca>> wrote:
>>
>>         On 2011-08-09 17:19+0100 Glenn Coombs wrote:
>>
>>             Probably too late now and there isn't a bug filed so far as
>>             I know, but one thing I would love to see added to cmake is
>>             an append command
>>             so that lines like this:
>>
>>                 set(CMAKE_EXE_LINKER_FLAGS_ RELEASE
>>             "${CMAKE_EXE_LINKER_FLAGS_ RELEASE} /INCREMENTAL:NO")
>>
>>             become shorter and easier to understand:
>>
>>                 append(CMAKE_EXE_LINKER_FLAGS_ RELEASE "/INCREMENTAL:NO")
>>
>>             The existing syntax for the set command is just ugly when
>>             appending.  I know you can define a macro or function to do
>>             this but I just
>>             feel that it should be supported out of the box as it would
>>             make CMakeLists.txt files more readable.
>>
>>
>>         Hi Glenn:
>>
>>         I am changing the subject line to keep discussion out of the
>>         bugfix thread as requested by Dave.
>>
>>         It appears what you want is the list APPEND command for
>>         blank-delimited strings.  But then later someone will want to add
>>         other parts of the list functionality to blank-delimited strings as
>>         well such as removing items from the blank-delimited list.
>>          Until you
>>         have two parallel list systems, one for blank delimited strings and
>>         one for semicolon-delimited strings (i.e., the current lists).
>>
>>         I think most would reject the idea of having two parallel list
>>         systems
>>         with different delimiters so here is one possibility.
>>
>>         For now just stick to list functionality, e.g.,
>>
>>         list(APPEND CMAKE_EXE_LINKER_FLAGS_RELEASE "/INCREMENTAL:NO")
>>
>>         and then change the semicolon delimiters to blanks using
>>
>>         strings(REGEX REPLACE ...)
>>
>>         once you have the list completely assembled.  Of course, that
>>         will not
>>         work for the corner case where the strings contain semicolons. So in
>>         the long term, the right thing to do with lists might be to allow a
>>         choice of delimiter if you could do that in such a way as to
>>         preserve
>>         backwards compatibility.
>>
>>         Alan
>>         __________________________
>>         Alan W. Irwin
>>
>>         Astronomical research affiliation with Department of Physics and
>>         Astronomy,
>>         University of Victoria (astrowww.phys.uvic.ca
>>         <http://astrowww.phys.uvic.ca>).
>>
>>         Programming affiliations with the FreeEOS equation-of-state
>>         implementation
>>         for stellar interiors (freeeos.sf.net <http://freeeos.sf.net>);
>>         PLplot scientific plotting software
>>         package (plplot.org <http://plplot.org>); the libLASi project
>>         (unifont.org/lasi <http://unifont.org/lasi>); the Loads of
>>         Linux Links project (loll.sf.net <http://loll.sf.net>); and the
>>         Linux Brochure Project
>>         (lbproject.sf.net <http://lbproject.sf.net>).
>>         __________________________
>>
>>         Linux-powered Science
>>         __________________________
>>
>>
>>
>> Until somebody comes up with an approach that is reasonably acceptable
>> by consensus, we will keep things as they are. Please use the (verbose,
>> but easily understandable) current form for the foreseeable future:
>>
>>   set(xyz "${xyz} /newstuff")
>>
>> (I am personally adamantly opposed to an actual "append" command because
>> of the existence of the "list(APPEND" feature... I think "append" will
>> cause even more confusion...)
>>
>>
>> Thanks,
>> David Cole
>> Kitware, Inc.
> 
> How about
> 
> string(APPEND " /newstuff" xyz)
> 
> It is not satisfactory in that it doesn't follow the semantics of all 
> the other string(...) commands which never modify their input.
> 
> Michael

As David has implied, "APPEND" is usually associated with lists, cf.
LIST(APPEND ...) and SET_PROPERTY(... APPEND ...), so I'd prefer to
name this subcommand "CONCAT", e.g.

STRING(CONCAT <output variable> [SEP <sep>] <input> ...)

which is to be equivalent to

SET(<output variable> "${<output variable>}<sep><input>...")

with <sep> defaulting to a single space if it's unspecified.

Alternatively, one might consider to introduce a new, say,
modifier "CONCAT" for the SET() command, e.g.

SET(<variable> <value> ... CONCAT [SEP <sep>])

equivalent to

SET(<variable> "${<variable>}<sep><value>...")

again with <sep> defaulting to a space. This would preserve the
STRING() command's strict distinction between input and output
variables. Anyway, I agree that this whole APPEND/CONCAT issue
isn't a serious problem but just a convenience feature.

Besides, David, due to the same reasons as mentioned above, the new
APPEND_STRING subcommand of SET_PROPERTY() is quite misnamed, IMO -
and quite long. Would it be possible to rename it to CONCAT before
it is released officially? In this way, we would consistently have
APPEND subcommands for list-style variables/properties and CONCAT
subcommands for string-style ones.

Regards,

Michael


More information about the CMake mailing list