[Lldb-commits] [PATCH] D13234: Use the correct Python lib for each build configuration generated by the Visual Studio CMake generator

Vadim Macagon via lldb-commits lldb-commits at lists.llvm.org
Tue Sep 29 23:04:09 PDT 2015


enlight planned changes to this revision.
enlight added a comment.

I'll submit a revised patch that contains an explanation of the generator expressions to aid future maintainers/contributors.


================
Comment at: cmake/modules/LLDBConfig.cmake:61
@@ +60,3 @@
+      # below, otherwise CMake will replace the whitespace with a semicolon in some contexts (which would stuff things up).
+      set (PYTHON_EXECUTABLE $<$<CONFIG:Debug>:${PYTHON_DEBUG_EXE}>$<$<NOT:$<CONFIG:Debug>>:${PYTHON_RELEASE_EXE}>)
+      set (PYTHON_LIBRARY $<$<CONFIG:Debug>:${PYTHON_DEBUG_LIB}>$<$<NOT:$<CONFIG:Debug>>:${PYTHON_RELEASE_LIB}>)
----------------
zturner wrote:
> enlight wrote:
> > zturner wrote:
> > > This line is hard to parse mentally, and I'm not sure I've seen this kind of nested generator expression.  I trust you when you say it's right, but can you explain what this does?
> > Sure thing.
> > 
> >   # `$<CONFIG:Debug>` evaluates to `1` when the `Debug` configuration is being generated, or `0` in all other cases.
> >   # `$<$<CONFIG:Debug>:${PYTHON_DEBUG_EXE}>` expands to `${PYTHON_DEBUG_EXE}` when the `Debug` configuration is being generated, or nothing (literally) in all other cases.
> >   # `$<$<NOT:$<CONFIG:Debug>>:${PYTHON_RELEASE_EXE}>` expands to `${PYTHON_RELEASE_EXE}` when any configuration other than `Debug` is being generated, or nothing in all other cases.
> > 
> > Since the conditionals in 2 & 3 are mutually exclusive, and a conditional expression that evaluates to `0` yields no value at all, it's possible to concatenate them to obtain a single value. This value will be `${PYTHON_DEBUG_EXE}` when generating the Debug configuration, or `${PYTHON_RELEASE_EXE}` when generating any other configuration.
> Ahh, I understand.  Is it equivalent to write this:
> 
>     if ($<CONFIG:Debug> == 1)
>       set(PYTHON_EXECUTABLE ${PYTHON_DEBUG_EXE})
>     else()
>       set(PYTHON_EXECUTABLE ${PYTHON_RELEASE_EXE})
>     endif()
> 
> ?  If so, I kind of prefer this way, if nothing else so that other people will be able to understand it in the future if they go to edit this code.
Unfortunately that's not currently possible because the `if` command doesn't support generator expressions (not that the docs mention it or anything). So while CMake won't complain if you did this:

```
if ($<CONFIG:Debug>)
  set (PYTHON_EXECUTABLE ${PYTHON_DEBUG_EXE})
else ()
  set (PYTHON_EXECUTABLE ${PYTHON_RELEASE_EXE})
endif ()
```

It wouldn't actually work as intended because the `if/else` is only evaluated once during the configuration step rather than per-build-configuration (during the generation step).


Repository:
  rL LLVM

http://reviews.llvm.org/D13234





More information about the lldb-commits mailing list