Skip to content

Conversation

@JAicewizard
Copy link

@JAicewizard JAicewizard commented Dec 11, 2025

This makes emcc recognize -fopenmp, and links it as needed.

When updating openmp, it neesd to be compiled. This is not strictly neccesary, but we need to invoke cmake in order to generate the headers. When compiling openemp, we need to make use of cmake as well, as the build system is quite long and complicated. I am sure it can be done another way using ninja, and I encourage others to implement this, but I do not have the capacity right now to make this happen.

Fixes: #13892

@JAicewizard
Copy link
Author

To clarify, I have tested this by compiling + linking a program requiring openmp

@sbc100 sbc100 changed the title Initial OMP support Initial OpenMP support Dec 11, 2025
Copy link
Collaborator

@sbc100 sbc100 left a comment

Choose a reason for hiding this comment

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

I assume the contents of system/lib/libomp is coming from an upstream repo?

Can you using git submodule for this and put it in third_party/ maybe?

@@ -563,6 +563,12 @@ def consume_arg_file():
else:
exit_with_error(f'invalid value for --output-eol: `{style}`')
# Record PTHREADS setting because it controls whether --shared-memory is passed to lld
elif arg == '-fopenmp' or arg == '-fopenmp=libomp':
Copy link
Collaborator

Choose a reason for hiding this comment

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

arg in ('-fopenmp', '-fopenmp=libomp'):

@@ -563,6 +563,12 @@ def consume_arg_file():
else:
exit_with_error(f'invalid value for --output-eol: `{style}`')
# Record PTHREADS setting because it controls whether --shared-memory is passed to lld
elif arg == '-fopenmp' or arg == '-fopenmp=libomp':
settings.OPENMP = 1
# Openmp needs pthreads, they are implied by -ofopenmp
Copy link
Collaborator

Choose a reason for hiding this comment

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

-ofopenmp -> -fopenmp ?

@@ -431,4 +432,4 @@ def restore(self, previous):
self.attrs.update(previous)


settings = SettingsManager()
settings = SettingsManager()
Copy link
Collaborator

Choose a reason for hiding this comment

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

Looks like the final newline here got deleted?

shutil.copyfile(os.path.join(build_dir, "lib/libomp.a"), out_filename)

if not shared.DEBUG:
utils.delete_dir(build_dir)
Copy link
Collaborator

Choose a reason for hiding this comment

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

We use 2-space indentation in our python code (for better or worse :(

"cmake",
path,
"-G",
"Ninja",
Copy link
Collaborator

Choose a reason for hiding this comment

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

We don't currently have any system libraries or ports that depend on external tools such as cmake or ninja to build. We basically build everything ourselves to avoid depending on these tools.

Copy link
Author

Choose a reason for hiding this comment

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

I know, I currently don't have the time to figure out what files need to be compiled with what flags. The CMake files are too large to spit through for me ATM. Moving off CMake would be great, as currently a lot of code is in the libomp directory, almost none of which is actually necessary (I did not realize this was +150k before opening the PR).

@JAicewizard
Copy link
Author

I assume the contents of system/lib/libomp is coming from an upstream repo?

Can you using git submodule for this and put it in third_party/ maybe?

Yess, it is from llvm. Since all the other llvm libraries are in this location, it made sense to put it here. Do you want the entire LLVM repository as a submodule? It seems a bit overkill, at that point the other libraries can also be pulled from there

@sbc100
Copy link
Collaborator

sbc100 commented Dec 11, 2025

I assume the contents of system/lib/libomp is coming from an upstream repo?
Can you using git submodule for this and put it in third_party/ maybe?

Yess, it is from llvm. Since all the other llvm libraries are in this location, it made sense to put it here. Do you want the entire LLVM repository as a submodule? It seems a bit overkill, at that point the other libraries can also be pulled from there

Oh i see, I didn't realize this was from llvm. I that case the import approach your took does seem reasonable.

@JAicewizard JAicewizard marked this pull request as draft December 11, 2025 17:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Enabling openmp

2 participants