# How to pass CMAKE\_OSX\_ARCHITECTURES to ExternalProject\_Add

**URL:** https://discourse.cmake.org/t/how-to-pass-cmake-osx-architectures-to-externalproject-add/2262
**Category:** Code
**Created:** [November 30, 2020, 10:06am UTC](https://discourse.cmake.org/t/how-to-pass-cmake-osx-architectures-to-externalproject-add/2262 "2020-11-30T10:06:12Z")
**Posts on this page:** 5
**Page:** 1

<div class="post-metadata">

### Author: ![Gonzalo\_Garramuno](https://discourse.cmake.org/user_avatar/discourse.cmake.org/gonzalo_garramuno/32/265_2.png) [@Gonzalo\_Garramuno](https://discourse.cmake.org/u/Gonzalo_Garramuno)
#### Post date: [November 30, 2020, 10:06am UTC](https://discourse.cmake.org/t/how-to-pass-cmake-osx-architectures-to-externalproject-add/2262/1 "2020-11-30T10:06:12Z")

</div>

I am trying to compile a fat binary with ExternalProject\_Add. In order to do so, I need to pass x86\_64;arm64 in the CMAKE\_OSX\_ARCHITECTURES variable to ExternalProject\_Add. However, my attempts at it do not work:

```
include( ExternalProject )

message( "ARCHS=" ${CMAKE_OSX_ARCHITECTURES} )

ExternalProject_Add(
  ZLIB
# URL "https://zlib.net/zlib-1.2.11.tar.gz" # not compatible with Linux-3.3
  URL "https://zlib.net/fossils/zlib-1.2.8.tar.gz"
  CMAKE_ARGS
  -DCMAKE_MODULE_PATH=${CMAKE_MODULE_PATH}
  -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
  -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
  -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX}
  -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
  -DCMAKE_OSX_ARCHITECTURES:STRING=${CMAKE_OSX_ARCHITECTURES}
  )
```

---

<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: [November 30, 2020, 10:13am UTC](https://discourse.cmake.org/t/how-to-pass-cmake-osx-architectures-to-externalproject-add/2262/2 "2020-11-30T10:13:04Z")

</div>

I would assume this has to do with the semi-colon inside `CMAKE_OSX_ARCHITECTURES`, which needs escaping so that it makes its way into the invocation of `ExternalProject_Add`, instead of being used to separate its arguments. So I’d write it like this:

```auto
ExternalProject_Add(
# ... as before, but:
  "-DCMAKE_OSX_ARCHITECTURES:STRING=${CMAKE_OSX_ARCHITECTURES}"
  )

```

---

<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 30, 2020, 1:45pm UTC](https://discourse.cmake.org/t/how-to-pass-cmake-osx-architectures-to-externalproject-add/2262/3 "2020-11-30T13:45:41Z")

</div>

`ExternalProject_Add` has a mechanism for passing semicolons through. You can do:

```cmake
set(semicolon_smuggle "-+-")
string(REPLACE ";" "${semicolon_smuggle}" cmake_osx_archs_epa "${CMAKE_OSX_ARCHITECTURES}")
ExternalProject_Add(LIST_SEPARATOR "${semicolon_smuggle}" …)

```

---

<div class="post-metadata">

### Author: ![duburcqa](https://discourse.cmake.org/user_avatar/discourse.cmake.org/duburcqa/32/1954_2.png) [@duburcqa](https://discourse.cmake.org/u/duburcqa)
#### Post date: [November 11, 2021, 12:54am UTC](https://discourse.cmake.org/t/how-to-pass-cmake-osx-architectures-to-externalproject-add/2262/4 "2021-11-11T00:54:42Z")

</div>

Based on the idea of @ben.boeckel but requiring less tweaking:

```auto
string(REPLACE ";" "$<SEMICOLON>" CMAKE_OSX_ARCHITECTURES_ "${CMAKE_OSX_ARCHITECTURES}")

```

---

<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 11, 2021, 1:08am UTC](https://discourse.cmake.org/t/how-to-pass-cmake-osx-architectures-to-externalproject-add/2262/5 "2021-11-11T01:08:05Z")

</div>

Oh, that is indeed better. I’ll note that in the `ExternalProject`-using project, the command is extracted and written to a CMake script so that we can also apply environment settings to it, so the smuggling is still required there.
