# Project variants?

**URL:** https://discourse.cmake.org/t/project-variants/205
**Category:** Code
**Created:** [November 14, 2019, 1:38pm UTC](https://discourse.cmake.org/t/project-variants/205 "2019-11-14T13:38:25Z")
**Posts on this page:** 1
**Showing post:** 5

<div class="post-metadata">

### Author: ![ben.boeckel](https://discourse.cmake.org/letter_avatar_proxy/v4/letter/b/ea5d25/32.png) [@ben.boeckel](https://discourse.cmake.org/u/ben.boeckel)
#### Post date: [November 14, 2019, 9:23pm UTC](https://discourse.cmake.org/t/project-variants/205/5 "2019-11-14T21:23:45Z")

</div>

Not with groups exactly. I’d structure the code this way:

```cmake
set(PROJECT_VARIANT "<DEFAULT>"
  CACHE STRING "Project variant")
set_property(CACHE PROJECT_VARIANT
  PROPERTY STRINGS "<DEFAULT>;VARIANT1;VARIANT2;NONE")

# Defaults for each option.
set(option1_default ON)
set(option2_default OFF)

# Select a default variant. Do this in case the default changes
# in the future, old build trees automatically get it too.
if (PROJECT_VARIANT STREQUAL "<DEFAULT>")
  set(PROJECT_VARIANT "VARIANT1")
endif ()

if (PROJECT_VARIANT STREQUAL "VARIANT1")
  set(option1_default OFF) # VARIANT1 doesn't want this option
endif ()

option(OPTION1 "docstring" "${option1_default}")

```

---

_[View the full topic](https://discourse.cmake.org/t/project-variants/205)._
