Skip to content
  • Brad King's avatar
    ExternalData: Preserve escaped semicolons during argument expansion · 1823ab4d
    Brad King authored
    
    
    The CMake language implicitly flattens lists so a ";" in a list element
    must be escaped with a backslash.  List expansion removes backslashes
    escaping semicolons to leave raw semicolons in the values.  Teach
    ExternalData_Add_Test and ExternalData_Expand_Arguments to re-escape
    semicolons found in list elements so the resulting argument lists work
    as if constructed directly by the set() command.
    
    For example:
    
      ExternalData_Add_Test(Data NAME test1 COMMAND ... "a\\;b")
      ExternalData_Expand_Arguments(Data args2 "c\\;d")
      add_test(NAME test2 COMMAND ... ${args2})
    
    should be equivalent to
    
      set(args1 "a\\;b")
      add_test(NAME test1 COMMAND ... ${args1})
      set(args2 "c\\;d")
      add_test(NAME test2 COMMAND ... ${args2})
    
    which is equivalent to
    
      add_test(NAME test1 COMMAND ... "a;b")
      add_test(NAME test2 COMMAND ... "c;d")
    
    Note that it is not possible to make ExternalData_Add_Test act exactly
    like add_test when quoted arguments contain semicolons because the CMake
    language flattens lists when constructing function ARGN values.  This
    re-escape approach at least allows test arguments to have semicolons.
    
    While at it, teach ExternalData APIs to not transform "DATA{...;...}"
    arguments because the contained semicolons are non-sensical.
    
    Suggested-by: default avatarJean-Christophe Fillion-Robin <jchris.fillionr@kitware.com>
    1823ab4d