[Build] fix build issues for native Windows. - #4681

Closed
python3kgae wants to merge 4 commits into
pytorch:mainfrom
python3kgae:win_bld
Closed

[Build] fix build issues for native Windows.#4681
python3kgae wants to merge 4 commits into
pytorch:mainfrom
python3kgae:win_bld

Conversation

@python3kgae

Copy link
Copy Markdown
Contributor

Add install_requirements.ps1 for build on native Windows.

Also fix issues block build on native Windows.

  1. Get the Windows version of buck2 for Windows.
  2. Check the path based on the build configuration for Windows in setup.py.
  3. Avoid generating 'def flat.exe()' which is illegal python.
  4. Add the Windows version of kernel_link_options.
  5. Add links of pthreadpool and cpuinfo for custom_ops_aot_lib.
  6. Define ssize_t for Windows.

Still have one link issue tracked with #4659.

For #4661

@pytorch-bot

pytorch-botBot commented Aug 13, 2024

Copy link
Copy Markdown

🔗 Helpful Links

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

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

❌ 7 New Failures

As of commit 1b8899c with merge base f887d72 (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 Aug 13, 2024
@manuelcandalesmanuelcandales added module: build/install Issues related to the cmake and buck2 builds, and to installing ExecuTorch triaged This issue has been looked at a team member, and triaged and prioritized into an appropriate module labels Aug 13, 2024
Comment threadbuild/resolve_buck.py

@kirklandsignkirklandsign 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.

Thank you! Is this PR tested and ready for review? Also for the install_requirements.ps1, it's for windows only?

Comment threadextension/data_loader/file_data_loader.cpp Outdated
@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Thank you! Is this PR tested and ready for review? Also for the install_requirements.ps1, it's for windows only?

I didn't really do any real tests except make sure the getting-started-setup works under native Windows and WSL.
Will the CI pipeline test cover all tests or there're some tests must be running locally?

And yes, install_requirements.ps1 is for windows only.

@dbortdbort 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.

Thank you for taking the time to track down and fix all of these issues! I'm generally happy with the approach, but I'd really like to find a way to avoid duplicating so much data and logic from install_requirements.sh.

Will the CI pipeline test cover all tests or there're some tests must be running locally?

Unfortunately the CI pipeline doesn't cover install_requirements.sh right now. If you can, please try running it on a linux and/or mac with your changes. If you don't have access to either, let us know, and we can help testing.

#include <cstddef> // size_t
#include <limits>

#ifdef _WIN32

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 shouldn't be necessary since platform/compiler.h has the same logic.

If this needed to happen because one of the headers between here and line 29 refer to ssize_t, then the header that needs it should also include compiler.h.

But in general, compiler.h is the only place in the ET code that is allowed to have system-specific checks like #ifdef _WIN32

Comment threadruntime/core/portable_type/tensor_impl.h Outdated
Comment threadsetup.py Outdated
Comment threadsetup.py Outdated
item for item in os.environ["CMAKE_BUILD_ARGS"].split(" ") if item
]

if os.name == "nt":

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.

Please add a comment explaining what this does, and why it's only necessary on windows. If it would be safe to use this flag on all systems, I'd rather remove the nt check.

Comment threadsetup.py Outdated
Comment threadsetup.py Outdated
Comment on lines +561 to +562
debug = os.environ.get("DEBUG", 0)
cfg = "Debug" if debug else "Release"

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.

Rather than duplicating this logic, please hoist it (and the other example near line 435) into a common global function like get_build_type() -> str

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Added get_build_type.

Comment threadsetup.py Outdated
)
if os.name == "nt":
ext_modules.append(
BuiltFile(

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.

I'd rather extend BuiltFile to handle this situation in a common way, instead of manually repeating the pattern for every entry.

E.g., it could take an extra is_executable: bool = False param that could be set to true here, letting it know to add the .exe suffix on windows.

And we could embed a CMAKE_BUILD_TYPE (debug vs release) placeholder in the paths that is ignored on non-windows systems. How about

third-party/flatbuffers/%BUILD_TYPE%/flatc

Then, on windows systems we can replace %BUILD_TYPE% with get_build_type(), and on non-windows systems we can delete the string %BUILD_TYPE%/ from the path if present.

So this this entry could become

 ext_modules.append(
BuiltFile(
"third-party/flatbuffers/%BUILD_TYPE%/flatc",
"executorch/data/bin/",
is_executable=True,
)
)

And entries below can use the %BUILD_TYPE% placeholder, and use .* to match .so/.dll/.dylib on different systems.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Updated.

Comment threadextension/data_loader/file_data_loader.cpp Outdated
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#ifndef _WIN32

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.

I really want to avoid _WIN32 checks in any of the code, but this is reasonable for now. The best solution would be to avoid using POSIX concepts and to just use the standard C APIs.

Suggested change
#ifndef _WIN32
// TODO: Rewrite FileDataLoader to use standard C FILE* instead of POSIX file
// descriptors, so that we don't need this _WIN32 check.
#ifndef _WIN32

Comment threadextension/llm/custom_ops/CMakeLists.txt
@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Thank you for taking the time to track down and fix all of these issues! I'm generally happy with the approach, but I'd really like to find a way to avoid duplicating so much data and logic from install_requirements.sh.

Will the CI pipeline test cover all tests or there're some tests must be running locally?

Unfortunately the CI pipeline doesn't cover install_requirements.sh right now. If you can, please try running it on a linux and/or mac with your changes. If you don't have access to either, let us know, and we can help testing.

Thanks for the review.
To avoid duplicating install_requirements.sh, I’m considering rewriting it in portable Python. I’ll give it a try to see if it works.

I don’t have access to Linux or macOS, so I’ll need help testing it on those platforms once I’ve got install_requirements.py working

@python3kgae
python3kgae marked this pull request as draft August 14, 2024 20:39
Added install_requirements.ps1 for build on native Windows.
Also fix issues block build on native Windows.
1. Get the Windows version of buck2 for Windows.
2. Check the path based on the build configuration for Windows in setup.py.
3. Avoid generating 'def flat.exe()' which is illegal python.
4. Add the Windows version of kernel_link_options.
5. Add links of pthreadpool and cpuinfo for custom_ops_aot_lib.
6. Define ssize_t for Windows.
Still have one link issue tracked with pytorch#4659.
For pytorch#4661
@python3kgae
python3kgae marked this pull request as ready for review August 21, 2024 02:15
@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Updated based on the comments.
Tested install_requirements.sh on WSL and install_requirements.bat on Windows.
Need help to test Linux and Mac.

@dbortdbort 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 is looking great!

Consider splitting this into some smaller PRs. E.g. we can probably merge the setup.py stuff pretty quickly, but the FileDataLoader might take longer. And, in general, we prefer to have smaller self-contained PRs.

Comment threadbuild/resolve_buck.py
filepath = os.path.join(dir, filename)
if os.path.isfile(filepath) and os.access(filepath, os.X_OK):
bin_names.append(filename)
# avoid def flat.exe() on windows.

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.

Comments should begin with a capital letter. And I suggest making this a little more general.

Suggested change
# avoid def flat.exe() on windows.
# Remove .exe suffix on windows.

#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#ifndef _WIN32

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.

Heads up that #4760 merged recently, which changes this class to use pread(), which I think will break windows. It might make sense to write a separate WindowsFileDataLoader.

There would be a lot of duplicated code, though. If we needed to split into a windows-specific data loader, it might make sense to have an AbstractFileDataLoader with one pure-virtual protected method to do the actual read.

print(f"Error: Unknown option {arg}")
sys.exit(1)

# Use ClangCL on Windows.

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 comment repeats what the code does, and doesn't provide extra value. Either remove it, or (ideally) add a comment explaining why this logic is necessary. It'd also be helpful to explain what ClangCL is, since non-windows devs will not be familiar with it.

Comment on lines +136 to +141
#ifndef _WIN32
#include <sys/types.h> // TODO(T126923429): Include size_t, ssize_t
#else
#include <stddef.h>
using ssize_t = ptrdiff_t;
#endif

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.

Your PR actually fixes the TODO, so we can remove it.

Suggested change
#ifndef_WIN32
#include<sys/types.h>// TODO(T126923429): Include size_t, ssize_t
#else
#include<stddef.h>
usingssize_t=ptrdiff_t;
#endif
// Define size_t and ssize_t.
#ifndef_WIN32
#include<sys/types.h>
#else
#include<stddef.h>
usingssize_t=ptrdiff_t;
#endif

Comment threadsetup.py
item for item in os.environ["CMAKE_BUILD_ARGS"].split(" ") if item
]

build_args += ["--config", cfg]

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.

Please add a comment explaining why this is necessary.

Comment threadsetup.py
Comment on lines +614 to +616
"third-party/flatbuffers/%BUILD_TYPE%/",
"flatc",
"executorch/data/bin/",

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.

Now that there are more than two params, please use kwargs for all params. Same for other BuiltFile uses below.

Suggested change
"third-party/flatbuffers/%BUILD_TYPE%/",
"flatc",
"executorch/data/bin/",
src_path="third-party/flatbuffers/%BUILD_TYPE%/",
src_name="flatc",
dst="executorch/data/bin/",

Comment threadsetup.py
def __init__(self, src: str, dst: str):
def __init__(
self,
src_path: str,

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.

Please call this src_dir since it's specifically a directory. src_path sounds like it could still refer to the path to the source file.

Comment threadsetup.py
ext_modules.append(
BuiltFile("third-party/flatbuffers/flatc", "executorch/data/bin/")
BuiltFile(
"third-party/flatbuffers/%BUILD_TYPE%/",

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.

Will %BUILD_TYPE% always be the final component of the directory path? If so, we could remove the %BUILD_TYPE% placeholder and just add it to the source path inside BuiltFile.

It's ok as-is for now, though.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It is, but it does not have access to the installer in the constructor of BuiltFile.
If I understand correctly, obtaining the build configuration requires access to installer.debug.

Comment threadsetup.py
src: The path to the file to install, relative to the cmake-out
directory. May be an fnmatch-style glob that matches exactly one
file.
src_path: The path to the file to install without name, relative to the cmake-out

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.

Please mention %BUILD_TYPE% here and how to use it.

@python3kgae

Copy link
Copy Markdown
ContributorAuthor

This is looking great!

Consider splitting this into some smaller PRs. E.g. we can probably merge the setup.py stuff pretty quickly, but the FileDataLoader might take longer. And, in general, we prefer to have smaller self-contained PRs.

Created 7 small PRs. Need more time for FileDataLoader.

@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Close after split to small PRs.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA 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 ExecuTorchtriagedThis issue has been looked at a team member, and triaged and prioritized into an appropriate module

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@python3kgae@dbort@kirklandsign@facebook-github-bot@manuelcandales
, '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

[Build] fix build issues for native Windows. - #4681

Closed
python3kgae wants to merge 4 commits into
pytorch:mainfrom
python3kgae:win_bld
Closed

[Build] fix build issues for native Windows.#4681
python3kgae wants to merge 4 commits into
pytorch:mainfrom
python3kgae:win_bld

Conversation

@python3kgae

Copy link
Copy Markdown
Contributor

Add install_requirements.ps1 for build on native Windows.

Also fix issues block build on native Windows.

  1. Get the Windows version of buck2 for Windows.
  2. Check the path based on the build configuration for Windows in setup.py.
  3. Avoid generating 'def flat.exe()' which is illegal python.
  4. Add the Windows version of kernel_link_options.
  5. Add links of pthreadpool and cpuinfo for custom_ops_aot_lib.
  6. Define ssize_t for Windows.

Still have one link issue tracked with #4659.

For #4661

@pytorch-bot

pytorch-botBot commented Aug 13, 2024

Copy link
Copy Markdown

🔗 Helpful Links

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

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

❌ 7 New Failures

As of commit 1b8899c with merge base f887d72 (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 Aug 13, 2024
@manuelcandalesmanuelcandales added module: build/install Issues related to the cmake and buck2 builds, and to installing ExecuTorch triaged This issue has been looked at a team member, and triaged and prioritized into an appropriate module labels Aug 13, 2024
Comment threadbuild/resolve_buck.py

@kirklandsignkirklandsign 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.

Thank you! Is this PR tested and ready for review? Also for the install_requirements.ps1, it's for windows only?

Comment threadextension/data_loader/file_data_loader.cpp Outdated
@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Thank you! Is this PR tested and ready for review? Also for the install_requirements.ps1, it's for windows only?

I didn't really do any real tests except make sure the getting-started-setup works under native Windows and WSL.
Will the CI pipeline test cover all tests or there're some tests must be running locally?

And yes, install_requirements.ps1 is for windows only.

@dbortdbort 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.

Thank you for taking the time to track down and fix all of these issues! I'm generally happy with the approach, but I'd really like to find a way to avoid duplicating so much data and logic from install_requirements.sh.

Will the CI pipeline test cover all tests or there're some tests must be running locally?

Unfortunately the CI pipeline doesn't cover install_requirements.sh right now. If you can, please try running it on a linux and/or mac with your changes. If you don't have access to either, let us know, and we can help testing.

#include <cstddef> // size_t
#include <limits>

#ifdef _WIN32

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 shouldn't be necessary since platform/compiler.h has the same logic.

If this needed to happen because one of the headers between here and line 29 refer to ssize_t, then the header that needs it should also include compiler.h.

But in general, compiler.h is the only place in the ET code that is allowed to have system-specific checks like #ifdef _WIN32

Comment threadruntime/core/portable_type/tensor_impl.h Outdated
Comment threadsetup.py Outdated
Comment threadsetup.py Outdated
item for item in os.environ["CMAKE_BUILD_ARGS"].split(" ") if item
]

if os.name == "nt":

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.

Please add a comment explaining what this does, and why it's only necessary on windows. If it would be safe to use this flag on all systems, I'd rather remove the nt check.

Comment threadsetup.py Outdated
Comment threadsetup.py Outdated
Comment on lines +561 to +562
debug = os.environ.get("DEBUG", 0)
cfg = "Debug" if debug else "Release"

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.

Rather than duplicating this logic, please hoist it (and the other example near line 435) into a common global function like get_build_type() -> str

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Added get_build_type.

Comment threadsetup.py Outdated
)
if os.name == "nt":
ext_modules.append(
BuiltFile(

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.

I'd rather extend BuiltFile to handle this situation in a common way, instead of manually repeating the pattern for every entry.

E.g., it could take an extra is_executable: bool = False param that could be set to true here, letting it know to add the .exe suffix on windows.

And we could embed a CMAKE_BUILD_TYPE (debug vs release) placeholder in the paths that is ignored on non-windows systems. How about

third-party/flatbuffers/%BUILD_TYPE%/flatc

Then, on windows systems we can replace %BUILD_TYPE% with get_build_type(), and on non-windows systems we can delete the string %BUILD_TYPE%/ from the path if present.

So this this entry could become

 ext_modules.append(
BuiltFile(
"third-party/flatbuffers/%BUILD_TYPE%/flatc",
"executorch/data/bin/",
is_executable=True,
)
)

And entries below can use the %BUILD_TYPE% placeholder, and use .* to match .so/.dll/.dylib on different systems.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Updated.

Comment threadextension/data_loader/file_data_loader.cpp Outdated
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#ifndef _WIN32

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.

I really want to avoid _WIN32 checks in any of the code, but this is reasonable for now. The best solution would be to avoid using POSIX concepts and to just use the standard C APIs.

Suggested change
#ifndef _WIN32
// TODO: Rewrite FileDataLoader to use standard C FILE* instead of POSIX file
// descriptors, so that we don't need this _WIN32 check.
#ifndef _WIN32

Comment threadextension/llm/custom_ops/CMakeLists.txt
@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Thank you for taking the time to track down and fix all of these issues! I'm generally happy with the approach, but I'd really like to find a way to avoid duplicating so much data and logic from install_requirements.sh.

Will the CI pipeline test cover all tests or there're some tests must be running locally?

Unfortunately the CI pipeline doesn't cover install_requirements.sh right now. If you can, please try running it on a linux and/or mac with your changes. If you don't have access to either, let us know, and we can help testing.

Thanks for the review.
To avoid duplicating install_requirements.sh, I’m considering rewriting it in portable Python. I’ll give it a try to see if it works.

I don’t have access to Linux or macOS, so I’ll need help testing it on those platforms once I’ve got install_requirements.py working

@python3kgae
python3kgae marked this pull request as draft August 14, 2024 20:39
Added install_requirements.ps1 for build on native Windows.
Also fix issues block build on native Windows.
1. Get the Windows version of buck2 for Windows.
2. Check the path based on the build configuration for Windows in setup.py.
3. Avoid generating 'def flat.exe()' which is illegal python.
4. Add the Windows version of kernel_link_options.
5. Add links of pthreadpool and cpuinfo for custom_ops_aot_lib.
6. Define ssize_t for Windows.
Still have one link issue tracked with pytorch#4659.
For pytorch#4661
@python3kgae
python3kgae marked this pull request as ready for review August 21, 2024 02:15
@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Updated based on the comments.
Tested install_requirements.sh on WSL and install_requirements.bat on Windows.
Need help to test Linux and Mac.

@dbortdbort 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 is looking great!

Consider splitting this into some smaller PRs. E.g. we can probably merge the setup.py stuff pretty quickly, but the FileDataLoader might take longer. And, in general, we prefer to have smaller self-contained PRs.

Comment threadbuild/resolve_buck.py
filepath = os.path.join(dir, filename)
if os.path.isfile(filepath) and os.access(filepath, os.X_OK):
bin_names.append(filename)
# avoid def flat.exe() on windows.

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.

Comments should begin with a capital letter. And I suggest making this a little more general.

Suggested change
# avoid def flat.exe() on windows.
# Remove .exe suffix on windows.

#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#ifndef _WIN32

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.

Heads up that #4760 merged recently, which changes this class to use pread(), which I think will break windows. It might make sense to write a separate WindowsFileDataLoader.

There would be a lot of duplicated code, though. If we needed to split into a windows-specific data loader, it might make sense to have an AbstractFileDataLoader with one pure-virtual protected method to do the actual read.

print(f"Error: Unknown option {arg}")
sys.exit(1)

# Use ClangCL on Windows.

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 comment repeats what the code does, and doesn't provide extra value. Either remove it, or (ideally) add a comment explaining why this logic is necessary. It'd also be helpful to explain what ClangCL is, since non-windows devs will not be familiar with it.

Comment on lines +136 to +141
#ifndef _WIN32
#include <sys/types.h> // TODO(T126923429): Include size_t, ssize_t
#else
#include <stddef.h>
using ssize_t = ptrdiff_t;
#endif

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.

Your PR actually fixes the TODO, so we can remove it.

Suggested change
#ifndef_WIN32
#include<sys/types.h>// TODO(T126923429): Include size_t, ssize_t
#else
#include<stddef.h>
usingssize_t=ptrdiff_t;
#endif
// Define size_t and ssize_t.
#ifndef_WIN32
#include<sys/types.h>
#else
#include<stddef.h>
usingssize_t=ptrdiff_t;
#endif

Comment threadsetup.py
item for item in os.environ["CMAKE_BUILD_ARGS"].split(" ") if item
]

build_args += ["--config", cfg]

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.

Please add a comment explaining why this is necessary.

Comment threadsetup.py
Comment on lines +614 to +616
"third-party/flatbuffers/%BUILD_TYPE%/",
"flatc",
"executorch/data/bin/",

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.

Now that there are more than two params, please use kwargs for all params. Same for other BuiltFile uses below.

Suggested change
"third-party/flatbuffers/%BUILD_TYPE%/",
"flatc",
"executorch/data/bin/",
src_path="third-party/flatbuffers/%BUILD_TYPE%/",
src_name="flatc",
dst="executorch/data/bin/",

Comment threadsetup.py
def __init__(self, src: str, dst: str):
def __init__(
self,
src_path: str,

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.

Please call this src_dir since it's specifically a directory. src_path sounds like it could still refer to the path to the source file.

Comment threadsetup.py
ext_modules.append(
BuiltFile("third-party/flatbuffers/flatc", "executorch/data/bin/")
BuiltFile(
"third-party/flatbuffers/%BUILD_TYPE%/",

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.

Will %BUILD_TYPE% always be the final component of the directory path? If so, we could remove the %BUILD_TYPE% placeholder and just add it to the source path inside BuiltFile.

It's ok as-is for now, though.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It is, but it does not have access to the installer in the constructor of BuiltFile.
If I understand correctly, obtaining the build configuration requires access to installer.debug.

Comment threadsetup.py
src: The path to the file to install, relative to the cmake-out
directory. May be an fnmatch-style glob that matches exactly one
file.
src_path: The path to the file to install without name, relative to the cmake-out

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.

Please mention %BUILD_TYPE% here and how to use it.

@python3kgae

Copy link
Copy Markdown
ContributorAuthor

This is looking great!

Consider splitting this into some smaller PRs. E.g. we can probably merge the setup.py stuff pretty quickly, but the FileDataLoader might take longer. And, in general, we prefer to have smaller self-contained PRs.

Created 7 small PRs. Need more time for FileDataLoader.

@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Close after split to small PRs.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA 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 ExecuTorchtriagedThis issue has been looked at a team member, and triaged and prioritized into an appropriate module

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@python3kgae@dbort@kirklandsign@facebook-github-bot@manuelcandales
, '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

[Build] fix build issues for native Windows. - #4681

Closed
python3kgae wants to merge 4 commits into
pytorch:mainfrom
python3kgae:win_bld
Closed

[Build] fix build issues for native Windows.#4681
python3kgae wants to merge 4 commits into
pytorch:mainfrom
python3kgae:win_bld

Conversation

@python3kgae

Copy link
Copy Markdown
Contributor

Add install_requirements.ps1 for build on native Windows.

Also fix issues block build on native Windows.

  1. Get the Windows version of buck2 for Windows.
  2. Check the path based on the build configuration for Windows in setup.py.
  3. Avoid generating 'def flat.exe()' which is illegal python.
  4. Add the Windows version of kernel_link_options.
  5. Add links of pthreadpool and cpuinfo for custom_ops_aot_lib.
  6. Define ssize_t for Windows.

Still have one link issue tracked with #4659.

For #4661

@pytorch-bot

pytorch-botBot commented Aug 13, 2024

Copy link
Copy Markdown

🔗 Helpful Links

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

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

❌ 7 New Failures

As of commit 1b8899c with merge base f887d72 (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 Aug 13, 2024
@manuelcandalesmanuelcandales added module: build/install Issues related to the cmake and buck2 builds, and to installing ExecuTorch triaged This issue has been looked at a team member, and triaged and prioritized into an appropriate module labels Aug 13, 2024
Comment threadbuild/resolve_buck.py

@kirklandsignkirklandsign 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.

Thank you! Is this PR tested and ready for review? Also for the install_requirements.ps1, it's for windows only?

Comment threadextension/data_loader/file_data_loader.cpp Outdated
@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Thank you! Is this PR tested and ready for review? Also for the install_requirements.ps1, it's for windows only?

I didn't really do any real tests except make sure the getting-started-setup works under native Windows and WSL.
Will the CI pipeline test cover all tests or there're some tests must be running locally?

And yes, install_requirements.ps1 is for windows only.

@dbortdbort 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.

Thank you for taking the time to track down and fix all of these issues! I'm generally happy with the approach, but I'd really like to find a way to avoid duplicating so much data and logic from install_requirements.sh.

Will the CI pipeline test cover all tests or there're some tests must be running locally?

Unfortunately the CI pipeline doesn't cover install_requirements.sh right now. If you can, please try running it on a linux and/or mac with your changes. If you don't have access to either, let us know, and we can help testing.

#include <cstddef> // size_t
#include <limits>

#ifdef _WIN32

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 shouldn't be necessary since platform/compiler.h has the same logic.

If this needed to happen because one of the headers between here and line 29 refer to ssize_t, then the header that needs it should also include compiler.h.

But in general, compiler.h is the only place in the ET code that is allowed to have system-specific checks like #ifdef _WIN32

Comment threadruntime/core/portable_type/tensor_impl.h Outdated
Comment threadsetup.py Outdated
Comment threadsetup.py Outdated
item for item in os.environ["CMAKE_BUILD_ARGS"].split(" ") if item
]

if os.name == "nt":

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.

Please add a comment explaining what this does, and why it's only necessary on windows. If it would be safe to use this flag on all systems, I'd rather remove the nt check.

Comment threadsetup.py Outdated
Comment threadsetup.py Outdated
Comment on lines +561 to +562
debug = os.environ.get("DEBUG", 0)
cfg = "Debug" if debug else "Release"

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.

Rather than duplicating this logic, please hoist it (and the other example near line 435) into a common global function like get_build_type() -> str

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Added get_build_type.

Comment threadsetup.py Outdated
)
if os.name == "nt":
ext_modules.append(
BuiltFile(

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.

I'd rather extend BuiltFile to handle this situation in a common way, instead of manually repeating the pattern for every entry.

E.g., it could take an extra is_executable: bool = False param that could be set to true here, letting it know to add the .exe suffix on windows.

And we could embed a CMAKE_BUILD_TYPE (debug vs release) placeholder in the paths that is ignored on non-windows systems. How about

third-party/flatbuffers/%BUILD_TYPE%/flatc

Then, on windows systems we can replace %BUILD_TYPE% with get_build_type(), and on non-windows systems we can delete the string %BUILD_TYPE%/ from the path if present.

So this this entry could become

 ext_modules.append(
BuiltFile(
"third-party/flatbuffers/%BUILD_TYPE%/flatc",
"executorch/data/bin/",
is_executable=True,
)
)

And entries below can use the %BUILD_TYPE% placeholder, and use .* to match .so/.dll/.dylib on different systems.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Updated.

Comment threadextension/data_loader/file_data_loader.cpp Outdated
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#ifndef _WIN32

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.

I really want to avoid _WIN32 checks in any of the code, but this is reasonable for now. The best solution would be to avoid using POSIX concepts and to just use the standard C APIs.

Suggested change
#ifndef _WIN32
// TODO: Rewrite FileDataLoader to use standard C FILE* instead of POSIX file
// descriptors, so that we don't need this _WIN32 check.
#ifndef _WIN32

Comment threadextension/llm/custom_ops/CMakeLists.txt
@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Thank you for taking the time to track down and fix all of these issues! I'm generally happy with the approach, but I'd really like to find a way to avoid duplicating so much data and logic from install_requirements.sh.

Will the CI pipeline test cover all tests or there're some tests must be running locally?

Unfortunately the CI pipeline doesn't cover install_requirements.sh right now. If you can, please try running it on a linux and/or mac with your changes. If you don't have access to either, let us know, and we can help testing.

Thanks for the review.
To avoid duplicating install_requirements.sh, I’m considering rewriting it in portable Python. I’ll give it a try to see if it works.

I don’t have access to Linux or macOS, so I’ll need help testing it on those platforms once I’ve got install_requirements.py working

@python3kgae
python3kgae marked this pull request as draft August 14, 2024 20:39
Added install_requirements.ps1 for build on native Windows.
Also fix issues block build on native Windows.
1. Get the Windows version of buck2 for Windows.
2. Check the path based on the build configuration for Windows in setup.py.
3. Avoid generating 'def flat.exe()' which is illegal python.
4. Add the Windows version of kernel_link_options.
5. Add links of pthreadpool and cpuinfo for custom_ops_aot_lib.
6. Define ssize_t for Windows.
Still have one link issue tracked with pytorch#4659.
For pytorch#4661
@python3kgae
python3kgae marked this pull request as ready for review August 21, 2024 02:15
@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Updated based on the comments.
Tested install_requirements.sh on WSL and install_requirements.bat on Windows.
Need help to test Linux and Mac.

@dbortdbort 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 is looking great!

Consider splitting this into some smaller PRs. E.g. we can probably merge the setup.py stuff pretty quickly, but the FileDataLoader might take longer. And, in general, we prefer to have smaller self-contained PRs.

Comment threadbuild/resolve_buck.py
filepath = os.path.join(dir, filename)
if os.path.isfile(filepath) and os.access(filepath, os.X_OK):
bin_names.append(filename)
# avoid def flat.exe() on windows.

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.

Comments should begin with a capital letter. And I suggest making this a little more general.

Suggested change
# avoid def flat.exe() on windows.
# Remove .exe suffix on windows.

#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#ifndef _WIN32

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.

Heads up that #4760 merged recently, which changes this class to use pread(), which I think will break windows. It might make sense to write a separate WindowsFileDataLoader.

There would be a lot of duplicated code, though. If we needed to split into a windows-specific data loader, it might make sense to have an AbstractFileDataLoader with one pure-virtual protected method to do the actual read.

print(f"Error: Unknown option {arg}")
sys.exit(1)

# Use ClangCL on Windows.

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 comment repeats what the code does, and doesn't provide extra value. Either remove it, or (ideally) add a comment explaining why this logic is necessary. It'd also be helpful to explain what ClangCL is, since non-windows devs will not be familiar with it.

Comment on lines +136 to +141
#ifndef _WIN32
#include <sys/types.h> // TODO(T126923429): Include size_t, ssize_t
#else
#include <stddef.h>
using ssize_t = ptrdiff_t;
#endif

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.

Your PR actually fixes the TODO, so we can remove it.

Suggested change
#ifndef_WIN32
#include<sys/types.h>// TODO(T126923429): Include size_t, ssize_t
#else
#include<stddef.h>
usingssize_t=ptrdiff_t;
#endif
// Define size_t and ssize_t.
#ifndef_WIN32
#include<sys/types.h>
#else
#include<stddef.h>
usingssize_t=ptrdiff_t;
#endif

Comment threadsetup.py
item for item in os.environ["CMAKE_BUILD_ARGS"].split(" ") if item
]

build_args += ["--config", cfg]

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.

Please add a comment explaining why this is necessary.

Comment threadsetup.py
Comment on lines +614 to +616
"third-party/flatbuffers/%BUILD_TYPE%/",
"flatc",
"executorch/data/bin/",

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.

Now that there are more than two params, please use kwargs for all params. Same for other BuiltFile uses below.

Suggested change
"third-party/flatbuffers/%BUILD_TYPE%/",
"flatc",
"executorch/data/bin/",
src_path="third-party/flatbuffers/%BUILD_TYPE%/",
src_name="flatc",
dst="executorch/data/bin/",

Comment threadsetup.py
def __init__(self, src: str, dst: str):
def __init__(
self,
src_path: str,

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.

Please call this src_dir since it's specifically a directory. src_path sounds like it could still refer to the path to the source file.

Comment threadsetup.py
ext_modules.append(
BuiltFile("third-party/flatbuffers/flatc", "executorch/data/bin/")
BuiltFile(
"third-party/flatbuffers/%BUILD_TYPE%/",

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.

Will %BUILD_TYPE% always be the final component of the directory path? If so, we could remove the %BUILD_TYPE% placeholder and just add it to the source path inside BuiltFile.

It's ok as-is for now, though.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It is, but it does not have access to the installer in the constructor of BuiltFile.
If I understand correctly, obtaining the build configuration requires access to installer.debug.

Comment threadsetup.py
src: The path to the file to install, relative to the cmake-out
directory. May be an fnmatch-style glob that matches exactly one
file.
src_path: The path to the file to install without name, relative to the cmake-out

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.

Please mention %BUILD_TYPE% here and how to use it.

@python3kgae

Copy link
Copy Markdown
ContributorAuthor

This is looking great!

Consider splitting this into some smaller PRs. E.g. we can probably merge the setup.py stuff pretty quickly, but the FileDataLoader might take longer. And, in general, we prefer to have smaller self-contained PRs.

Created 7 small PRs. Need more time for FileDataLoader.

@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Close after split to small PRs.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA 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 ExecuTorchtriagedThis issue has been looked at a team member, and triaged and prioritized into an appropriate module

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@python3kgae@dbort@kirklandsign@facebook-github-bot@manuelcandales
, '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

[Build] fix build issues for native Windows. - #4681

Closed
python3kgae wants to merge 4 commits into
pytorch:mainfrom
python3kgae:win_bld
Closed

[Build] fix build issues for native Windows.#4681
python3kgae wants to merge 4 commits into
pytorch:mainfrom
python3kgae:win_bld

Conversation

@python3kgae

Copy link
Copy Markdown
Contributor

Add install_requirements.ps1 for build on native Windows.

Also fix issues block build on native Windows.

  1. Get the Windows version of buck2 for Windows.
  2. Check the path based on the build configuration for Windows in setup.py.
  3. Avoid generating 'def flat.exe()' which is illegal python.
  4. Add the Windows version of kernel_link_options.
  5. Add links of pthreadpool and cpuinfo for custom_ops_aot_lib.
  6. Define ssize_t for Windows.

Still have one link issue tracked with #4659.

For #4661

@pytorch-bot

pytorch-botBot commented Aug 13, 2024

Copy link
Copy Markdown

🔗 Helpful Links

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

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

❌ 7 New Failures

As of commit 1b8899c with merge base f887d72 (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 Aug 13, 2024
@manuelcandalesmanuelcandales added module: build/install Issues related to the cmake and buck2 builds, and to installing ExecuTorch triaged This issue has been looked at a team member, and triaged and prioritized into an appropriate module labels Aug 13, 2024
Comment threadbuild/resolve_buck.py

@kirklandsignkirklandsign 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.

Thank you! Is this PR tested and ready for review? Also for the install_requirements.ps1, it's for windows only?

Comment threadextension/data_loader/file_data_loader.cpp Outdated
@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Thank you! Is this PR tested and ready for review? Also for the install_requirements.ps1, it's for windows only?

I didn't really do any real tests except make sure the getting-started-setup works under native Windows and WSL.
Will the CI pipeline test cover all tests or there're some tests must be running locally?

And yes, install_requirements.ps1 is for windows only.

@dbortdbort 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.

Thank you for taking the time to track down and fix all of these issues! I'm generally happy with the approach, but I'd really like to find a way to avoid duplicating so much data and logic from install_requirements.sh.

Will the CI pipeline test cover all tests or there're some tests must be running locally?

Unfortunately the CI pipeline doesn't cover install_requirements.sh right now. If you can, please try running it on a linux and/or mac with your changes. If you don't have access to either, let us know, and we can help testing.

#include <cstddef> // size_t
#include <limits>

#ifdef _WIN32

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 shouldn't be necessary since platform/compiler.h has the same logic.

If this needed to happen because one of the headers between here and line 29 refer to ssize_t, then the header that needs it should also include compiler.h.

But in general, compiler.h is the only place in the ET code that is allowed to have system-specific checks like #ifdef _WIN32

Comment threadruntime/core/portable_type/tensor_impl.h Outdated
Comment threadsetup.py Outdated
Comment threadsetup.py Outdated
item for item in os.environ["CMAKE_BUILD_ARGS"].split(" ") if item
]

if os.name == "nt":

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.

Please add a comment explaining what this does, and why it's only necessary on windows. If it would be safe to use this flag on all systems, I'd rather remove the nt check.

Comment threadsetup.py Outdated
Comment threadsetup.py Outdated
Comment on lines +561 to +562
debug = os.environ.get("DEBUG", 0)
cfg = "Debug" if debug else "Release"

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.

Rather than duplicating this logic, please hoist it (and the other example near line 435) into a common global function like get_build_type() -> str

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Added get_build_type.

Comment threadsetup.py Outdated
)
if os.name == "nt":
ext_modules.append(
BuiltFile(

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.

I'd rather extend BuiltFile to handle this situation in a common way, instead of manually repeating the pattern for every entry.

E.g., it could take an extra is_executable: bool = False param that could be set to true here, letting it know to add the .exe suffix on windows.

And we could embed a CMAKE_BUILD_TYPE (debug vs release) placeholder in the paths that is ignored on non-windows systems. How about

third-party/flatbuffers/%BUILD_TYPE%/flatc

Then, on windows systems we can replace %BUILD_TYPE% with get_build_type(), and on non-windows systems we can delete the string %BUILD_TYPE%/ from the path if present.

So this this entry could become

 ext_modules.append(
BuiltFile(
"third-party/flatbuffers/%BUILD_TYPE%/flatc",
"executorch/data/bin/",
is_executable=True,
)
)

And entries below can use the %BUILD_TYPE% placeholder, and use .* to match .so/.dll/.dylib on different systems.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Updated.

Comment threadextension/data_loader/file_data_loader.cpp Outdated
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#ifndef _WIN32

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.

I really want to avoid _WIN32 checks in any of the code, but this is reasonable for now. The best solution would be to avoid using POSIX concepts and to just use the standard C APIs.

Suggested change
#ifndef _WIN32
// TODO: Rewrite FileDataLoader to use standard C FILE* instead of POSIX file
// descriptors, so that we don't need this _WIN32 check.
#ifndef _WIN32

Comment threadextension/llm/custom_ops/CMakeLists.txt
@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Thank you for taking the time to track down and fix all of these issues! I'm generally happy with the approach, but I'd really like to find a way to avoid duplicating so much data and logic from install_requirements.sh.

Will the CI pipeline test cover all tests or there're some tests must be running locally?

Unfortunately the CI pipeline doesn't cover install_requirements.sh right now. If you can, please try running it on a linux and/or mac with your changes. If you don't have access to either, let us know, and we can help testing.

Thanks for the review.
To avoid duplicating install_requirements.sh, I’m considering rewriting it in portable Python. I’ll give it a try to see if it works.

I don’t have access to Linux or macOS, so I’ll need help testing it on those platforms once I’ve got install_requirements.py working

@python3kgae
python3kgae marked this pull request as draft August 14, 2024 20:39
Added install_requirements.ps1 for build on native Windows.
Also fix issues block build on native Windows.
1. Get the Windows version of buck2 for Windows.
2. Check the path based on the build configuration for Windows in setup.py.
3. Avoid generating 'def flat.exe()' which is illegal python.
4. Add the Windows version of kernel_link_options.
5. Add links of pthreadpool and cpuinfo for custom_ops_aot_lib.
6. Define ssize_t for Windows.
Still have one link issue tracked with pytorch#4659.
For pytorch#4661
@python3kgae
python3kgae marked this pull request as ready for review August 21, 2024 02:15
@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Updated based on the comments.
Tested install_requirements.sh on WSL and install_requirements.bat on Windows.
Need help to test Linux and Mac.

@dbortdbort 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 is looking great!

Consider splitting this into some smaller PRs. E.g. we can probably merge the setup.py stuff pretty quickly, but the FileDataLoader might take longer. And, in general, we prefer to have smaller self-contained PRs.

Comment threadbuild/resolve_buck.py
filepath = os.path.join(dir, filename)
if os.path.isfile(filepath) and os.access(filepath, os.X_OK):
bin_names.append(filename)
# avoid def flat.exe() on windows.

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.

Comments should begin with a capital letter. And I suggest making this a little more general.

Suggested change
# avoid def flat.exe() on windows.
# Remove .exe suffix on windows.

#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#ifndef _WIN32

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.

Heads up that #4760 merged recently, which changes this class to use pread(), which I think will break windows. It might make sense to write a separate WindowsFileDataLoader.

There would be a lot of duplicated code, though. If we needed to split into a windows-specific data loader, it might make sense to have an AbstractFileDataLoader with one pure-virtual protected method to do the actual read.

print(f"Error: Unknown option {arg}")
sys.exit(1)

# Use ClangCL on Windows.

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 comment repeats what the code does, and doesn't provide extra value. Either remove it, or (ideally) add a comment explaining why this logic is necessary. It'd also be helpful to explain what ClangCL is, since non-windows devs will not be familiar with it.

Comment on lines +136 to +141
#ifndef _WIN32
#include <sys/types.h> // TODO(T126923429): Include size_t, ssize_t
#else
#include <stddef.h>
using ssize_t = ptrdiff_t;
#endif

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.

Your PR actually fixes the TODO, so we can remove it.

Suggested change
#ifndef_WIN32
#include<sys/types.h>// TODO(T126923429): Include size_t, ssize_t
#else
#include<stddef.h>
usingssize_t=ptrdiff_t;
#endif
// Define size_t and ssize_t.
#ifndef_WIN32
#include<sys/types.h>
#else
#include<stddef.h>
usingssize_t=ptrdiff_t;
#endif

Comment threadsetup.py
item for item in os.environ["CMAKE_BUILD_ARGS"].split(" ") if item
]

build_args += ["--config", cfg]

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.

Please add a comment explaining why this is necessary.

Comment threadsetup.py
Comment on lines +614 to +616
"third-party/flatbuffers/%BUILD_TYPE%/",
"flatc",
"executorch/data/bin/",

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.

Now that there are more than two params, please use kwargs for all params. Same for other BuiltFile uses below.

Suggested change
"third-party/flatbuffers/%BUILD_TYPE%/",
"flatc",
"executorch/data/bin/",
src_path="third-party/flatbuffers/%BUILD_TYPE%/",
src_name="flatc",
dst="executorch/data/bin/",

Comment threadsetup.py
def __init__(self, src: str, dst: str):
def __init__(
self,
src_path: str,

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.

Please call this src_dir since it's specifically a directory. src_path sounds like it could still refer to the path to the source file.

Comment threadsetup.py
ext_modules.append(
BuiltFile("third-party/flatbuffers/flatc", "executorch/data/bin/")
BuiltFile(
"third-party/flatbuffers/%BUILD_TYPE%/",

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.

Will %BUILD_TYPE% always be the final component of the directory path? If so, we could remove the %BUILD_TYPE% placeholder and just add it to the source path inside BuiltFile.

It's ok as-is for now, though.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It is, but it does not have access to the installer in the constructor of BuiltFile.
If I understand correctly, obtaining the build configuration requires access to installer.debug.

Comment threadsetup.py
src: The path to the file to install, relative to the cmake-out
directory. May be an fnmatch-style glob that matches exactly one
file.
src_path: The path to the file to install without name, relative to the cmake-out

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.

Please mention %BUILD_TYPE% here and how to use it.

@python3kgae

Copy link
Copy Markdown
ContributorAuthor

This is looking great!

Consider splitting this into some smaller PRs. E.g. we can probably merge the setup.py stuff pretty quickly, but the FileDataLoader might take longer. And, in general, we prefer to have smaller self-contained PRs.

Created 7 small PRs. Need more time for FileDataLoader.

@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Close after split to small PRs.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA 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 ExecuTorchtriagedThis issue has been looked at a team member, and triaged and prioritized into an appropriate module

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@python3kgae@dbort@kirklandsign@facebook-github-bot@manuelcandales
, '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

[Build] fix build issues for native Windows. - #4681

Closed
python3kgae wants to merge 4 commits into
pytorch:mainfrom
python3kgae:win_bld
Closed

[Build] fix build issues for native Windows.#4681
python3kgae wants to merge 4 commits into
pytorch:mainfrom
python3kgae:win_bld

Conversation

@python3kgae

Copy link
Copy Markdown
Contributor

Add install_requirements.ps1 for build on native Windows.

Also fix issues block build on native Windows.

  1. Get the Windows version of buck2 for Windows.
  2. Check the path based on the build configuration for Windows in setup.py.
  3. Avoid generating 'def flat.exe()' which is illegal python.
  4. Add the Windows version of kernel_link_options.
  5. Add links of pthreadpool and cpuinfo for custom_ops_aot_lib.
  6. Define ssize_t for Windows.

Still have one link issue tracked with #4659.

For #4661

@pytorch-bot

pytorch-botBot commented Aug 13, 2024

Copy link
Copy Markdown

🔗 Helpful Links

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

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

❌ 7 New Failures

As of commit 1b8899c with merge base f887d72 (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 Aug 13, 2024
@manuelcandalesmanuelcandales added module: build/install Issues related to the cmake and buck2 builds, and to installing ExecuTorch triaged This issue has been looked at a team member, and triaged and prioritized into an appropriate module labels Aug 13, 2024
Comment threadbuild/resolve_buck.py

@kirklandsignkirklandsign 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.

Thank you! Is this PR tested and ready for review? Also for the install_requirements.ps1, it's for windows only?

Comment threadextension/data_loader/file_data_loader.cpp Outdated
@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Thank you! Is this PR tested and ready for review? Also for the install_requirements.ps1, it's for windows only?

I didn't really do any real tests except make sure the getting-started-setup works under native Windows and WSL.
Will the CI pipeline test cover all tests or there're some tests must be running locally?

And yes, install_requirements.ps1 is for windows only.

@dbortdbort 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.

Thank you for taking the time to track down and fix all of these issues! I'm generally happy with the approach, but I'd really like to find a way to avoid duplicating so much data and logic from install_requirements.sh.

Will the CI pipeline test cover all tests or there're some tests must be running locally?

Unfortunately the CI pipeline doesn't cover install_requirements.sh right now. If you can, please try running it on a linux and/or mac with your changes. If you don't have access to either, let us know, and we can help testing.

#include <cstddef> // size_t
#include <limits>

#ifdef _WIN32

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 shouldn't be necessary since platform/compiler.h has the same logic.

If this needed to happen because one of the headers between here and line 29 refer to ssize_t, then the header that needs it should also include compiler.h.

But in general, compiler.h is the only place in the ET code that is allowed to have system-specific checks like #ifdef _WIN32

Comment threadruntime/core/portable_type/tensor_impl.h Outdated
Comment threadsetup.py Outdated
Comment threadsetup.py Outdated
item for item in os.environ["CMAKE_BUILD_ARGS"].split(" ") if item
]

if os.name == "nt":

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.

Please add a comment explaining what this does, and why it's only necessary on windows. If it would be safe to use this flag on all systems, I'd rather remove the nt check.

Comment threadsetup.py Outdated
Comment threadsetup.py Outdated
Comment on lines +561 to +562
debug = os.environ.get("DEBUG", 0)
cfg = "Debug" if debug else "Release"

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.

Rather than duplicating this logic, please hoist it (and the other example near line 435) into a common global function like get_build_type() -> str

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Added get_build_type.

Comment threadsetup.py Outdated
)
if os.name == "nt":
ext_modules.append(
BuiltFile(

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.

I'd rather extend BuiltFile to handle this situation in a common way, instead of manually repeating the pattern for every entry.

E.g., it could take an extra is_executable: bool = False param that could be set to true here, letting it know to add the .exe suffix on windows.

And we could embed a CMAKE_BUILD_TYPE (debug vs release) placeholder in the paths that is ignored on non-windows systems. How about

third-party/flatbuffers/%BUILD_TYPE%/flatc

Then, on windows systems we can replace %BUILD_TYPE% with get_build_type(), and on non-windows systems we can delete the string %BUILD_TYPE%/ from the path if present.

So this this entry could become

 ext_modules.append(
BuiltFile(
"third-party/flatbuffers/%BUILD_TYPE%/flatc",
"executorch/data/bin/",
is_executable=True,
)
)

And entries below can use the %BUILD_TYPE% placeholder, and use .* to match .so/.dll/.dylib on different systems.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Updated.

Comment threadextension/data_loader/file_data_loader.cpp Outdated
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#ifndef _WIN32

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.

I really want to avoid _WIN32 checks in any of the code, but this is reasonable for now. The best solution would be to avoid using POSIX concepts and to just use the standard C APIs.

Suggested change
#ifndef _WIN32
// TODO: Rewrite FileDataLoader to use standard C FILE* instead of POSIX file
// descriptors, so that we don't need this _WIN32 check.
#ifndef _WIN32

Comment threadextension/llm/custom_ops/CMakeLists.txt
@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Thank you for taking the time to track down and fix all of these issues! I'm generally happy with the approach, but I'd really like to find a way to avoid duplicating so much data and logic from install_requirements.sh.

Will the CI pipeline test cover all tests or there're some tests must be running locally?

Unfortunately the CI pipeline doesn't cover install_requirements.sh right now. If you can, please try running it on a linux and/or mac with your changes. If you don't have access to either, let us know, and we can help testing.

Thanks for the review.
To avoid duplicating install_requirements.sh, I’m considering rewriting it in portable Python. I’ll give it a try to see if it works.

I don’t have access to Linux or macOS, so I’ll need help testing it on those platforms once I’ve got install_requirements.py working

@python3kgae
python3kgae marked this pull request as draft August 14, 2024 20:39
Added install_requirements.ps1 for build on native Windows.
Also fix issues block build on native Windows.
1. Get the Windows version of buck2 for Windows.
2. Check the path based on the build configuration for Windows in setup.py.
3. Avoid generating 'def flat.exe()' which is illegal python.
4. Add the Windows version of kernel_link_options.
5. Add links of pthreadpool and cpuinfo for custom_ops_aot_lib.
6. Define ssize_t for Windows.
Still have one link issue tracked with pytorch#4659.
For pytorch#4661
@python3kgae
python3kgae marked this pull request as ready for review August 21, 2024 02:15
@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Updated based on the comments.
Tested install_requirements.sh on WSL and install_requirements.bat on Windows.
Need help to test Linux and Mac.

@dbortdbort 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 is looking great!

Consider splitting this into some smaller PRs. E.g. we can probably merge the setup.py stuff pretty quickly, but the FileDataLoader might take longer. And, in general, we prefer to have smaller self-contained PRs.

Comment threadbuild/resolve_buck.py
filepath = os.path.join(dir, filename)
if os.path.isfile(filepath) and os.access(filepath, os.X_OK):
bin_names.append(filename)
# avoid def flat.exe() on windows.

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.

Comments should begin with a capital letter. And I suggest making this a little more general.

Suggested change
# avoid def flat.exe() on windows.
# Remove .exe suffix on windows.

#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#ifndef _WIN32

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.

Heads up that #4760 merged recently, which changes this class to use pread(), which I think will break windows. It might make sense to write a separate WindowsFileDataLoader.

There would be a lot of duplicated code, though. If we needed to split into a windows-specific data loader, it might make sense to have an AbstractFileDataLoader with one pure-virtual protected method to do the actual read.

print(f"Error: Unknown option {arg}")
sys.exit(1)

# Use ClangCL on Windows.

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 comment repeats what the code does, and doesn't provide extra value. Either remove it, or (ideally) add a comment explaining why this logic is necessary. It'd also be helpful to explain what ClangCL is, since non-windows devs will not be familiar with it.

Comment on lines +136 to +141
#ifndef _WIN32
#include <sys/types.h> // TODO(T126923429): Include size_t, ssize_t
#else
#include <stddef.h>
using ssize_t = ptrdiff_t;
#endif

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.

Your PR actually fixes the TODO, so we can remove it.

Suggested change
#ifndef_WIN32
#include<sys/types.h>// TODO(T126923429): Include size_t, ssize_t
#else
#include<stddef.h>
usingssize_t=ptrdiff_t;
#endif
// Define size_t and ssize_t.
#ifndef_WIN32
#include<sys/types.h>
#else
#include<stddef.h>
usingssize_t=ptrdiff_t;
#endif

Comment threadsetup.py
item for item in os.environ["CMAKE_BUILD_ARGS"].split(" ") if item
]

build_args += ["--config", cfg]

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.

Please add a comment explaining why this is necessary.

Comment threadsetup.py
Comment on lines +614 to +616
"third-party/flatbuffers/%BUILD_TYPE%/",
"flatc",
"executorch/data/bin/",

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.

Now that there are more than two params, please use kwargs for all params. Same for other BuiltFile uses below.

Suggested change
"third-party/flatbuffers/%BUILD_TYPE%/",
"flatc",
"executorch/data/bin/",
src_path="third-party/flatbuffers/%BUILD_TYPE%/",
src_name="flatc",
dst="executorch/data/bin/",

Comment threadsetup.py
def __init__(self, src: str, dst: str):
def __init__(
self,
src_path: str,

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.

Please call this src_dir since it's specifically a directory. src_path sounds like it could still refer to the path to the source file.

Comment threadsetup.py
ext_modules.append(
BuiltFile("third-party/flatbuffers/flatc", "executorch/data/bin/")
BuiltFile(
"third-party/flatbuffers/%BUILD_TYPE%/",

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.

Will %BUILD_TYPE% always be the final component of the directory path? If so, we could remove the %BUILD_TYPE% placeholder and just add it to the source path inside BuiltFile.

It's ok as-is for now, though.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It is, but it does not have access to the installer in the constructor of BuiltFile.
If I understand correctly, obtaining the build configuration requires access to installer.debug.

Comment threadsetup.py
src: The path to the file to install, relative to the cmake-out
directory. May be an fnmatch-style glob that matches exactly one
file.
src_path: The path to the file to install without name, relative to the cmake-out

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.

Please mention %BUILD_TYPE% here and how to use it.

@python3kgae

Copy link
Copy Markdown
ContributorAuthor

This is looking great!

Consider splitting this into some smaller PRs. E.g. we can probably merge the setup.py stuff pretty quickly, but the FileDataLoader might take longer. And, in general, we prefer to have smaller self-contained PRs.

Created 7 small PRs. Need more time for FileDataLoader.

@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Close after split to small PRs.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA 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 ExecuTorchtriagedThis issue has been looked at a team member, and triaged and prioritized into an appropriate module

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@python3kgae@dbort@kirklandsign@facebook-github-bot@manuelcandales
, '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

[Build] fix build issues for native Windows. - #4681

Closed
python3kgae wants to merge 4 commits into
pytorch:mainfrom
python3kgae:win_bld
Closed

[Build] fix build issues for native Windows.#4681
python3kgae wants to merge 4 commits into
pytorch:mainfrom
python3kgae:win_bld

Conversation

@python3kgae

Copy link
Copy Markdown
Contributor

Add install_requirements.ps1 for build on native Windows.

Also fix issues block build on native Windows.

  1. Get the Windows version of buck2 for Windows.
  2. Check the path based on the build configuration for Windows in setup.py.
  3. Avoid generating 'def flat.exe()' which is illegal python.
  4. Add the Windows version of kernel_link_options.
  5. Add links of pthreadpool and cpuinfo for custom_ops_aot_lib.
  6. Define ssize_t for Windows.

Still have one link issue tracked with #4659.

For #4661

@pytorch-bot

pytorch-botBot commented Aug 13, 2024

Copy link
Copy Markdown

🔗 Helpful Links

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

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

❌ 7 New Failures

As of commit 1b8899c with merge base f887d72 (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 Aug 13, 2024
@manuelcandalesmanuelcandales added module: build/install Issues related to the cmake and buck2 builds, and to installing ExecuTorch triaged This issue has been looked at a team member, and triaged and prioritized into an appropriate module labels Aug 13, 2024
Comment threadbuild/resolve_buck.py

@kirklandsignkirklandsign 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.

Thank you! Is this PR tested and ready for review? Also for the install_requirements.ps1, it's for windows only?

Comment threadextension/data_loader/file_data_loader.cpp Outdated
@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Thank you! Is this PR tested and ready for review? Also for the install_requirements.ps1, it's for windows only?

I didn't really do any real tests except make sure the getting-started-setup works under native Windows and WSL.
Will the CI pipeline test cover all tests or there're some tests must be running locally?

And yes, install_requirements.ps1 is for windows only.

@dbortdbort 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.

Thank you for taking the time to track down and fix all of these issues! I'm generally happy with the approach, but I'd really like to find a way to avoid duplicating so much data and logic from install_requirements.sh.

Will the CI pipeline test cover all tests or there're some tests must be running locally?

Unfortunately the CI pipeline doesn't cover install_requirements.sh right now. If you can, please try running it on a linux and/or mac with your changes. If you don't have access to either, let us know, and we can help testing.

#include <cstddef> // size_t
#include <limits>

#ifdef _WIN32

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 shouldn't be necessary since platform/compiler.h has the same logic.

If this needed to happen because one of the headers between here and line 29 refer to ssize_t, then the header that needs it should also include compiler.h.

But in general, compiler.h is the only place in the ET code that is allowed to have system-specific checks like #ifdef _WIN32

Comment threadruntime/core/portable_type/tensor_impl.h Outdated
Comment threadsetup.py Outdated
Comment threadsetup.py Outdated
item for item in os.environ["CMAKE_BUILD_ARGS"].split(" ") if item
]

if os.name == "nt":

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.

Please add a comment explaining what this does, and why it's only necessary on windows. If it would be safe to use this flag on all systems, I'd rather remove the nt check.

Comment threadsetup.py Outdated
Comment threadsetup.py Outdated
Comment on lines +561 to +562
debug = os.environ.get("DEBUG", 0)
cfg = "Debug" if debug else "Release"

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.

Rather than duplicating this logic, please hoist it (and the other example near line 435) into a common global function like get_build_type() -> str

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Added get_build_type.

Comment threadsetup.py Outdated
)
if os.name == "nt":
ext_modules.append(
BuiltFile(

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.

I'd rather extend BuiltFile to handle this situation in a common way, instead of manually repeating the pattern for every entry.

E.g., it could take an extra is_executable: bool = False param that could be set to true here, letting it know to add the .exe suffix on windows.

And we could embed a CMAKE_BUILD_TYPE (debug vs release) placeholder in the paths that is ignored on non-windows systems. How about

third-party/flatbuffers/%BUILD_TYPE%/flatc

Then, on windows systems we can replace %BUILD_TYPE% with get_build_type(), and on non-windows systems we can delete the string %BUILD_TYPE%/ from the path if present.

So this this entry could become

 ext_modules.append(
BuiltFile(
"third-party/flatbuffers/%BUILD_TYPE%/flatc",
"executorch/data/bin/",
is_executable=True,
)
)

And entries below can use the %BUILD_TYPE% placeholder, and use .* to match .so/.dll/.dylib on different systems.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Updated.

Comment threadextension/data_loader/file_data_loader.cpp Outdated
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#ifndef _WIN32

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.

I really want to avoid _WIN32 checks in any of the code, but this is reasonable for now. The best solution would be to avoid using POSIX concepts and to just use the standard C APIs.

Suggested change
#ifndef _WIN32
// TODO: Rewrite FileDataLoader to use standard C FILE* instead of POSIX file
// descriptors, so that we don't need this _WIN32 check.
#ifndef _WIN32

Comment threadextension/llm/custom_ops/CMakeLists.txt
@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Thank you for taking the time to track down and fix all of these issues! I'm generally happy with the approach, but I'd really like to find a way to avoid duplicating so much data and logic from install_requirements.sh.

Will the CI pipeline test cover all tests or there're some tests must be running locally?

Unfortunately the CI pipeline doesn't cover install_requirements.sh right now. If you can, please try running it on a linux and/or mac with your changes. If you don't have access to either, let us know, and we can help testing.

Thanks for the review.
To avoid duplicating install_requirements.sh, I’m considering rewriting it in portable Python. I’ll give it a try to see if it works.

I don’t have access to Linux or macOS, so I’ll need help testing it on those platforms once I’ve got install_requirements.py working

@python3kgae
python3kgae marked this pull request as draft August 14, 2024 20:39
Added install_requirements.ps1 for build on native Windows.
Also fix issues block build on native Windows.
1. Get the Windows version of buck2 for Windows.
2. Check the path based on the build configuration for Windows in setup.py.
3. Avoid generating 'def flat.exe()' which is illegal python.
4. Add the Windows version of kernel_link_options.
5. Add links of pthreadpool and cpuinfo for custom_ops_aot_lib.
6. Define ssize_t for Windows.
Still have one link issue tracked with pytorch#4659.
For pytorch#4661
@python3kgae
python3kgae marked this pull request as ready for review August 21, 2024 02:15
@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Updated based on the comments.
Tested install_requirements.sh on WSL and install_requirements.bat on Windows.
Need help to test Linux and Mac.

@dbortdbort 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 is looking great!

Consider splitting this into some smaller PRs. E.g. we can probably merge the setup.py stuff pretty quickly, but the FileDataLoader might take longer. And, in general, we prefer to have smaller self-contained PRs.

Comment threadbuild/resolve_buck.py
filepath = os.path.join(dir, filename)
if os.path.isfile(filepath) and os.access(filepath, os.X_OK):
bin_names.append(filename)
# avoid def flat.exe() on windows.

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.

Comments should begin with a capital letter. And I suggest making this a little more general.

Suggested change
# avoid def flat.exe() on windows.
# Remove .exe suffix on windows.

#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#ifndef _WIN32

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.

Heads up that #4760 merged recently, which changes this class to use pread(), which I think will break windows. It might make sense to write a separate WindowsFileDataLoader.

There would be a lot of duplicated code, though. If we needed to split into a windows-specific data loader, it might make sense to have an AbstractFileDataLoader with one pure-virtual protected method to do the actual read.

print(f"Error: Unknown option {arg}")
sys.exit(1)

# Use ClangCL on Windows.

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 comment repeats what the code does, and doesn't provide extra value. Either remove it, or (ideally) add a comment explaining why this logic is necessary. It'd also be helpful to explain what ClangCL is, since non-windows devs will not be familiar with it.

Comment on lines +136 to +141
#ifndef _WIN32
#include <sys/types.h> // TODO(T126923429): Include size_t, ssize_t
#else
#include <stddef.h>
using ssize_t = ptrdiff_t;
#endif

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.

Your PR actually fixes the TODO, so we can remove it.

Suggested change
#ifndef_WIN32
#include<sys/types.h>// TODO(T126923429): Include size_t, ssize_t
#else
#include<stddef.h>
usingssize_t=ptrdiff_t;
#endif
// Define size_t and ssize_t.
#ifndef_WIN32
#include<sys/types.h>
#else
#include<stddef.h>
usingssize_t=ptrdiff_t;
#endif

Comment threadsetup.py
item for item in os.environ["CMAKE_BUILD_ARGS"].split(" ") if item
]

build_args += ["--config", cfg]

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.

Please add a comment explaining why this is necessary.

Comment threadsetup.py
Comment on lines +614 to +616
"third-party/flatbuffers/%BUILD_TYPE%/",
"flatc",
"executorch/data/bin/",

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.

Now that there are more than two params, please use kwargs for all params. Same for other BuiltFile uses below.

Suggested change
"third-party/flatbuffers/%BUILD_TYPE%/",
"flatc",
"executorch/data/bin/",
src_path="third-party/flatbuffers/%BUILD_TYPE%/",
src_name="flatc",
dst="executorch/data/bin/",

Comment threadsetup.py
def __init__(self, src: str, dst: str):
def __init__(
self,
src_path: str,

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.

Please call this src_dir since it's specifically a directory. src_path sounds like it could still refer to the path to the source file.

Comment threadsetup.py
ext_modules.append(
BuiltFile("third-party/flatbuffers/flatc", "executorch/data/bin/")
BuiltFile(
"third-party/flatbuffers/%BUILD_TYPE%/",

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.

Will %BUILD_TYPE% always be the final component of the directory path? If so, we could remove the %BUILD_TYPE% placeholder and just add it to the source path inside BuiltFile.

It's ok as-is for now, though.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It is, but it does not have access to the installer in the constructor of BuiltFile.
If I understand correctly, obtaining the build configuration requires access to installer.debug.

Comment threadsetup.py
src: The path to the file to install, relative to the cmake-out
directory. May be an fnmatch-style glob that matches exactly one
file.
src_path: The path to the file to install without name, relative to the cmake-out

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.

Please mention %BUILD_TYPE% here and how to use it.

@python3kgae

Copy link
Copy Markdown
ContributorAuthor

This is looking great!

Consider splitting this into some smaller PRs. E.g. we can probably merge the setup.py stuff pretty quickly, but the FileDataLoader might take longer. And, in general, we prefer to have smaller self-contained PRs.

Created 7 small PRs. Need more time for FileDataLoader.

@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Close after split to small PRs.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA 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 ExecuTorchtriagedThis issue has been looked at a team member, and triaged and prioritized into an appropriate module

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@python3kgae@dbort@kirklandsign@facebook-github-bot@manuelcandales
, '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

[Build] fix build issues for native Windows. - #4681

Closed
python3kgae wants to merge 4 commits into
pytorch:mainfrom
python3kgae:win_bld
Closed

[Build] fix build issues for native Windows.#4681
python3kgae wants to merge 4 commits into
pytorch:mainfrom
python3kgae:win_bld

Conversation

@python3kgae

Copy link
Copy Markdown
Contributor

Add install_requirements.ps1 for build on native Windows.

Also fix issues block build on native Windows.

  1. Get the Windows version of buck2 for Windows.
  2. Check the path based on the build configuration for Windows in setup.py.
  3. Avoid generating 'def flat.exe()' which is illegal python.
  4. Add the Windows version of kernel_link_options.
  5. Add links of pthreadpool and cpuinfo for custom_ops_aot_lib.
  6. Define ssize_t for Windows.

Still have one link issue tracked with #4659.

For #4661

@pytorch-bot

pytorch-botBot commented Aug 13, 2024

Copy link
Copy Markdown

🔗 Helpful Links

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

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

❌ 7 New Failures

As of commit 1b8899c with merge base f887d72 (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 Aug 13, 2024
@manuelcandalesmanuelcandales added module: build/install Issues related to the cmake and buck2 builds, and to installing ExecuTorch triaged This issue has been looked at a team member, and triaged and prioritized into an appropriate module labels Aug 13, 2024
Comment threadbuild/resolve_buck.py

@kirklandsignkirklandsign 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.

Thank you! Is this PR tested and ready for review? Also for the install_requirements.ps1, it's for windows only?

Comment threadextension/data_loader/file_data_loader.cpp Outdated
@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Thank you! Is this PR tested and ready for review? Also for the install_requirements.ps1, it's for windows only?

I didn't really do any real tests except make sure the getting-started-setup works under native Windows and WSL.
Will the CI pipeline test cover all tests or there're some tests must be running locally?

And yes, install_requirements.ps1 is for windows only.

@dbortdbort 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.

Thank you for taking the time to track down and fix all of these issues! I'm generally happy with the approach, but I'd really like to find a way to avoid duplicating so much data and logic from install_requirements.sh.

Will the CI pipeline test cover all tests or there're some tests must be running locally?

Unfortunately the CI pipeline doesn't cover install_requirements.sh right now. If you can, please try running it on a linux and/or mac with your changes. If you don't have access to either, let us know, and we can help testing.

#include <cstddef> // size_t
#include <limits>

#ifdef _WIN32

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 shouldn't be necessary since platform/compiler.h has the same logic.

If this needed to happen because one of the headers between here and line 29 refer to ssize_t, then the header that needs it should also include compiler.h.

But in general, compiler.h is the only place in the ET code that is allowed to have system-specific checks like #ifdef _WIN32

Comment threadruntime/core/portable_type/tensor_impl.h Outdated
Comment threadsetup.py Outdated
Comment threadsetup.py Outdated
item for item in os.environ["CMAKE_BUILD_ARGS"].split(" ") if item
]

if os.name == "nt":

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.

Please add a comment explaining what this does, and why it's only necessary on windows. If it would be safe to use this flag on all systems, I'd rather remove the nt check.

Comment threadsetup.py Outdated
Comment threadsetup.py Outdated
Comment on lines +561 to +562
debug = os.environ.get("DEBUG", 0)
cfg = "Debug" if debug else "Release"

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.

Rather than duplicating this logic, please hoist it (and the other example near line 435) into a common global function like get_build_type() -> str

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Added get_build_type.

Comment threadsetup.py Outdated
)
if os.name == "nt":
ext_modules.append(
BuiltFile(

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.

I'd rather extend BuiltFile to handle this situation in a common way, instead of manually repeating the pattern for every entry.

E.g., it could take an extra is_executable: bool = False param that could be set to true here, letting it know to add the .exe suffix on windows.

And we could embed a CMAKE_BUILD_TYPE (debug vs release) placeholder in the paths that is ignored on non-windows systems. How about

third-party/flatbuffers/%BUILD_TYPE%/flatc

Then, on windows systems we can replace %BUILD_TYPE% with get_build_type(), and on non-windows systems we can delete the string %BUILD_TYPE%/ from the path if present.

So this this entry could become

 ext_modules.append(
BuiltFile(
"third-party/flatbuffers/%BUILD_TYPE%/flatc",
"executorch/data/bin/",
is_executable=True,
)
)

And entries below can use the %BUILD_TYPE% placeholder, and use .* to match .so/.dll/.dylib on different systems.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Updated.

Comment threadextension/data_loader/file_data_loader.cpp Outdated
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#ifndef _WIN32

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.

I really want to avoid _WIN32 checks in any of the code, but this is reasonable for now. The best solution would be to avoid using POSIX concepts and to just use the standard C APIs.

Suggested change
#ifndef _WIN32
// TODO: Rewrite FileDataLoader to use standard C FILE* instead of POSIX file
// descriptors, so that we don't need this _WIN32 check.
#ifndef _WIN32

Comment threadextension/llm/custom_ops/CMakeLists.txt
@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Thank you for taking the time to track down and fix all of these issues! I'm generally happy with the approach, but I'd really like to find a way to avoid duplicating so much data and logic from install_requirements.sh.

Will the CI pipeline test cover all tests or there're some tests must be running locally?

Unfortunately the CI pipeline doesn't cover install_requirements.sh right now. If you can, please try running it on a linux and/or mac with your changes. If you don't have access to either, let us know, and we can help testing.

Thanks for the review.
To avoid duplicating install_requirements.sh, I’m considering rewriting it in portable Python. I’ll give it a try to see if it works.

I don’t have access to Linux or macOS, so I’ll need help testing it on those platforms once I’ve got install_requirements.py working

@python3kgae
python3kgae marked this pull request as draft August 14, 2024 20:39
Added install_requirements.ps1 for build on native Windows.
Also fix issues block build on native Windows.
1. Get the Windows version of buck2 for Windows.
2. Check the path based on the build configuration for Windows in setup.py.
3. Avoid generating 'def flat.exe()' which is illegal python.
4. Add the Windows version of kernel_link_options.
5. Add links of pthreadpool and cpuinfo for custom_ops_aot_lib.
6. Define ssize_t for Windows.
Still have one link issue tracked with pytorch#4659.
For pytorch#4661
@python3kgae
python3kgae marked this pull request as ready for review August 21, 2024 02:15
@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Updated based on the comments.
Tested install_requirements.sh on WSL and install_requirements.bat on Windows.
Need help to test Linux and Mac.

@dbortdbort 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 is looking great!

Consider splitting this into some smaller PRs. E.g. we can probably merge the setup.py stuff pretty quickly, but the FileDataLoader might take longer. And, in general, we prefer to have smaller self-contained PRs.

Comment threadbuild/resolve_buck.py
filepath = os.path.join(dir, filename)
if os.path.isfile(filepath) and os.access(filepath, os.X_OK):
bin_names.append(filename)
# avoid def flat.exe() on windows.

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.

Comments should begin with a capital letter. And I suggest making this a little more general.

Suggested change
# avoid def flat.exe() on windows.
# Remove .exe suffix on windows.

#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#ifndef _WIN32

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.

Heads up that #4760 merged recently, which changes this class to use pread(), which I think will break windows. It might make sense to write a separate WindowsFileDataLoader.

There would be a lot of duplicated code, though. If we needed to split into a windows-specific data loader, it might make sense to have an AbstractFileDataLoader with one pure-virtual protected method to do the actual read.

print(f"Error: Unknown option {arg}")
sys.exit(1)

# Use ClangCL on Windows.

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 comment repeats what the code does, and doesn't provide extra value. Either remove it, or (ideally) add a comment explaining why this logic is necessary. It'd also be helpful to explain what ClangCL is, since non-windows devs will not be familiar with it.

Comment on lines +136 to +141
#ifndef _WIN32
#include <sys/types.h> // TODO(T126923429): Include size_t, ssize_t
#else
#include <stddef.h>
using ssize_t = ptrdiff_t;
#endif

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.

Your PR actually fixes the TODO, so we can remove it.

Suggested change
#ifndef_WIN32
#include<sys/types.h>// TODO(T126923429): Include size_t, ssize_t
#else
#include<stddef.h>
usingssize_t=ptrdiff_t;
#endif
// Define size_t and ssize_t.
#ifndef_WIN32
#include<sys/types.h>
#else
#include<stddef.h>
usingssize_t=ptrdiff_t;
#endif

Comment threadsetup.py
item for item in os.environ["CMAKE_BUILD_ARGS"].split(" ") if item
]

build_args += ["--config", cfg]

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.

Please add a comment explaining why this is necessary.

Comment threadsetup.py
Comment on lines +614 to +616
"third-party/flatbuffers/%BUILD_TYPE%/",
"flatc",
"executorch/data/bin/",

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.

Now that there are more than two params, please use kwargs for all params. Same for other BuiltFile uses below.

Suggested change
"third-party/flatbuffers/%BUILD_TYPE%/",
"flatc",
"executorch/data/bin/",
src_path="third-party/flatbuffers/%BUILD_TYPE%/",
src_name="flatc",
dst="executorch/data/bin/",

Comment threadsetup.py
def __init__(self, src: str, dst: str):
def __init__(
self,
src_path: str,

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.

Please call this src_dir since it's specifically a directory. src_path sounds like it could still refer to the path to the source file.

Comment threadsetup.py
ext_modules.append(
BuiltFile("third-party/flatbuffers/flatc", "executorch/data/bin/")
BuiltFile(
"third-party/flatbuffers/%BUILD_TYPE%/",

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.

Will %BUILD_TYPE% always be the final component of the directory path? If so, we could remove the %BUILD_TYPE% placeholder and just add it to the source path inside BuiltFile.

It's ok as-is for now, though.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It is, but it does not have access to the installer in the constructor of BuiltFile.
If I understand correctly, obtaining the build configuration requires access to installer.debug.

Comment threadsetup.py
src: The path to the file to install, relative to the cmake-out
directory. May be an fnmatch-style glob that matches exactly one
file.
src_path: The path to the file to install without name, relative to the cmake-out

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.

Please mention %BUILD_TYPE% here and how to use it.

@python3kgae

Copy link
Copy Markdown
ContributorAuthor

This is looking great!

Consider splitting this into some smaller PRs. E.g. we can probably merge the setup.py stuff pretty quickly, but the FileDataLoader might take longer. And, in general, we prefer to have smaller self-contained PRs.

Created 7 small PRs. Need more time for FileDataLoader.

@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Close after split to small PRs.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA 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 ExecuTorchtriagedThis issue has been looked at a team member, and triaged and prioritized into an appropriate module

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@python3kgae@dbort@kirklandsign@facebook-github-bot@manuelcandales
, '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

[Build] fix build issues for native Windows. - #4681

Closed
python3kgae wants to merge 4 commits into
pytorch:mainfrom
python3kgae:win_bld
Closed

[Build] fix build issues for native Windows.#4681
python3kgae wants to merge 4 commits into
pytorch:mainfrom
python3kgae:win_bld

Conversation

@python3kgae

Copy link
Copy Markdown
Contributor

Add install_requirements.ps1 for build on native Windows.

Also fix issues block build on native Windows.

  1. Get the Windows version of buck2 for Windows.
  2. Check the path based on the build configuration for Windows in setup.py.
  3. Avoid generating 'def flat.exe()' which is illegal python.
  4. Add the Windows version of kernel_link_options.
  5. Add links of pthreadpool and cpuinfo for custom_ops_aot_lib.
  6. Define ssize_t for Windows.

Still have one link issue tracked with #4659.

For #4661

@pytorch-bot

pytorch-botBot commented Aug 13, 2024

Copy link
Copy Markdown

🔗 Helpful Links

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

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

❌ 7 New Failures

As of commit 1b8899c with merge base f887d72 (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 Aug 13, 2024
@manuelcandalesmanuelcandales added module: build/install Issues related to the cmake and buck2 builds, and to installing ExecuTorch triaged This issue has been looked at a team member, and triaged and prioritized into an appropriate module labels Aug 13, 2024
Comment threadbuild/resolve_buck.py

@kirklandsignkirklandsign 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.

Thank you! Is this PR tested and ready for review? Also for the install_requirements.ps1, it's for windows only?

Comment threadextension/data_loader/file_data_loader.cpp Outdated
@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Thank you! Is this PR tested and ready for review? Also for the install_requirements.ps1, it's for windows only?

I didn't really do any real tests except make sure the getting-started-setup works under native Windows and WSL.
Will the CI pipeline test cover all tests or there're some tests must be running locally?

And yes, install_requirements.ps1 is for windows only.

@dbortdbort 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.

Thank you for taking the time to track down and fix all of these issues! I'm generally happy with the approach, but I'd really like to find a way to avoid duplicating so much data and logic from install_requirements.sh.

Will the CI pipeline test cover all tests or there're some tests must be running locally?

Unfortunately the CI pipeline doesn't cover install_requirements.sh right now. If you can, please try running it on a linux and/or mac with your changes. If you don't have access to either, let us know, and we can help testing.

#include <cstddef> // size_t
#include <limits>

#ifdef _WIN32

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 shouldn't be necessary since platform/compiler.h has the same logic.

If this needed to happen because one of the headers between here and line 29 refer to ssize_t, then the header that needs it should also include compiler.h.

But in general, compiler.h is the only place in the ET code that is allowed to have system-specific checks like #ifdef _WIN32

Comment threadruntime/core/portable_type/tensor_impl.h Outdated
Comment threadsetup.py Outdated
Comment threadsetup.py Outdated
item for item in os.environ["CMAKE_BUILD_ARGS"].split(" ") if item
]

if os.name == "nt":

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.

Please add a comment explaining what this does, and why it's only necessary on windows. If it would be safe to use this flag on all systems, I'd rather remove the nt check.

Comment threadsetup.py Outdated
Comment threadsetup.py Outdated
Comment on lines +561 to +562
debug = os.environ.get("DEBUG", 0)
cfg = "Debug" if debug else "Release"

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.

Rather than duplicating this logic, please hoist it (and the other example near line 435) into a common global function like get_build_type() -> str

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Added get_build_type.

Comment threadsetup.py Outdated
)
if os.name == "nt":
ext_modules.append(
BuiltFile(

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.

I'd rather extend BuiltFile to handle this situation in a common way, instead of manually repeating the pattern for every entry.

E.g., it could take an extra is_executable: bool = False param that could be set to true here, letting it know to add the .exe suffix on windows.

And we could embed a CMAKE_BUILD_TYPE (debug vs release) placeholder in the paths that is ignored on non-windows systems. How about

third-party/flatbuffers/%BUILD_TYPE%/flatc

Then, on windows systems we can replace %BUILD_TYPE% with get_build_type(), and on non-windows systems we can delete the string %BUILD_TYPE%/ from the path if present.

So this this entry could become

 ext_modules.append(
BuiltFile(
"third-party/flatbuffers/%BUILD_TYPE%/flatc",
"executorch/data/bin/",
is_executable=True,
)
)

And entries below can use the %BUILD_TYPE% placeholder, and use .* to match .so/.dll/.dylib on different systems.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Updated.

Comment threadextension/data_loader/file_data_loader.cpp Outdated
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#ifndef _WIN32

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.

I really want to avoid _WIN32 checks in any of the code, but this is reasonable for now. The best solution would be to avoid using POSIX concepts and to just use the standard C APIs.

Suggested change
#ifndef _WIN32
// TODO: Rewrite FileDataLoader to use standard C FILE* instead of POSIX file
// descriptors, so that we don't need this _WIN32 check.
#ifndef _WIN32

Comment threadextension/llm/custom_ops/CMakeLists.txt
@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Thank you for taking the time to track down and fix all of these issues! I'm generally happy with the approach, but I'd really like to find a way to avoid duplicating so much data and logic from install_requirements.sh.

Will the CI pipeline test cover all tests or there're some tests must be running locally?

Unfortunately the CI pipeline doesn't cover install_requirements.sh right now. If you can, please try running it on a linux and/or mac with your changes. If you don't have access to either, let us know, and we can help testing.

Thanks for the review.
To avoid duplicating install_requirements.sh, I’m considering rewriting it in portable Python. I’ll give it a try to see if it works.

I don’t have access to Linux or macOS, so I’ll need help testing it on those platforms once I’ve got install_requirements.py working

@python3kgae
python3kgae marked this pull request as draft August 14, 2024 20:39
Added install_requirements.ps1 for build on native Windows.
Also fix issues block build on native Windows.
1. Get the Windows version of buck2 for Windows.
2. Check the path based on the build configuration for Windows in setup.py.
3. Avoid generating 'def flat.exe()' which is illegal python.
4. Add the Windows version of kernel_link_options.
5. Add links of pthreadpool and cpuinfo for custom_ops_aot_lib.
6. Define ssize_t for Windows.
Still have one link issue tracked with pytorch#4659.
For pytorch#4661
@python3kgae
python3kgae marked this pull request as ready for review August 21, 2024 02:15
@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Updated based on the comments.
Tested install_requirements.sh on WSL and install_requirements.bat on Windows.
Need help to test Linux and Mac.

@dbortdbort 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 is looking great!

Consider splitting this into some smaller PRs. E.g. we can probably merge the setup.py stuff pretty quickly, but the FileDataLoader might take longer. And, in general, we prefer to have smaller self-contained PRs.

Comment threadbuild/resolve_buck.py
filepath = os.path.join(dir, filename)
if os.path.isfile(filepath) and os.access(filepath, os.X_OK):
bin_names.append(filename)
# avoid def flat.exe() on windows.

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.

Comments should begin with a capital letter. And I suggest making this a little more general.

Suggested change
# avoid def flat.exe() on windows.
# Remove .exe suffix on windows.

#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#ifndef _WIN32

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.

Heads up that #4760 merged recently, which changes this class to use pread(), which I think will break windows. It might make sense to write a separate WindowsFileDataLoader.

There would be a lot of duplicated code, though. If we needed to split into a windows-specific data loader, it might make sense to have an AbstractFileDataLoader with one pure-virtual protected method to do the actual read.

print(f"Error: Unknown option {arg}")
sys.exit(1)

# Use ClangCL on Windows.

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 comment repeats what the code does, and doesn't provide extra value. Either remove it, or (ideally) add a comment explaining why this logic is necessary. It'd also be helpful to explain what ClangCL is, since non-windows devs will not be familiar with it.

Comment on lines +136 to +141
#ifndef _WIN32
#include <sys/types.h> // TODO(T126923429): Include size_t, ssize_t
#else
#include <stddef.h>
using ssize_t = ptrdiff_t;
#endif

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.

Your PR actually fixes the TODO, so we can remove it.

Suggested change
#ifndef_WIN32
#include<sys/types.h>// TODO(T126923429): Include size_t, ssize_t
#else
#include<stddef.h>
usingssize_t=ptrdiff_t;
#endif
// Define size_t and ssize_t.
#ifndef_WIN32
#include<sys/types.h>
#else
#include<stddef.h>
usingssize_t=ptrdiff_t;
#endif

Comment threadsetup.py
item for item in os.environ["CMAKE_BUILD_ARGS"].split(" ") if item
]

build_args += ["--config", cfg]

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.

Please add a comment explaining why this is necessary.

Comment threadsetup.py
Comment on lines +614 to +616
"third-party/flatbuffers/%BUILD_TYPE%/",
"flatc",
"executorch/data/bin/",

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.

Now that there are more than two params, please use kwargs for all params. Same for other BuiltFile uses below.

Suggested change
"third-party/flatbuffers/%BUILD_TYPE%/",
"flatc",
"executorch/data/bin/",
src_path="third-party/flatbuffers/%BUILD_TYPE%/",
src_name="flatc",
dst="executorch/data/bin/",

Comment threadsetup.py
def __init__(self, src: str, dst: str):
def __init__(
self,
src_path: str,

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.

Please call this src_dir since it's specifically a directory. src_path sounds like it could still refer to the path to the source file.

Comment threadsetup.py
ext_modules.append(
BuiltFile("third-party/flatbuffers/flatc", "executorch/data/bin/")
BuiltFile(
"third-party/flatbuffers/%BUILD_TYPE%/",

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.

Will %BUILD_TYPE% always be the final component of the directory path? If so, we could remove the %BUILD_TYPE% placeholder and just add it to the source path inside BuiltFile.

It's ok as-is for now, though.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It is, but it does not have access to the installer in the constructor of BuiltFile.
If I understand correctly, obtaining the build configuration requires access to installer.debug.

Comment threadsetup.py
src: The path to the file to install, relative to the cmake-out
directory. May be an fnmatch-style glob that matches exactly one
file.
src_path: The path to the file to install without name, relative to the cmake-out

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.

Please mention %BUILD_TYPE% here and how to use it.

@python3kgae

Copy link
Copy Markdown
ContributorAuthor

This is looking great!

Consider splitting this into some smaller PRs. E.g. we can probably merge the setup.py stuff pretty quickly, but the FileDataLoader might take longer. And, in general, we prefer to have smaller self-contained PRs.

Created 7 small PRs. Need more time for FileDataLoader.

@python3kgae

Copy link
Copy Markdown
ContributorAuthor

Close after split to small PRs.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA 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 ExecuTorchtriagedThis issue has been looked at a team member, and triaged and prioritized into an appropriate module

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@python3kgae@dbort@kirklandsign@facebook-github-bot@manuelcandales