# ExternalProject and CMAKE\_TOOLCHAIN\_FILE

**URL:** <https://discourse.cmake.org/t/externalproject-and-cmake-toolchain-file/3194>\
**Category:** Code\
**Created:** [April 22, 2021, 7:40am UTC](https://discourse.cmake.org/t/externalproject-and-cmake-toolchain-file/3194 "2021-04-22T07:40:24Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![jano42](https://discourse.cmake.org/user_avatar/discourse.cmake.org/jano42/32/1401_2.png) [@jano42](https://discourse.cmake.org/u/jano42)\
**Post date:** [April 22, 2021, 7:40am UTC](https://discourse.cmake.org/t/externalproject-and-cmake-toolchain-file/3194/1 "2021-04-22T07:40:24Z")

</div>

Hello

I’m using CMake to build my OpenSource project, for home automation : [Yadoms](https://yadoms.com/)

Our software supports many platforms (Windows, linux, mac) and cross compilation (RaspberryPI, Synology NAS,…)

We are using “ExternalProjects” to build our dependencies.

My problem is our that our external project, is also a cmake project.

In case of cross compiling our software, we use a command line argument to specify CMAKE\_TOOLCHAIN\_FILE But ExternalProject don’t get the same build environment than our main software.

Is there a way for my “cmake based externalprojects” to be built with same environment than main cmake project ?

Thanks

---

<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:** [April 22, 2021, 11:44am UTC](https://discourse.cmake.org/t/externalproject-and-cmake-toolchain-file/3194/2 "2021-04-22T11:44:39Z")

</div>

You can pass `-DCMAKE_TOOLCHAIN_FILE:FILEPATH=${CMAKE_TOOLCHAIN_FILE}` as `CMAKE_ARGS` to other CMake projects.

---

<div class="post-metadata">

**Author:** ![craig.scott](https://discourse.cmake.org/user_avatar/discourse.cmake.org/craig.scott/32/20_2.png) [@craig.scott](https://discourse.cmake.org/u/craig.scott)\
**Post date:** [April 22, 2021, 10:34pm UTC](https://discourse.cmake.org/t/externalproject-and-cmake-toolchain-file/3194/3 "2021-04-22T22:34:49Z")

</div>

Sadly, there’s often much more to pass through if you want to preserve things from the main project through to the subproject. See lines 721-806 of [this example](https://codereview.qt-project.org/c/qt/qtbase/+/334565/13/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake) from a change I’ve been working on recently for the Qt project (look specifically for things relating to `vars_to_pass_if_defined` and `var_defs`).

---

<div class="post-metadata">

**Author:** ![jano42](https://discourse.cmake.org/user_avatar/discourse.cmake.org/jano42/32/1401_2.png) [@jano42](https://discourse.cmake.org/u/jano42)\
**Post date:** [April 23, 2021, 6:41am UTC](https://discourse.cmake.org/t/externalproject-and-cmake-toolchain-file/3194/4 "2021-04-23T06:41:52Z")

</div>

@craig.scott is right. In my case I have much more variable to pass.  
For the moment I pass manually each one but I don’t think this is a reliable way.

I just would like to know if we could find or even add an option for externalProject function to keep the same build environement than main one.

---

<div class="post-metadata">

**Author:** ![craig.scott](https://discourse.cmake.org/user_avatar/discourse.cmake.org/craig.scott/32/20_2.png) [@craig.scott](https://discourse.cmake.org/u/craig.scott)\
**Post date:** [April 24, 2021, 5:03am UTC](https://discourse.cmake.org/t/externalproject-and-cmake-toolchain-file/3194/5 "2021-04-24T05:03:34Z")

</div>

It may be reasonable to make such a change to ExternalProject, but unfortunately I don’t have the bandwidth to explore that.

---

<div class="post-metadata">

**Author:** ![hex](https://discourse.cmake.org/user_avatar/discourse.cmake.org/hex/32/363_2.png) [@hex](https://discourse.cmake.org/u/hex)\
**Post date:** [April 25, 2021, 3:01pm UTC](https://discourse.cmake.org/t/externalproject-and-cmake-toolchain-file/3194/6 "2021-04-25T15:01:09Z")

</div>

If i understand correctly, your tool chain is applied to the entire project. In this case you don’t need to use external project. You could have a single CMake project which handles different platforms and specify the tool chain for it.
