# Generator expression in ExternalProject\_Add() / CMAKE\_ARGS

**URL:** <https://discourse.cmake.org/t/generator-expression-in-externalproject-add-cmake-args/11111>\
**Category:** Code\
**Created:** [June 26, 2024, 1:34pm UTC](https://discourse.cmake.org/t/generator-expression-in-externalproject-add-cmake-args/11111 "2024-06-26T13:34:54Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Oodini](https://discourse.cmake.org/letter_avatar_proxy/v4/letter/o/db5fbb/32.png) [@Oodini](https://discourse.cmake.org/u/Oodini)\
**Post date:** [June 26, 2024, 1:34pm UTC](https://discourse.cmake.org/t/generator-expression-in-externalproject-add-cmake-args/11111/1 "2024-06-26T13:34:54Z")

</div>

Hello,

When using the `ExternalProject_Add()`, I try to use a generator expression with the `CMAKE_ARGS` argument (the … contains actually some variables):

```auto
ExternalProject_Add(${APP_NAME}_${module}_${require_module_PLATFORM}
      SOURCE_DIR ${ROOT_DIR}/source/modules/${module}
      BINARY_DIR ${CMAKE_BINARY_DIR}/${module}_${require_module_PLATFORM}
      DOWNLOAD_COMMAND ""
      ${generator_params}
      CMAKE_ARGS
          -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
          -DROOT_DIR=${ROOT_DIR}
          -DPLATFORM=${PLATFORM}
          -DMODE=${MODE}
          $<$<BOOL:${OUTPUT_DIR}>:-DOUTPUT_DIR=${OUTPUT_DIR}>
          ${dependency_cmake_args}
          ${options_args}
      DEPENDS ${dependency_targets}
  )

```

The problem is with the generator expression. When `OUTPUT_DIR` doesn’t exist, I get the following warning :  
`Ignoring empty string ("") provided on the command line.`

---

<div class="post-metadata">

**Author:** ![Angew](https://discourse.cmake.org/user_avatar/discourse.cmake.org/angew/32/229_2.png) [@Angew](https://discourse.cmake.org/u/Angew)\
**Post date:** [June 27, 2024, 1:21pm UTC](https://discourse.cmake.org/t/generator-expression-in-externalproject-add-cmake-args/11111/2 "2024-06-27T13:21:39Z")

</div>

Does `OUTPUT_DIR` contain genexes? If not, you don’t need to use a genex either:

```auto
if(OUTPUT_DIR)
  set(OUTPUT_DIR_ARG -DOUTPUT_DIR=${OUTPUT_DIR})
else()
  set(OUTPUT_DIR_ARG "")
endif()
ExternalProject_Add(${APP_NAME}_${module}_${require_module_PLATFORM}
      SOURCE_DIR ${ROOT_DIR}/source/modules/${module}
      BINARY_DIR ${CMAKE_BINARY_DIR}/${module}_${require_module_PLATFORM}
      DOWNLOAD_COMMAND ""
      ${generator_params}
      CMAKE_ARGS
          -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
          -DROOT_DIR=${ROOT_DIR}
          -DPLATFORM=${PLATFORM}
          -DMODE=${MODE}
          ${OUTPUT_DIR_ARG} # <--- the only change from the original
          ${dependency_cmake_args}
          ${options_args}
      DEPENDS ${dependency_targets}
  )
```

---

<div class="post-metadata">

**Author:** ![Oodini](https://discourse.cmake.org/letter_avatar_proxy/v4/letter/o/db5fbb/32.png) [@Oodini](https://discourse.cmake.org/u/Oodini)\
**Post date:** [June 28, 2024, 9:27am UTC](https://discourse.cmake.org/t/generator-expression-in-externalproject-add-cmake-args/11111/3 "2024-06-28T09:27:07Z")

</div>

No, OUTPUT\_DIR is not a generator expression.  
I have finally done a variant of what you suggest:

```auto
if(OUTPUT_DIR)
  set(options_args ${options_args} -DOUTPUT_DIR=${OUTPUT_DIR})
endif()

ExternalProject_Add(${APP_NAME}_${module}_${require_module_PLATFORM}
      SOURCE_DIR ${ROOT_DIR}/source/modules/${module}
      BINARY_DIR ${CMAKE_BINARY_DIR}/${module}_${require_module_PLATFORM}
      DOWNLOAD_COMMAND ""
      ${generator_params}
      CMAKE_ARGS
          -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
          -DROOT_DIR=${ROOT_DIR}
          -DPLATFORM=${PLATFORM}
          -DMODE=${MODE}
          ${dependency_cmake_args}
          ${options_args}
      DEPENDS ${dependency_targets}
  )

```
