Define CMake args and environment variables simultaneously in install script - #9494

Closed
jathu wants to merge 1 commit into
mainfrom
jathu/consistent-envvar-setter
Closed

Define CMake args and environment variables simultaneously in install script#9494
jathu wants to merge 1 commit into
mainfrom
jathu/consistent-envvar-setter

Conversation

@jathu

@jathujathu commented Mar 21, 2025

Copy link
Copy Markdown
Contributor

Summary

This script currently configures CMAKE_ARGS, that is eventually propagated to the underlying cmake build (via pip install). However, notice how for some args, we also define an equivalent envvar. This is primarily for the pip setup script:

executorch/setup.py

Lines 72 to 98 in 78ee0e6

classShouldBuild:
"""Indicates whether to build various components."""
@staticmethod
def_is_env_enabled(env_var: str, default: bool=False) ->bool:
val=os.environ.get(env_var, None)
ifvalisNone:
returndefault
ifvalin ("OFF", "0", ""):
returnFalse
returnTrue
@classmethod
defpybindings(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_PYBIND", default=False)
@classmethod
deftraining(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_TRAINING", default=False)
@classmethod
defllama_custom_ops(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_KERNELS_CUSTOM_AOT", default=True)
@classmethod
defflatc(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_FLATC", default=True)

So there is an implicit expectation that if you want to access these definitions in the setup script, you need to make sure to also define the envvar along with the cmake args. Well, it took me more than an hour to figure out why my cmake args wasn't being recognized in the setup script 🤦 . So, to make sure consistency — let's force setting args and envvars simultaneously.

Test plan

build + check CMakeCache.txt to ensure flags are set

# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind xnnpack coreml

cc @larryliu0820@lucylq

@jathujathu added module: build/install Issues related to the cmake and buck2 builds, and to installing ExecuTorch ciflow/trunk topic: not user facing labels Mar 21, 2025
@jathu
jathu requested a review from swolchokMarch 21, 2025 17:09
@pytorch-bot

pytorch-botBot commented Mar 21, 2025

Copy link
Copy Markdown

🔗 Helpful Links

🧪 See artifacts and rendered test results at hud.pytorch.org/pr/pytorch/executorch/9494

Note: Links to docs will display an error until the docs builds have been completed.

❌ 2 New Failures

As of commit 553bbba with merge base e22b21a (image):

NEW FAILURES - The following jobs have failed:

This comment was automatically generated by Dr. CI and updates every 15 minutes.

@facebook-github-botfacebook-github-bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Mar 21, 2025
@jathu
jathu marked this pull request as ready for review March 21, 2025 17:12

@swolchokswolchok left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

Comment threadinstall_executorch.py Outdated
@jathu

Copy link
Copy Markdown
ContributorAuthor

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

The environment variable is not for CMake, it is used by the setup.py file we created — I included where we check for it in the description

@jathu
jathuforce-pushed the jathu/consistent-envvar-setter branch from 9d441a8 to 553bbbaCompareMarch 21, 2025 17:23
@jathu
jathu requested a review from swolchokMarch 21, 2025 18:16
@swolchok

Copy link
Copy Markdown
Contributor

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

The environment variable is not for CMake, it is used by the setup.py file we created — I included where we check for it in the description

OK, then I think the redundant part is putting the flags in CMAKE_ARGS? setup.py is already responsible for that, right?

@jathu

Copy link
Copy Markdown
ContributorAuthor

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

The environment variable is not for CMake, it is used by the setup.py file we created — I included where we check for it in the description

OK, then I think the redundant part is putting the flags in CMAKE_ARGS? setup.py is already responsible for that, right?

Unfortunately, setup.py doesn't fully commit to that. For example, the reason it expects some some of these flags to be defined as an env var, is so it can easily infer if it is turned on then add additional logic like putting together pybinging. In this case, it does set the cmake flag again. It wouldn't know what environment variable should be defined as a cmake arg — we would need to make that explicit mapping. Which can just be difficult to maintain. So we should continue to let CMAKE_ARGS get set.

I guess we can remove the duplicate definition by splitting apart the CMAKE_ARGS in setup.py, and getting rid of the environment variable logic entirely. The only problem is this will now expect people to switch their workflow from:

# Before
$ EXECUTORCH_BUILD_PYBIND=ON python setup.py bdist_wheel
# After
$ CMAKE_ARGS="-DEXECUTORCH_BUILD_PYBIND=ON" python setup.py bdist_wheel

I was hesitant to change this since it might break people's current usage, and might require wider CI changes. Note that technically this diff should be neutral change because it maintains the same API — is just forces consistency of the two places of definition instead of doing it manually as it is being done now.

Thinking about it more, if we are okay with breaking people's current workflow of building wheels — I think I'd prefer to get rid of defining environment variables and just relying on CMAKE_ARGS. Thoughts?

@jathujathu closed this Mar 25, 2025
@jathu
jathu deleted the jathu/consistent-envvar-setter branch March 25, 2025 17:55
jathu added a commit that referenced this pull request Mar 25, 2025
### Summary
We seem to be using a combination of CMAKE_ARGS and environment
variables when creating wheels. Ultimately, CMake only uses the cmake
args, however we redefine some of these flags as env vars to help
`setup.py` determine if a certain feature is turned on. Specifically, it
looks for pybinding vars to bundle pybindings.
Let's remove this redundancy and just use the CMAKE_ARGS as the single
source of truth. For more details and other considerations, see
#9494 (abandoned).
Note that even in the wheel building jobs, we use cmake args instead of
environment variables to control features:
https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_base.sh#L20https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_macos.sh#L14-L15
### Test plan
build + check CMakeCache.txt to ensure flags are set
```bash
# Expected: EXECUTORCH_BUILD_PYBIND=OFF EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh --pybind off
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind xnnpack coreml
# Throws an error
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml off
```
cc @larryliu0820@lucylq
kirklandsign pushed a commit that referenced this pull request Apr 11, 2025
### Summary
We seem to be using a combination of CMAKE_ARGS and environment
variables when creating wheels. Ultimately, CMake only uses the cmake
args, however we redefine some of these flags as env vars to help
`setup.py` determine if a certain feature is turned on. Specifically, it
looks for pybinding vars to bundle pybindings.
Let's remove this redundancy and just use the CMAKE_ARGS as the single
source of truth. For more details and other considerations, see
#9494 (abandoned).
Note that even in the wheel building jobs, we use cmake args instead of
environment variables to control features:
https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_base.sh#L20https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_macos.sh#L14-L15
### Test plan
build + check CMakeCache.txt to ensure flags are set
```bash
# Expected: EXECUTORCH_BUILD_PYBIND=OFF EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh --pybind off
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind xnnpack coreml
# Throws an error
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml off
```
cc @larryliu0820@lucylq
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ciflow/trunkCLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.module: build/installIssues related to the cmake and buck2 builds, and to installing ExecuTorchtopic: not user facing

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jathu@swolchok@facebook-github-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Define CMake args and environment variables simultaneously in install script - #9494

Closed
jathu wants to merge 1 commit into
mainfrom
jathu/consistent-envvar-setter
Closed

Define CMake args and environment variables simultaneously in install script#9494
jathu wants to merge 1 commit into
mainfrom
jathu/consistent-envvar-setter

Conversation

@jathu

@jathujathu commented Mar 21, 2025

Copy link
Copy Markdown
Contributor

Summary

This script currently configures CMAKE_ARGS, that is eventually propagated to the underlying cmake build (via pip install). However, notice how for some args, we also define an equivalent envvar. This is primarily for the pip setup script:

executorch/setup.py

Lines 72 to 98 in 78ee0e6

classShouldBuild:
"""Indicates whether to build various components."""
@staticmethod
def_is_env_enabled(env_var: str, default: bool=False) ->bool:
val=os.environ.get(env_var, None)
ifvalisNone:
returndefault
ifvalin ("OFF", "0", ""):
returnFalse
returnTrue
@classmethod
defpybindings(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_PYBIND", default=False)
@classmethod
deftraining(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_TRAINING", default=False)
@classmethod
defllama_custom_ops(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_KERNELS_CUSTOM_AOT", default=True)
@classmethod
defflatc(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_FLATC", default=True)

So there is an implicit expectation that if you want to access these definitions in the setup script, you need to make sure to also define the envvar along with the cmake args. Well, it took me more than an hour to figure out why my cmake args wasn't being recognized in the setup script 🤦 . So, to make sure consistency — let's force setting args and envvars simultaneously.

Test plan

build + check CMakeCache.txt to ensure flags are set

# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind xnnpack coreml

cc @larryliu0820@lucylq

@jathujathu added module: build/install Issues related to the cmake and buck2 builds, and to installing ExecuTorch ciflow/trunk topic: not user facing labels Mar 21, 2025
@jathu
jathu requested a review from swolchokMarch 21, 2025 17:09
@pytorch-bot

pytorch-botBot commented Mar 21, 2025

Copy link
Copy Markdown

🔗 Helpful Links

🧪 See artifacts and rendered test results at hud.pytorch.org/pr/pytorch/executorch/9494

Note: Links to docs will display an error until the docs builds have been completed.

❌ 2 New Failures

As of commit 553bbba with merge base e22b21a (image):

NEW FAILURES - The following jobs have failed:

This comment was automatically generated by Dr. CI and updates every 15 minutes.

@facebook-github-botfacebook-github-bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Mar 21, 2025
@jathu
jathu marked this pull request as ready for review March 21, 2025 17:12

@swolchokswolchok left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

Comment threadinstall_executorch.py Outdated
@jathu

Copy link
Copy Markdown
ContributorAuthor

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

The environment variable is not for CMake, it is used by the setup.py file we created — I included where we check for it in the description

@jathu
jathuforce-pushed the jathu/consistent-envvar-setter branch from 9d441a8 to 553bbbaCompareMarch 21, 2025 17:23
@jathu
jathu requested a review from swolchokMarch 21, 2025 18:16
@swolchok

Copy link
Copy Markdown
Contributor

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

The environment variable is not for CMake, it is used by the setup.py file we created — I included where we check for it in the description

OK, then I think the redundant part is putting the flags in CMAKE_ARGS? setup.py is already responsible for that, right?

@jathu

Copy link
Copy Markdown
ContributorAuthor

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

The environment variable is not for CMake, it is used by the setup.py file we created — I included where we check for it in the description

OK, then I think the redundant part is putting the flags in CMAKE_ARGS? setup.py is already responsible for that, right?

Unfortunately, setup.py doesn't fully commit to that. For example, the reason it expects some some of these flags to be defined as an env var, is so it can easily infer if it is turned on then add additional logic like putting together pybinging. In this case, it does set the cmake flag again. It wouldn't know what environment variable should be defined as a cmake arg — we would need to make that explicit mapping. Which can just be difficult to maintain. So we should continue to let CMAKE_ARGS get set.

I guess we can remove the duplicate definition by splitting apart the CMAKE_ARGS in setup.py, and getting rid of the environment variable logic entirely. The only problem is this will now expect people to switch their workflow from:

# Before
$ EXECUTORCH_BUILD_PYBIND=ON python setup.py bdist_wheel
# After
$ CMAKE_ARGS="-DEXECUTORCH_BUILD_PYBIND=ON" python setup.py bdist_wheel

I was hesitant to change this since it might break people's current usage, and might require wider CI changes. Note that technically this diff should be neutral change because it maintains the same API — is just forces consistency of the two places of definition instead of doing it manually as it is being done now.

Thinking about it more, if we are okay with breaking people's current workflow of building wheels — I think I'd prefer to get rid of defining environment variables and just relying on CMAKE_ARGS. Thoughts?

@jathujathu closed this Mar 25, 2025
@jathu
jathu deleted the jathu/consistent-envvar-setter branch March 25, 2025 17:55
jathu added a commit that referenced this pull request Mar 25, 2025
### Summary
We seem to be using a combination of CMAKE_ARGS and environment
variables when creating wheels. Ultimately, CMake only uses the cmake
args, however we redefine some of these flags as env vars to help
`setup.py` determine if a certain feature is turned on. Specifically, it
looks for pybinding vars to bundle pybindings.
Let's remove this redundancy and just use the CMAKE_ARGS as the single
source of truth. For more details and other considerations, see
#9494 (abandoned).
Note that even in the wheel building jobs, we use cmake args instead of
environment variables to control features:
https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_base.sh#L20https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_macos.sh#L14-L15
### Test plan
build + check CMakeCache.txt to ensure flags are set
```bash
# Expected: EXECUTORCH_BUILD_PYBIND=OFF EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh --pybind off
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind xnnpack coreml
# Throws an error
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml off
```
cc @larryliu0820@lucylq
kirklandsign pushed a commit that referenced this pull request Apr 11, 2025
### Summary
We seem to be using a combination of CMAKE_ARGS and environment
variables when creating wheels. Ultimately, CMake only uses the cmake
args, however we redefine some of these flags as env vars to help
`setup.py` determine if a certain feature is turned on. Specifically, it
looks for pybinding vars to bundle pybindings.
Let's remove this redundancy and just use the CMAKE_ARGS as the single
source of truth. For more details and other considerations, see
#9494 (abandoned).
Note that even in the wheel building jobs, we use cmake args instead of
environment variables to control features:
https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_base.sh#L20https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_macos.sh#L14-L15
### Test plan
build + check CMakeCache.txt to ensure flags are set
```bash
# Expected: EXECUTORCH_BUILD_PYBIND=OFF EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh --pybind off
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind xnnpack coreml
# Throws an error
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml off
```
cc @larryliu0820@lucylq
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ciflow/trunkCLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.module: build/installIssues related to the cmake and buck2 builds, and to installing ExecuTorchtopic: not user facing

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jathu@swolchok@facebook-github-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Define CMake args and environment variables simultaneously in install script - #9494

Closed
jathu wants to merge 1 commit into
mainfrom
jathu/consistent-envvar-setter
Closed

Define CMake args and environment variables simultaneously in install script#9494
jathu wants to merge 1 commit into
mainfrom
jathu/consistent-envvar-setter

Conversation

@jathu

@jathujathu commented Mar 21, 2025

Copy link
Copy Markdown
Contributor

Summary

This script currently configures CMAKE_ARGS, that is eventually propagated to the underlying cmake build (via pip install). However, notice how for some args, we also define an equivalent envvar. This is primarily for the pip setup script:

executorch/setup.py

Lines 72 to 98 in 78ee0e6

classShouldBuild:
"""Indicates whether to build various components."""
@staticmethod
def_is_env_enabled(env_var: str, default: bool=False) ->bool:
val=os.environ.get(env_var, None)
ifvalisNone:
returndefault
ifvalin ("OFF", "0", ""):
returnFalse
returnTrue
@classmethod
defpybindings(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_PYBIND", default=False)
@classmethod
deftraining(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_TRAINING", default=False)
@classmethod
defllama_custom_ops(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_KERNELS_CUSTOM_AOT", default=True)
@classmethod
defflatc(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_FLATC", default=True)

So there is an implicit expectation that if you want to access these definitions in the setup script, you need to make sure to also define the envvar along with the cmake args. Well, it took me more than an hour to figure out why my cmake args wasn't being recognized in the setup script 🤦 . So, to make sure consistency — let's force setting args and envvars simultaneously.

Test plan

build + check CMakeCache.txt to ensure flags are set

# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind xnnpack coreml

cc @larryliu0820@lucylq

@jathujathu added module: build/install Issues related to the cmake and buck2 builds, and to installing ExecuTorch ciflow/trunk topic: not user facing labels Mar 21, 2025
@jathu
jathu requested a review from swolchokMarch 21, 2025 17:09
@pytorch-bot

pytorch-botBot commented Mar 21, 2025

Copy link
Copy Markdown

🔗 Helpful Links

🧪 See artifacts and rendered test results at hud.pytorch.org/pr/pytorch/executorch/9494

Note: Links to docs will display an error until the docs builds have been completed.

❌ 2 New Failures

As of commit 553bbba with merge base e22b21a (image):

NEW FAILURES - The following jobs have failed:

This comment was automatically generated by Dr. CI and updates every 15 minutes.

@facebook-github-botfacebook-github-bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Mar 21, 2025
@jathu
jathu marked this pull request as ready for review March 21, 2025 17:12

@swolchokswolchok left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

Comment threadinstall_executorch.py Outdated
@jathu

Copy link
Copy Markdown
ContributorAuthor

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

The environment variable is not for CMake, it is used by the setup.py file we created — I included where we check for it in the description

@jathu
jathuforce-pushed the jathu/consistent-envvar-setter branch from 9d441a8 to 553bbbaCompareMarch 21, 2025 17:23
@jathu
jathu requested a review from swolchokMarch 21, 2025 18:16
@swolchok

Copy link
Copy Markdown
Contributor

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

The environment variable is not for CMake, it is used by the setup.py file we created — I included where we check for it in the description

OK, then I think the redundant part is putting the flags in CMAKE_ARGS? setup.py is already responsible for that, right?

@jathu

Copy link
Copy Markdown
ContributorAuthor

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

The environment variable is not for CMake, it is used by the setup.py file we created — I included where we check for it in the description

OK, then I think the redundant part is putting the flags in CMAKE_ARGS? setup.py is already responsible for that, right?

Unfortunately, setup.py doesn't fully commit to that. For example, the reason it expects some some of these flags to be defined as an env var, is so it can easily infer if it is turned on then add additional logic like putting together pybinging. In this case, it does set the cmake flag again. It wouldn't know what environment variable should be defined as a cmake arg — we would need to make that explicit mapping. Which can just be difficult to maintain. So we should continue to let CMAKE_ARGS get set.

I guess we can remove the duplicate definition by splitting apart the CMAKE_ARGS in setup.py, and getting rid of the environment variable logic entirely. The only problem is this will now expect people to switch their workflow from:

# Before
$ EXECUTORCH_BUILD_PYBIND=ON python setup.py bdist_wheel
# After
$ CMAKE_ARGS="-DEXECUTORCH_BUILD_PYBIND=ON" python setup.py bdist_wheel

I was hesitant to change this since it might break people's current usage, and might require wider CI changes. Note that technically this diff should be neutral change because it maintains the same API — is just forces consistency of the two places of definition instead of doing it manually as it is being done now.

Thinking about it more, if we are okay with breaking people's current workflow of building wheels — I think I'd prefer to get rid of defining environment variables and just relying on CMAKE_ARGS. Thoughts?

@jathujathu closed this Mar 25, 2025
@jathu
jathu deleted the jathu/consistent-envvar-setter branch March 25, 2025 17:55
jathu added a commit that referenced this pull request Mar 25, 2025
### Summary
We seem to be using a combination of CMAKE_ARGS and environment
variables when creating wheels. Ultimately, CMake only uses the cmake
args, however we redefine some of these flags as env vars to help
`setup.py` determine if a certain feature is turned on. Specifically, it
looks for pybinding vars to bundle pybindings.
Let's remove this redundancy and just use the CMAKE_ARGS as the single
source of truth. For more details and other considerations, see
#9494 (abandoned).
Note that even in the wheel building jobs, we use cmake args instead of
environment variables to control features:
https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_base.sh#L20https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_macos.sh#L14-L15
### Test plan
build + check CMakeCache.txt to ensure flags are set
```bash
# Expected: EXECUTORCH_BUILD_PYBIND=OFF EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh --pybind off
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind xnnpack coreml
# Throws an error
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml off
```
cc @larryliu0820@lucylq
kirklandsign pushed a commit that referenced this pull request Apr 11, 2025
### Summary
We seem to be using a combination of CMAKE_ARGS and environment
variables when creating wheels. Ultimately, CMake only uses the cmake
args, however we redefine some of these flags as env vars to help
`setup.py` determine if a certain feature is turned on. Specifically, it
looks for pybinding vars to bundle pybindings.
Let's remove this redundancy and just use the CMAKE_ARGS as the single
source of truth. For more details and other considerations, see
#9494 (abandoned).
Note that even in the wheel building jobs, we use cmake args instead of
environment variables to control features:
https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_base.sh#L20https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_macos.sh#L14-L15
### Test plan
build + check CMakeCache.txt to ensure flags are set
```bash
# Expected: EXECUTORCH_BUILD_PYBIND=OFF EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh --pybind off
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind xnnpack coreml
# Throws an error
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml off
```
cc @larryliu0820@lucylq
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ciflow/trunkCLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.module: build/installIssues related to the cmake and buck2 builds, and to installing ExecuTorchtopic: not user facing

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jathu@swolchok@facebook-github-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Define CMake args and environment variables simultaneously in install script - #9494

Closed
jathu wants to merge 1 commit into
mainfrom
jathu/consistent-envvar-setter
Closed

Define CMake args and environment variables simultaneously in install script#9494
jathu wants to merge 1 commit into
mainfrom
jathu/consistent-envvar-setter

Conversation

@jathu

@jathujathu commented Mar 21, 2025

Copy link
Copy Markdown
Contributor

Summary

This script currently configures CMAKE_ARGS, that is eventually propagated to the underlying cmake build (via pip install). However, notice how for some args, we also define an equivalent envvar. This is primarily for the pip setup script:

executorch/setup.py

Lines 72 to 98 in 78ee0e6

classShouldBuild:
"""Indicates whether to build various components."""
@staticmethod
def_is_env_enabled(env_var: str, default: bool=False) ->bool:
val=os.environ.get(env_var, None)
ifvalisNone:
returndefault
ifvalin ("OFF", "0", ""):
returnFalse
returnTrue
@classmethod
defpybindings(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_PYBIND", default=False)
@classmethod
deftraining(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_TRAINING", default=False)
@classmethod
defllama_custom_ops(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_KERNELS_CUSTOM_AOT", default=True)
@classmethod
defflatc(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_FLATC", default=True)

So there is an implicit expectation that if you want to access these definitions in the setup script, you need to make sure to also define the envvar along with the cmake args. Well, it took me more than an hour to figure out why my cmake args wasn't being recognized in the setup script 🤦 . So, to make sure consistency — let's force setting args and envvars simultaneously.

Test plan

build + check CMakeCache.txt to ensure flags are set

# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind xnnpack coreml

cc @larryliu0820@lucylq

@jathujathu added module: build/install Issues related to the cmake and buck2 builds, and to installing ExecuTorch ciflow/trunk topic: not user facing labels Mar 21, 2025
@jathu
jathu requested a review from swolchokMarch 21, 2025 17:09
@pytorch-bot

pytorch-botBot commented Mar 21, 2025

Copy link
Copy Markdown

🔗 Helpful Links

🧪 See artifacts and rendered test results at hud.pytorch.org/pr/pytorch/executorch/9494

Note: Links to docs will display an error until the docs builds have been completed.

❌ 2 New Failures

As of commit 553bbba with merge base e22b21a (image):

NEW FAILURES - The following jobs have failed:

This comment was automatically generated by Dr. CI and updates every 15 minutes.

@facebook-github-botfacebook-github-bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Mar 21, 2025
@jathu
jathu marked this pull request as ready for review March 21, 2025 17:12

@swolchokswolchok left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

Comment threadinstall_executorch.py Outdated
@jathu

Copy link
Copy Markdown
ContributorAuthor

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

The environment variable is not for CMake, it is used by the setup.py file we created — I included where we check for it in the description

@jathu
jathuforce-pushed the jathu/consistent-envvar-setter branch from 9d441a8 to 553bbbaCompareMarch 21, 2025 17:23
@jathu
jathu requested a review from swolchokMarch 21, 2025 18:16
@swolchok

Copy link
Copy Markdown
Contributor

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

The environment variable is not for CMake, it is used by the setup.py file we created — I included where we check for it in the description

OK, then I think the redundant part is putting the flags in CMAKE_ARGS? setup.py is already responsible for that, right?

@jathu

Copy link
Copy Markdown
ContributorAuthor

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

The environment variable is not for CMake, it is used by the setup.py file we created — I included where we check for it in the description

OK, then I think the redundant part is putting the flags in CMAKE_ARGS? setup.py is already responsible for that, right?

Unfortunately, setup.py doesn't fully commit to that. For example, the reason it expects some some of these flags to be defined as an env var, is so it can easily infer if it is turned on then add additional logic like putting together pybinging. In this case, it does set the cmake flag again. It wouldn't know what environment variable should be defined as a cmake arg — we would need to make that explicit mapping. Which can just be difficult to maintain. So we should continue to let CMAKE_ARGS get set.

I guess we can remove the duplicate definition by splitting apart the CMAKE_ARGS in setup.py, and getting rid of the environment variable logic entirely. The only problem is this will now expect people to switch their workflow from:

# Before
$ EXECUTORCH_BUILD_PYBIND=ON python setup.py bdist_wheel
# After
$ CMAKE_ARGS="-DEXECUTORCH_BUILD_PYBIND=ON" python setup.py bdist_wheel

I was hesitant to change this since it might break people's current usage, and might require wider CI changes. Note that technically this diff should be neutral change because it maintains the same API — is just forces consistency of the two places of definition instead of doing it manually as it is being done now.

Thinking about it more, if we are okay with breaking people's current workflow of building wheels — I think I'd prefer to get rid of defining environment variables and just relying on CMAKE_ARGS. Thoughts?

@jathujathu closed this Mar 25, 2025
@jathu
jathu deleted the jathu/consistent-envvar-setter branch March 25, 2025 17:55
jathu added a commit that referenced this pull request Mar 25, 2025
### Summary
We seem to be using a combination of CMAKE_ARGS and environment
variables when creating wheels. Ultimately, CMake only uses the cmake
args, however we redefine some of these flags as env vars to help
`setup.py` determine if a certain feature is turned on. Specifically, it
looks for pybinding vars to bundle pybindings.
Let's remove this redundancy and just use the CMAKE_ARGS as the single
source of truth. For more details and other considerations, see
#9494 (abandoned).
Note that even in the wheel building jobs, we use cmake args instead of
environment variables to control features:
https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_base.sh#L20https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_macos.sh#L14-L15
### Test plan
build + check CMakeCache.txt to ensure flags are set
```bash
# Expected: EXECUTORCH_BUILD_PYBIND=OFF EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh --pybind off
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind xnnpack coreml
# Throws an error
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml off
```
cc @larryliu0820@lucylq
kirklandsign pushed a commit that referenced this pull request Apr 11, 2025
### Summary
We seem to be using a combination of CMAKE_ARGS and environment
variables when creating wheels. Ultimately, CMake only uses the cmake
args, however we redefine some of these flags as env vars to help
`setup.py` determine if a certain feature is turned on. Specifically, it
looks for pybinding vars to bundle pybindings.
Let's remove this redundancy and just use the CMAKE_ARGS as the single
source of truth. For more details and other considerations, see
#9494 (abandoned).
Note that even in the wheel building jobs, we use cmake args instead of
environment variables to control features:
https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_base.sh#L20https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_macos.sh#L14-L15
### Test plan
build + check CMakeCache.txt to ensure flags are set
```bash
# Expected: EXECUTORCH_BUILD_PYBIND=OFF EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh --pybind off
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind xnnpack coreml
# Throws an error
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml off
```
cc @larryliu0820@lucylq
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ciflow/trunkCLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.module: build/installIssues related to the cmake and buck2 builds, and to installing ExecuTorchtopic: not user facing

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jathu@swolchok@facebook-github-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Define CMake args and environment variables simultaneously in install script - #9494

Closed
jathu wants to merge 1 commit into
mainfrom
jathu/consistent-envvar-setter
Closed

Define CMake args and environment variables simultaneously in install script#9494
jathu wants to merge 1 commit into
mainfrom
jathu/consistent-envvar-setter

Conversation

@jathu

@jathujathu commented Mar 21, 2025

Copy link
Copy Markdown
Contributor

Summary

This script currently configures CMAKE_ARGS, that is eventually propagated to the underlying cmake build (via pip install). However, notice how for some args, we also define an equivalent envvar. This is primarily for the pip setup script:

executorch/setup.py

Lines 72 to 98 in 78ee0e6

classShouldBuild:
"""Indicates whether to build various components."""
@staticmethod
def_is_env_enabled(env_var: str, default: bool=False) ->bool:
val=os.environ.get(env_var, None)
ifvalisNone:
returndefault
ifvalin ("OFF", "0", ""):
returnFalse
returnTrue
@classmethod
defpybindings(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_PYBIND", default=False)
@classmethod
deftraining(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_TRAINING", default=False)
@classmethod
defllama_custom_ops(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_KERNELS_CUSTOM_AOT", default=True)
@classmethod
defflatc(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_FLATC", default=True)

So there is an implicit expectation that if you want to access these definitions in the setup script, you need to make sure to also define the envvar along with the cmake args. Well, it took me more than an hour to figure out why my cmake args wasn't being recognized in the setup script 🤦 . So, to make sure consistency — let's force setting args and envvars simultaneously.

Test plan

build + check CMakeCache.txt to ensure flags are set

# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind xnnpack coreml

cc @larryliu0820@lucylq

@jathujathu added module: build/install Issues related to the cmake and buck2 builds, and to installing ExecuTorch ciflow/trunk topic: not user facing labels Mar 21, 2025
@jathu
jathu requested a review from swolchokMarch 21, 2025 17:09
@pytorch-bot

pytorch-botBot commented Mar 21, 2025

Copy link
Copy Markdown

🔗 Helpful Links

🧪 See artifacts and rendered test results at hud.pytorch.org/pr/pytorch/executorch/9494

Note: Links to docs will display an error until the docs builds have been completed.

❌ 2 New Failures

As of commit 553bbba with merge base e22b21a (image):

NEW FAILURES - The following jobs have failed:

This comment was automatically generated by Dr. CI and updates every 15 minutes.

@facebook-github-botfacebook-github-bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Mar 21, 2025
@jathu
jathu marked this pull request as ready for review March 21, 2025 17:12

@swolchokswolchok left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

Comment threadinstall_executorch.py Outdated
@jathu

Copy link
Copy Markdown
ContributorAuthor

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

The environment variable is not for CMake, it is used by the setup.py file we created — I included where we check for it in the description

@jathu
jathuforce-pushed the jathu/consistent-envvar-setter branch from 9d441a8 to 553bbbaCompareMarch 21, 2025 17:23
@jathu
jathu requested a review from swolchokMarch 21, 2025 18:16
@swolchok

Copy link
Copy Markdown
Contributor

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

The environment variable is not for CMake, it is used by the setup.py file we created — I included where we check for it in the description

OK, then I think the redundant part is putting the flags in CMAKE_ARGS? setup.py is already responsible for that, right?

@jathu

Copy link
Copy Markdown
ContributorAuthor

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

The environment variable is not for CMake, it is used by the setup.py file we created — I included where we check for it in the description

OK, then I think the redundant part is putting the flags in CMAKE_ARGS? setup.py is already responsible for that, right?

Unfortunately, setup.py doesn't fully commit to that. For example, the reason it expects some some of these flags to be defined as an env var, is so it can easily infer if it is turned on then add additional logic like putting together pybinging. In this case, it does set the cmake flag again. It wouldn't know what environment variable should be defined as a cmake arg — we would need to make that explicit mapping. Which can just be difficult to maintain. So we should continue to let CMAKE_ARGS get set.

I guess we can remove the duplicate definition by splitting apart the CMAKE_ARGS in setup.py, and getting rid of the environment variable logic entirely. The only problem is this will now expect people to switch their workflow from:

# Before
$ EXECUTORCH_BUILD_PYBIND=ON python setup.py bdist_wheel
# After
$ CMAKE_ARGS="-DEXECUTORCH_BUILD_PYBIND=ON" python setup.py bdist_wheel

I was hesitant to change this since it might break people's current usage, and might require wider CI changes. Note that technically this diff should be neutral change because it maintains the same API — is just forces consistency of the two places of definition instead of doing it manually as it is being done now.

Thinking about it more, if we are okay with breaking people's current workflow of building wheels — I think I'd prefer to get rid of defining environment variables and just relying on CMAKE_ARGS. Thoughts?

@jathujathu closed this Mar 25, 2025
@jathu
jathu deleted the jathu/consistent-envvar-setter branch March 25, 2025 17:55
jathu added a commit that referenced this pull request Mar 25, 2025
### Summary
We seem to be using a combination of CMAKE_ARGS and environment
variables when creating wheels. Ultimately, CMake only uses the cmake
args, however we redefine some of these flags as env vars to help
`setup.py` determine if a certain feature is turned on. Specifically, it
looks for pybinding vars to bundle pybindings.
Let's remove this redundancy and just use the CMAKE_ARGS as the single
source of truth. For more details and other considerations, see
#9494 (abandoned).
Note that even in the wheel building jobs, we use cmake args instead of
environment variables to control features:
https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_base.sh#L20https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_macos.sh#L14-L15
### Test plan
build + check CMakeCache.txt to ensure flags are set
```bash
# Expected: EXECUTORCH_BUILD_PYBIND=OFF EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh --pybind off
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind xnnpack coreml
# Throws an error
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml off
```
cc @larryliu0820@lucylq
kirklandsign pushed a commit that referenced this pull request Apr 11, 2025
### Summary
We seem to be using a combination of CMAKE_ARGS and environment
variables when creating wheels. Ultimately, CMake only uses the cmake
args, however we redefine some of these flags as env vars to help
`setup.py` determine if a certain feature is turned on. Specifically, it
looks for pybinding vars to bundle pybindings.
Let's remove this redundancy and just use the CMAKE_ARGS as the single
source of truth. For more details and other considerations, see
#9494 (abandoned).
Note that even in the wheel building jobs, we use cmake args instead of
environment variables to control features:
https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_base.sh#L20https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_macos.sh#L14-L15
### Test plan
build + check CMakeCache.txt to ensure flags are set
```bash
# Expected: EXECUTORCH_BUILD_PYBIND=OFF EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh --pybind off
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind xnnpack coreml
# Throws an error
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml off
```
cc @larryliu0820@lucylq
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ciflow/trunkCLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.module: build/installIssues related to the cmake and buck2 builds, and to installing ExecuTorchtopic: not user facing

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jathu@swolchok@facebook-github-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Define CMake args and environment variables simultaneously in install script - #9494

Closed
jathu wants to merge 1 commit into
mainfrom
jathu/consistent-envvar-setter
Closed

Define CMake args and environment variables simultaneously in install script#9494
jathu wants to merge 1 commit into
mainfrom
jathu/consistent-envvar-setter

Conversation

@jathu

@jathujathu commented Mar 21, 2025

Copy link
Copy Markdown
Contributor

Summary

This script currently configures CMAKE_ARGS, that is eventually propagated to the underlying cmake build (via pip install). However, notice how for some args, we also define an equivalent envvar. This is primarily for the pip setup script:

executorch/setup.py

Lines 72 to 98 in 78ee0e6

classShouldBuild:
"""Indicates whether to build various components."""
@staticmethod
def_is_env_enabled(env_var: str, default: bool=False) ->bool:
val=os.environ.get(env_var, None)
ifvalisNone:
returndefault
ifvalin ("OFF", "0", ""):
returnFalse
returnTrue
@classmethod
defpybindings(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_PYBIND", default=False)
@classmethod
deftraining(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_TRAINING", default=False)
@classmethod
defllama_custom_ops(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_KERNELS_CUSTOM_AOT", default=True)
@classmethod
defflatc(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_FLATC", default=True)

So there is an implicit expectation that if you want to access these definitions in the setup script, you need to make sure to also define the envvar along with the cmake args. Well, it took me more than an hour to figure out why my cmake args wasn't being recognized in the setup script 🤦 . So, to make sure consistency — let's force setting args and envvars simultaneously.

Test plan

build + check CMakeCache.txt to ensure flags are set

# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind xnnpack coreml

cc @larryliu0820@lucylq

@jathujathu added module: build/install Issues related to the cmake and buck2 builds, and to installing ExecuTorch ciflow/trunk topic: not user facing labels Mar 21, 2025
@jathu
jathu requested a review from swolchokMarch 21, 2025 17:09
@pytorch-bot

pytorch-botBot commented Mar 21, 2025

Copy link
Copy Markdown

🔗 Helpful Links

🧪 See artifacts and rendered test results at hud.pytorch.org/pr/pytorch/executorch/9494

Note: Links to docs will display an error until the docs builds have been completed.

❌ 2 New Failures

As of commit 553bbba with merge base e22b21a (image):

NEW FAILURES - The following jobs have failed:

This comment was automatically generated by Dr. CI and updates every 15 minutes.

@facebook-github-botfacebook-github-bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Mar 21, 2025
@jathu
jathu marked this pull request as ready for review March 21, 2025 17:12

@swolchokswolchok left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

Comment threadinstall_executorch.py Outdated
@jathu

Copy link
Copy Markdown
ContributorAuthor

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

The environment variable is not for CMake, it is used by the setup.py file we created — I included where we check for it in the description

@jathu
jathuforce-pushed the jathu/consistent-envvar-setter branch from 9d441a8 to 553bbbaCompareMarch 21, 2025 17:23
@jathu
jathu requested a review from swolchokMarch 21, 2025 18:16
@swolchok

Copy link
Copy Markdown
Contributor

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

The environment variable is not for CMake, it is used by the setup.py file we created — I included where we check for it in the description

OK, then I think the redundant part is putting the flags in CMAKE_ARGS? setup.py is already responsible for that, right?

@jathu

Copy link
Copy Markdown
ContributorAuthor

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

The environment variable is not for CMake, it is used by the setup.py file we created — I included where we check for it in the description

OK, then I think the redundant part is putting the flags in CMAKE_ARGS? setup.py is already responsible for that, right?

Unfortunately, setup.py doesn't fully commit to that. For example, the reason it expects some some of these flags to be defined as an env var, is so it can easily infer if it is turned on then add additional logic like putting together pybinging. In this case, it does set the cmake flag again. It wouldn't know what environment variable should be defined as a cmake arg — we would need to make that explicit mapping. Which can just be difficult to maintain. So we should continue to let CMAKE_ARGS get set.

I guess we can remove the duplicate definition by splitting apart the CMAKE_ARGS in setup.py, and getting rid of the environment variable logic entirely. The only problem is this will now expect people to switch their workflow from:

# Before
$ EXECUTORCH_BUILD_PYBIND=ON python setup.py bdist_wheel
# After
$ CMAKE_ARGS="-DEXECUTORCH_BUILD_PYBIND=ON" python setup.py bdist_wheel

I was hesitant to change this since it might break people's current usage, and might require wider CI changes. Note that technically this diff should be neutral change because it maintains the same API — is just forces consistency of the two places of definition instead of doing it manually as it is being done now.

Thinking about it more, if we are okay with breaking people's current workflow of building wheels — I think I'd prefer to get rid of defining environment variables and just relying on CMAKE_ARGS. Thoughts?

@jathujathu closed this Mar 25, 2025
@jathu
jathu deleted the jathu/consistent-envvar-setter branch March 25, 2025 17:55
jathu added a commit that referenced this pull request Mar 25, 2025
### Summary
We seem to be using a combination of CMAKE_ARGS and environment
variables when creating wheels. Ultimately, CMake only uses the cmake
args, however we redefine some of these flags as env vars to help
`setup.py` determine if a certain feature is turned on. Specifically, it
looks for pybinding vars to bundle pybindings.
Let's remove this redundancy and just use the CMAKE_ARGS as the single
source of truth. For more details and other considerations, see
#9494 (abandoned).
Note that even in the wheel building jobs, we use cmake args instead of
environment variables to control features:
https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_base.sh#L20https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_macos.sh#L14-L15
### Test plan
build + check CMakeCache.txt to ensure flags are set
```bash
# Expected: EXECUTORCH_BUILD_PYBIND=OFF EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh --pybind off
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind xnnpack coreml
# Throws an error
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml off
```
cc @larryliu0820@lucylq
kirklandsign pushed a commit that referenced this pull request Apr 11, 2025
### Summary
We seem to be using a combination of CMAKE_ARGS and environment
variables when creating wheels. Ultimately, CMake only uses the cmake
args, however we redefine some of these flags as env vars to help
`setup.py` determine if a certain feature is turned on. Specifically, it
looks for pybinding vars to bundle pybindings.
Let's remove this redundancy and just use the CMAKE_ARGS as the single
source of truth. For more details and other considerations, see
#9494 (abandoned).
Note that even in the wheel building jobs, we use cmake args instead of
environment variables to control features:
https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_base.sh#L20https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_macos.sh#L14-L15
### Test plan
build + check CMakeCache.txt to ensure flags are set
```bash
# Expected: EXECUTORCH_BUILD_PYBIND=OFF EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh --pybind off
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind xnnpack coreml
# Throws an error
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml off
```
cc @larryliu0820@lucylq
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ciflow/trunkCLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.module: build/installIssues related to the cmake and buck2 builds, and to installing ExecuTorchtopic: not user facing

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jathu@swolchok@facebook-github-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Define CMake args and environment variables simultaneously in install script - #9494

Closed
jathu wants to merge 1 commit into
mainfrom
jathu/consistent-envvar-setter
Closed

Define CMake args and environment variables simultaneously in install script#9494
jathu wants to merge 1 commit into
mainfrom
jathu/consistent-envvar-setter

Conversation

@jathu

@jathujathu commented Mar 21, 2025

Copy link
Copy Markdown
Contributor

Summary

This script currently configures CMAKE_ARGS, that is eventually propagated to the underlying cmake build (via pip install). However, notice how for some args, we also define an equivalent envvar. This is primarily for the pip setup script:

executorch/setup.py

Lines 72 to 98 in 78ee0e6

classShouldBuild:
"""Indicates whether to build various components."""
@staticmethod
def_is_env_enabled(env_var: str, default: bool=False) ->bool:
val=os.environ.get(env_var, None)
ifvalisNone:
returndefault
ifvalin ("OFF", "0", ""):
returnFalse
returnTrue
@classmethod
defpybindings(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_PYBIND", default=False)
@classmethod
deftraining(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_TRAINING", default=False)
@classmethod
defllama_custom_ops(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_KERNELS_CUSTOM_AOT", default=True)
@classmethod
defflatc(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_FLATC", default=True)

So there is an implicit expectation that if you want to access these definitions in the setup script, you need to make sure to also define the envvar along with the cmake args. Well, it took me more than an hour to figure out why my cmake args wasn't being recognized in the setup script 🤦 . So, to make sure consistency — let's force setting args and envvars simultaneously.

Test plan

build + check CMakeCache.txt to ensure flags are set

# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind xnnpack coreml

cc @larryliu0820@lucylq

@jathujathu added module: build/install Issues related to the cmake and buck2 builds, and to installing ExecuTorch ciflow/trunk topic: not user facing labels Mar 21, 2025
@jathu
jathu requested a review from swolchokMarch 21, 2025 17:09
@pytorch-bot

pytorch-botBot commented Mar 21, 2025

Copy link
Copy Markdown

🔗 Helpful Links

🧪 See artifacts and rendered test results at hud.pytorch.org/pr/pytorch/executorch/9494

Note: Links to docs will display an error until the docs builds have been completed.

❌ 2 New Failures

As of commit 553bbba with merge base e22b21a (image):

NEW FAILURES - The following jobs have failed:

This comment was automatically generated by Dr. CI and updates every 15 minutes.

@facebook-github-botfacebook-github-bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Mar 21, 2025
@jathu
jathu marked this pull request as ready for review March 21, 2025 17:12

@swolchokswolchok left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

Comment threadinstall_executorch.py Outdated
@jathu

Copy link
Copy Markdown
ContributorAuthor

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

The environment variable is not for CMake, it is used by the setup.py file we created — I included where we check for it in the description

@jathu
jathuforce-pushed the jathu/consistent-envvar-setter branch from 9d441a8 to 553bbbaCompareMarch 21, 2025 17:23
@jathu
jathu requested a review from swolchokMarch 21, 2025 18:16
@swolchok

Copy link
Copy Markdown
Contributor

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

The environment variable is not for CMake, it is used by the setup.py file we created — I included where we check for it in the description

OK, then I think the redundant part is putting the flags in CMAKE_ARGS? setup.py is already responsible for that, right?

@jathu

Copy link
Copy Markdown
ContributorAuthor

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

The environment variable is not for CMake, it is used by the setup.py file we created — I included where we check for it in the description

OK, then I think the redundant part is putting the flags in CMAKE_ARGS? setup.py is already responsible for that, right?

Unfortunately, setup.py doesn't fully commit to that. For example, the reason it expects some some of these flags to be defined as an env var, is so it can easily infer if it is turned on then add additional logic like putting together pybinging. In this case, it does set the cmake flag again. It wouldn't know what environment variable should be defined as a cmake arg — we would need to make that explicit mapping. Which can just be difficult to maintain. So we should continue to let CMAKE_ARGS get set.

I guess we can remove the duplicate definition by splitting apart the CMAKE_ARGS in setup.py, and getting rid of the environment variable logic entirely. The only problem is this will now expect people to switch their workflow from:

# Before
$ EXECUTORCH_BUILD_PYBIND=ON python setup.py bdist_wheel
# After
$ CMAKE_ARGS="-DEXECUTORCH_BUILD_PYBIND=ON" python setup.py bdist_wheel

I was hesitant to change this since it might break people's current usage, and might require wider CI changes. Note that technically this diff should be neutral change because it maintains the same API — is just forces consistency of the two places of definition instead of doing it manually as it is being done now.

Thinking about it more, if we are okay with breaking people's current workflow of building wheels — I think I'd prefer to get rid of defining environment variables and just relying on CMAKE_ARGS. Thoughts?

@jathujathu closed this Mar 25, 2025
@jathu
jathu deleted the jathu/consistent-envvar-setter branch March 25, 2025 17:55
jathu added a commit that referenced this pull request Mar 25, 2025
### Summary
We seem to be using a combination of CMAKE_ARGS and environment
variables when creating wheels. Ultimately, CMake only uses the cmake
args, however we redefine some of these flags as env vars to help
`setup.py` determine if a certain feature is turned on. Specifically, it
looks for pybinding vars to bundle pybindings.
Let's remove this redundancy and just use the CMAKE_ARGS as the single
source of truth. For more details and other considerations, see
#9494 (abandoned).
Note that even in the wheel building jobs, we use cmake args instead of
environment variables to control features:
https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_base.sh#L20https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_macos.sh#L14-L15
### Test plan
build + check CMakeCache.txt to ensure flags are set
```bash
# Expected: EXECUTORCH_BUILD_PYBIND=OFF EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh --pybind off
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind xnnpack coreml
# Throws an error
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml off
```
cc @larryliu0820@lucylq
kirklandsign pushed a commit that referenced this pull request Apr 11, 2025
### Summary
We seem to be using a combination of CMAKE_ARGS and environment
variables when creating wheels. Ultimately, CMake only uses the cmake
args, however we redefine some of these flags as env vars to help
`setup.py` determine if a certain feature is turned on. Specifically, it
looks for pybinding vars to bundle pybindings.
Let's remove this redundancy and just use the CMAKE_ARGS as the single
source of truth. For more details and other considerations, see
#9494 (abandoned).
Note that even in the wheel building jobs, we use cmake args instead of
environment variables to control features:
https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_base.sh#L20https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_macos.sh#L14-L15
### Test plan
build + check CMakeCache.txt to ensure flags are set
```bash
# Expected: EXECUTORCH_BUILD_PYBIND=OFF EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh --pybind off
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind xnnpack coreml
# Throws an error
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml off
```
cc @larryliu0820@lucylq
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ciflow/trunkCLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.module: build/installIssues related to the cmake and buck2 builds, and to installing ExecuTorchtopic: not user facing

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jathu@swolchok@facebook-github-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Define CMake args and environment variables simultaneously in install script - #9494

Closed
jathu wants to merge 1 commit into
mainfrom
jathu/consistent-envvar-setter
Closed

Define CMake args and environment variables simultaneously in install script#9494
jathu wants to merge 1 commit into
mainfrom
jathu/consistent-envvar-setter

Conversation

@jathu

@jathujathu commented Mar 21, 2025

Copy link
Copy Markdown
Contributor

Summary

This script currently configures CMAKE_ARGS, that is eventually propagated to the underlying cmake build (via pip install). However, notice how for some args, we also define an equivalent envvar. This is primarily for the pip setup script:

executorch/setup.py

Lines 72 to 98 in 78ee0e6

classShouldBuild:
"""Indicates whether to build various components."""
@staticmethod
def_is_env_enabled(env_var: str, default: bool=False) ->bool:
val=os.environ.get(env_var, None)
ifvalisNone:
returndefault
ifvalin ("OFF", "0", ""):
returnFalse
returnTrue
@classmethod
defpybindings(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_PYBIND", default=False)
@classmethod
deftraining(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_TRAINING", default=False)
@classmethod
defllama_custom_ops(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_KERNELS_CUSTOM_AOT", default=True)
@classmethod
defflatc(cls) ->bool:
returncls._is_env_enabled("EXECUTORCH_BUILD_FLATC", default=True)

So there is an implicit expectation that if you want to access these definitions in the setup script, you need to make sure to also define the envvar along with the cmake args. Well, it took me more than an hour to figure out why my cmake args wasn't being recognized in the setup script 🤦 . So, to make sure consistency — let's force setting args and envvars simultaneously.

Test plan

build + check CMakeCache.txt to ensure flags are set

# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind xnnpack coreml

cc @larryliu0820@lucylq

@jathujathu added module: build/install Issues related to the cmake and buck2 builds, and to installing ExecuTorch ciflow/trunk topic: not user facing labels Mar 21, 2025
@jathu
jathu requested a review from swolchokMarch 21, 2025 17:09
@pytorch-bot

pytorch-botBot commented Mar 21, 2025

Copy link
Copy Markdown

🔗 Helpful Links

🧪 See artifacts and rendered test results at hud.pytorch.org/pr/pytorch/executorch/9494

Note: Links to docs will display an error until the docs builds have been completed.

❌ 2 New Failures

As of commit 553bbba with merge base e22b21a (image):

NEW FAILURES - The following jobs have failed:

This comment was automatically generated by Dr. CI and updates every 15 minutes.

@facebook-github-botfacebook-github-bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Mar 21, 2025
@jathu
jathu marked this pull request as ready for review March 21, 2025 17:12

@swolchokswolchok left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

Comment threadinstall_executorch.py Outdated
@jathu

Copy link
Copy Markdown
ContributorAuthor

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

The environment variable is not for CMake, it is used by the setup.py file we created — I included where we check for it in the description

@jathu
jathuforce-pushed the jathu/consistent-envvar-setter branch from 9d441a8 to 553bbbaCompareMarch 21, 2025 17:23
@jathu
jathu requested a review from swolchokMarch 21, 2025 18:16
@swolchok

Copy link
Copy Markdown
Contributor

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

The environment variable is not for CMake, it is used by the setup.py file we created — I included where we check for it in the description

OK, then I think the redundant part is putting the flags in CMAKE_ARGS? setup.py is already responsible for that, right?

@jathu

Copy link
Copy Markdown
ContributorAuthor

This doesn't seem right to me. CMake pays attention to both environment variables and defined flags. We shouldn't have to set both. Can you give a specific motivating example?

The environment variable is not for CMake, it is used by the setup.py file we created — I included where we check for it in the description

OK, then I think the redundant part is putting the flags in CMAKE_ARGS? setup.py is already responsible for that, right?

Unfortunately, setup.py doesn't fully commit to that. For example, the reason it expects some some of these flags to be defined as an env var, is so it can easily infer if it is turned on then add additional logic like putting together pybinging. In this case, it does set the cmake flag again. It wouldn't know what environment variable should be defined as a cmake arg — we would need to make that explicit mapping. Which can just be difficult to maintain. So we should continue to let CMAKE_ARGS get set.

I guess we can remove the duplicate definition by splitting apart the CMAKE_ARGS in setup.py, and getting rid of the environment variable logic entirely. The only problem is this will now expect people to switch their workflow from:

# Before
$ EXECUTORCH_BUILD_PYBIND=ON python setup.py bdist_wheel
# After
$ CMAKE_ARGS="-DEXECUTORCH_BUILD_PYBIND=ON" python setup.py bdist_wheel

I was hesitant to change this since it might break people's current usage, and might require wider CI changes. Note that technically this diff should be neutral change because it maintains the same API — is just forces consistency of the two places of definition instead of doing it manually as it is being done now.

Thinking about it more, if we are okay with breaking people's current workflow of building wheels — I think I'd prefer to get rid of defining environment variables and just relying on CMAKE_ARGS. Thoughts?

@jathujathu closed this Mar 25, 2025
@jathu
jathu deleted the jathu/consistent-envvar-setter branch March 25, 2025 17:55
jathu added a commit that referenced this pull request Mar 25, 2025
### Summary
We seem to be using a combination of CMAKE_ARGS and environment
variables when creating wheels. Ultimately, CMake only uses the cmake
args, however we redefine some of these flags as env vars to help
`setup.py` determine if a certain feature is turned on. Specifically, it
looks for pybinding vars to bundle pybindings.
Let's remove this redundancy and just use the CMAKE_ARGS as the single
source of truth. For more details and other considerations, see
#9494 (abandoned).
Note that even in the wheel building jobs, we use cmake args instead of
environment variables to control features:
https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_base.sh#L20https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_macos.sh#L14-L15
### Test plan
build + check CMakeCache.txt to ensure flags are set
```bash
# Expected: EXECUTORCH_BUILD_PYBIND=OFF EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh --pybind off
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind xnnpack coreml
# Throws an error
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml off
```
cc @larryliu0820@lucylq
kirklandsign pushed a commit that referenced this pull request Apr 11, 2025
### Summary
We seem to be using a combination of CMAKE_ARGS and environment
variables when creating wheels. Ultimately, CMake only uses the cmake
args, however we redefine some of these flags as env vars to help
`setup.py` determine if a certain feature is turned on. Specifically, it
looks for pybinding vars to bundle pybindings.
Let's remove this redundancy and just use the CMAKE_ARGS as the single
source of truth. For more details and other considerations, see
#9494 (abandoned).
Note that even in the wheel building jobs, we use cmake args instead of
environment variables to control features:
https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_base.sh#L20https://github.com/pytorch/executorch/blob/644b7ddf14180d97e348faa627f576e13d367d69/.ci/scripts/wheel/envvar_macos.sh#L14-L15
### Test plan
build + check CMakeCache.txt to ensure flags are set
```bash
# Expected: EXECUTORCH_BUILD_PYBIND=OFF EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh --pybind off
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=OFF
$ rm -rf pip-out dist && ./install_executorch.sh
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=OFF EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml
# Expected: EXECUTORCH_BUILD_PYBIND=ON EXECUTORCH_BUILD_XNNPACK=ON EXECUTORCH_BUILD_COREML=ON
$ rm -rf pip-out dist && ./install_executorch.sh --pybind xnnpack coreml
# Throws an error
$ rm -rf pip-out dist && ./install_executorch.sh --pybind coreml off
```
cc @larryliu0820@lucylq
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ciflow/trunkCLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.module: build/installIssues related to the cmake and buck2 builds, and to installing ExecuTorchtopic: not user facing

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jathu@swolchok@facebook-github-bot