mingw: Use aro instead of clang for preprocessing import libs - #17771

Merged
andrewrk merged 8 commits into
ziglang:masterfrom
ehaas:mingw-aro
Nov 7, 2023
Merged

mingw: Use aro instead of clang for preprocessing import libs#17771
andrewrk merged 8 commits into
ziglang:masterfrom
ehaas:mingw-aro

Conversation

@ehaas

Copy link
Copy Markdown
Contributor

Based on manual testing, this produces the same output for kernel32.def when compared to clang, other than minor whitespace differences (clang puts a newline at the beginning, and a trailing space on one line which aro does not)

Testing steps:

  1. Clear zig cache
  2. Create empty test.c
  3. With status-quo zig: zig build-lib -target x86_64-windows-gnu -lkernel32 --verbose-cc test.c
    a. This will print a zig clang line to stderr; the output path is the final argument
  4. With this branch: ./zig-out/bin/zig build-lib -target x86_64-windows-gnu -lkernel32 --verbose-cc test.c
    a. This will print output path: <ZIG_CACHE_PATH>/o/<SOME HASH>/kernel32.def
  5. Diff the two files
  6. Available targets are x86_64-windows-gnu, x86-windows-gnu, arm-windows-gnu, aarch64-windows-gnu

I manually tested error handling by editing kernel32.def.in to have an invalid preprocessing directive and got the following:

zig-out/lib/zig/libc/mingw/lib-common/kernel32.def.in:1:1: error: invalid preprocessing directive
#foo
^
1 error generated.
error: unable to generate DLL import .lib file for kernel32: AroPreprocessorFailed

Closes#17753

@ehaas
ehaasforce-pushed the mingw-aro branch 2 times, most recently from 68f16db to fb0fb5bCompareOctober 29, 2023 06:53
@andrewrk

Copy link
Copy Markdown
Member

I suggest to put a check for build_options.only_core_functionality to prevent Aro from being compiled into zig1.wasm or zig2.c during the bootstrap process. This will also fix the current CI failures.

@ehaas

Copy link
Copy Markdown
ContributorAuthor

Is there a way to test this locally if I don't have access to a windows machine? I don't want to spam the CI with attempts, since I'm not totally sure where the check should go. It seems like the function is being used, since we're hitting that panic - does that mean that if build_options.only_core_functionality is true, we should use the existing zig clang solution, and otherwise use the new aro one?

@andrewrk

Copy link
Copy Markdown
Member

Yes, here is a way to test it:

  1. put @compileError() somewhere inside aro
  2. zig build -Donly-c

If you get the compile error, it's incorrectly including aro in the build.

The check goes at the top of buildImportLib:

if (build_options.only_core_functionality) @panic("building import libs not included in core functionality");

@andrewrk

Copy link
Copy Markdown
Member

Oops, I gave you some bad advice. It should be checking only_c instead of only_core_functionality.

We don't want the logic to be part of zig1.wasm, however we do want the logic to be part of zig2.c.

The use case for only_core_functionality is for example package fetching. We certainly do not need zig2 to have the package manager logic inside of it.

@ehaas

Copy link
Copy Markdown
ContributorAuthor

Ok, if I add that I assume it means it's also safe for me to remove the if (builtin.zig_backend == .stage2_c) @panic("the CBE cannot compile Aro yet!"); from later in the function, right before I import aro?

Comment threadsrc/mingw.zig Outdated
Comment threadsrc/mingw.zig Outdated
Comment threadsrc/mingw.zig Outdated
Comment threadsrc/mingw.zig
});
errdefer comp.gpa.free(lib_final_path);

if (!build_options.have_llvm) return error.ZigCompilerNotBuiltWithLLVMExtensions;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ah, I forgot about this. I'll open another issue for making zig support writing import libraries from def files.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@ehaas

ehaas commented Nov 2, 2023

Copy link
Copy Markdown
ContributorAuthor

@Vexu I will need your help integrating the arocc's GenerateDef changes with zig's build.zig - I'm not sure how to add the def files to the aro module.

@Vexu

Vexu commented Nov 2, 2023

Copy link
Copy Markdown
Member

I don't think there's going to be an easy way to do so because of the bootstrapping process. I'd just copy the generated files from the cache and replace the def files.

@Vexu

Vexu commented Nov 2, 2023

Copy link
Copy Markdown
Member

One possible option would be to add a stubbed def file and then in CMake add that as the module for the def files for the purpose of bootstrapping. For building them regularly it should be easy enough to copy some parts from Aro's build.zig.

This should enable bootstrapping:

pubfnwith(comptimeProperties: type) type {
returnstruct {
tag: Tag=@enumFromInt(0),
properties: Properties=undefined,
pubconstmax_param_count=1;
pubconstlongest_name=0;
pubconstdata= [_]@This(){.{}};
pubinlinefnfromName(_: []constu8) ?@This() {
returnif (@hasField(Properties, "declspec")) nullelse .{};
}
pubfnnameFromUniqueIndex(_: u16, _: []u8) []u8 {
return"";
}
pubfnuniqueIndex(_: []constu8) ?u16 {
returnnull;
}
pubconstTag=enum(u16) { _ };
pubfnnameFromTag(_: Tag) NameBuf {
return .{};
}
pubfntagFromName(name: []constu8) ?Tag {
return@enumFromInt(name.len);
}
pubconstNameBuf=struct {
pubfnspan(_: *constNameBuf) []constu8 {
return"";
}
};
};
}

ref: 45eb8a700bfa885af7144a54ffd01f291c6f598f
Vexu
Vexu approved these changes Nov 3, 2023

@VexuVexu left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I forgot about the "file exists in multiple modules" error again and made the stub work for both. It could be simplified for them individually but this works too.

I simplified the names stub while fixing the build error.

@Vexu
Vexuforce-pushed the mingw-aro branch 2 times, most recently from 1459d8a to caa2c12CompareNovember 3, 2023 17:42
@ehaas

ehaas commented Nov 3, 2023

Copy link
Copy Markdown
ContributorAuthor

The issue I was seeing was that stage3 was unable to build the zig compiler due to not finding the def files. I fixed it with the following diff:

diff --git a/CMakeLists.txt b/CMakeLists.txt
index dcbddc476..d5fd9b4b1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -647,8 +647,11 @@ set(ZIG_STAGE2_SOURCES
"${CMAKE_SOURCE_DIR}/src/windows_sdk.zig"
"${CMAKE_SOURCE_DIR}/src/stubs/aro_builtins.zig"
"${CMAKE_SOURCE_DIR}/src/stubs/aro_attributes.zig"
+ "${CMAKE_SOURCE_DIR}/deps/aro/Attribute/names.def"
+ "${CMAKE_SOURCE_DIR}/deps/aro/Builtins/Builtin.def"
)
+
if(MSVC)
set(MSVC_DIA_SDK_DIR "$ENV{VSINSTALLDIR}DIA SDK")
if(IS_DIRECTORY ${MSVC_DIA_SDK_DIR})
@@ -947,3 +950,10 @@ install(CODE "set(ZIG_BUILD_ARGS \"${ZIG_BUILD_ARGS}\")")
install(CODE "set(CMAKE_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}\")")
install(CODE "set(CMAKE_SOURCE_DIR \"${CMAKE_SOURCE_DIR}\")")
install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/install.cmake")
+
+
+file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/deps/aro/Attribute/names.def
+ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/deps/aro/Attribute)
+
+file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/deps/aro/Builtins/Builtin.def
+ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/deps/aro/Builtins)

I'm not sure if this is the correct fix; I also did this without your changes to this branch or to aro from today.

@andrewrk

Copy link
Copy Markdown
Member

Please don't add any additional logic to CMakeLists.txt. Zig should depend on Aro only as a set of zig files. I don't want to add any Aro-related build system logic to zig's build process.

@Vexu

Vexu commented Nov 3, 2023

Copy link
Copy Markdown
Member

The issue I was seeing was that stage3 was unable to build the zig compiler due to not finding the def files.

I think the issue was Vexu/arocc@9f4c28a

@ehaas

ehaas commented Nov 3, 2023

Copy link
Copy Markdown
ContributorAuthor

If we want to completely eliminate the CMakeLists.txt changes (so, no stub modules or anything) I have a local patch that does that by replacing the .def file contents with the generated versions. It succeeds at the bootstrap + stage4 build. Let me know if that is desired and I can push it.

@Vexu
Vexu requested a review from andrewrkNovember 7, 2023 10:59
@andrewrk

Copy link
Copy Markdown
Member

Thanks @ehaas. I think this is fine - passing a few more args to building zig2.c is OK, I just didn't want to add any more steps to the process. For example, to update #17892 after merging this PR, I will only need to adjust a few command line args, but not introduce more logic into bootstrap.c.

Sign up for freeto 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.

make mingw .def.in file parsing use aro's preprocessor instead of clang

3 participants

@ehaas@andrewrk@Vexu
, '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

mingw: Use aro instead of clang for preprocessing import libs - #17771

Merged
andrewrk merged 8 commits into
ziglang:masterfrom
ehaas:mingw-aro
Nov 7, 2023
Merged

mingw: Use aro instead of clang for preprocessing import libs#17771
andrewrk merged 8 commits into
ziglang:masterfrom
ehaas:mingw-aro

Conversation

@ehaas

Copy link
Copy Markdown
Contributor

Based on manual testing, this produces the same output for kernel32.def when compared to clang, other than minor whitespace differences (clang puts a newline at the beginning, and a trailing space on one line which aro does not)

Testing steps:

  1. Clear zig cache
  2. Create empty test.c
  3. With status-quo zig: zig build-lib -target x86_64-windows-gnu -lkernel32 --verbose-cc test.c
    a. This will print a zig clang line to stderr; the output path is the final argument
  4. With this branch: ./zig-out/bin/zig build-lib -target x86_64-windows-gnu -lkernel32 --verbose-cc test.c
    a. This will print output path: <ZIG_CACHE_PATH>/o/<SOME HASH>/kernel32.def
  5. Diff the two files
  6. Available targets are x86_64-windows-gnu, x86-windows-gnu, arm-windows-gnu, aarch64-windows-gnu

I manually tested error handling by editing kernel32.def.in to have an invalid preprocessing directive and got the following:

zig-out/lib/zig/libc/mingw/lib-common/kernel32.def.in:1:1: error: invalid preprocessing directive
#foo
^
1 error generated.
error: unable to generate DLL import .lib file for kernel32: AroPreprocessorFailed

Closes#17753

@ehaas
ehaasforce-pushed the mingw-aro branch 2 times, most recently from 68f16db to fb0fb5bCompareOctober 29, 2023 06:53
@andrewrk

Copy link
Copy Markdown
Member

I suggest to put a check for build_options.only_core_functionality to prevent Aro from being compiled into zig1.wasm or zig2.c during the bootstrap process. This will also fix the current CI failures.

@ehaas

Copy link
Copy Markdown
ContributorAuthor

Is there a way to test this locally if I don't have access to a windows machine? I don't want to spam the CI with attempts, since I'm not totally sure where the check should go. It seems like the function is being used, since we're hitting that panic - does that mean that if build_options.only_core_functionality is true, we should use the existing zig clang solution, and otherwise use the new aro one?

@andrewrk

Copy link
Copy Markdown
Member

Yes, here is a way to test it:

  1. put @compileError() somewhere inside aro
  2. zig build -Donly-c

If you get the compile error, it's incorrectly including aro in the build.

The check goes at the top of buildImportLib:

if (build_options.only_core_functionality) @panic("building import libs not included in core functionality");

@andrewrk

Copy link
Copy Markdown
Member

Oops, I gave you some bad advice. It should be checking only_c instead of only_core_functionality.

We don't want the logic to be part of zig1.wasm, however we do want the logic to be part of zig2.c.

The use case for only_core_functionality is for example package fetching. We certainly do not need zig2 to have the package manager logic inside of it.

@ehaas

Copy link
Copy Markdown
ContributorAuthor

Ok, if I add that I assume it means it's also safe for me to remove the if (builtin.zig_backend == .stage2_c) @panic("the CBE cannot compile Aro yet!"); from later in the function, right before I import aro?

Comment threadsrc/mingw.zig Outdated
Comment threadsrc/mingw.zig Outdated
Comment threadsrc/mingw.zig Outdated
Comment threadsrc/mingw.zig
});
errdefer comp.gpa.free(lib_final_path);

if (!build_options.have_llvm) return error.ZigCompilerNotBuiltWithLLVMExtensions;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ah, I forgot about this. I'll open another issue for making zig support writing import libraries from def files.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@ehaas

ehaas commented Nov 2, 2023

Copy link
Copy Markdown
ContributorAuthor

@Vexu I will need your help integrating the arocc's GenerateDef changes with zig's build.zig - I'm not sure how to add the def files to the aro module.

@Vexu

Vexu commented Nov 2, 2023

Copy link
Copy Markdown
Member

I don't think there's going to be an easy way to do so because of the bootstrapping process. I'd just copy the generated files from the cache and replace the def files.

@Vexu

Vexu commented Nov 2, 2023

Copy link
Copy Markdown
Member

One possible option would be to add a stubbed def file and then in CMake add that as the module for the def files for the purpose of bootstrapping. For building them regularly it should be easy enough to copy some parts from Aro's build.zig.

This should enable bootstrapping:

pubfnwith(comptimeProperties: type) type {
returnstruct {
tag: Tag=@enumFromInt(0),
properties: Properties=undefined,
pubconstmax_param_count=1;
pubconstlongest_name=0;
pubconstdata= [_]@This(){.{}};
pubinlinefnfromName(_: []constu8) ?@This() {
returnif (@hasField(Properties, "declspec")) nullelse .{};
}
pubfnnameFromUniqueIndex(_: u16, _: []u8) []u8 {
return"";
}
pubfnuniqueIndex(_: []constu8) ?u16 {
returnnull;
}
pubconstTag=enum(u16) { _ };
pubfnnameFromTag(_: Tag) NameBuf {
return .{};
}
pubfntagFromName(name: []constu8) ?Tag {
return@enumFromInt(name.len);
}
pubconstNameBuf=struct {
pubfnspan(_: *constNameBuf) []constu8 {
return"";
}
};
};
}

ref: 45eb8a700bfa885af7144a54ffd01f291c6f598f
Vexu
Vexu approved these changes Nov 3, 2023

@VexuVexu left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I forgot about the "file exists in multiple modules" error again and made the stub work for both. It could be simplified for them individually but this works too.

I simplified the names stub while fixing the build error.

@Vexu
Vexuforce-pushed the mingw-aro branch 2 times, most recently from 1459d8a to caa2c12CompareNovember 3, 2023 17:42
@ehaas

ehaas commented Nov 3, 2023

Copy link
Copy Markdown
ContributorAuthor

The issue I was seeing was that stage3 was unable to build the zig compiler due to not finding the def files. I fixed it with the following diff:

diff --git a/CMakeLists.txt b/CMakeLists.txt
index dcbddc476..d5fd9b4b1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -647,8 +647,11 @@ set(ZIG_STAGE2_SOURCES
"${CMAKE_SOURCE_DIR}/src/windows_sdk.zig"
"${CMAKE_SOURCE_DIR}/src/stubs/aro_builtins.zig"
"${CMAKE_SOURCE_DIR}/src/stubs/aro_attributes.zig"
+ "${CMAKE_SOURCE_DIR}/deps/aro/Attribute/names.def"
+ "${CMAKE_SOURCE_DIR}/deps/aro/Builtins/Builtin.def"
)
+
if(MSVC)
set(MSVC_DIA_SDK_DIR "$ENV{VSINSTALLDIR}DIA SDK")
if(IS_DIRECTORY ${MSVC_DIA_SDK_DIR})
@@ -947,3 +950,10 @@ install(CODE "set(ZIG_BUILD_ARGS \"${ZIG_BUILD_ARGS}\")")
install(CODE "set(CMAKE_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}\")")
install(CODE "set(CMAKE_SOURCE_DIR \"${CMAKE_SOURCE_DIR}\")")
install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/install.cmake")
+
+
+file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/deps/aro/Attribute/names.def
+ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/deps/aro/Attribute)
+
+file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/deps/aro/Builtins/Builtin.def
+ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/deps/aro/Builtins)

I'm not sure if this is the correct fix; I also did this without your changes to this branch or to aro from today.

@andrewrk

Copy link
Copy Markdown
Member

Please don't add any additional logic to CMakeLists.txt. Zig should depend on Aro only as a set of zig files. I don't want to add any Aro-related build system logic to zig's build process.

@Vexu

Vexu commented Nov 3, 2023

Copy link
Copy Markdown
Member

The issue I was seeing was that stage3 was unable to build the zig compiler due to not finding the def files.

I think the issue was Vexu/arocc@9f4c28a

@ehaas

ehaas commented Nov 3, 2023

Copy link
Copy Markdown
ContributorAuthor

If we want to completely eliminate the CMakeLists.txt changes (so, no stub modules or anything) I have a local patch that does that by replacing the .def file contents with the generated versions. It succeeds at the bootstrap + stage4 build. Let me know if that is desired and I can push it.

@Vexu
Vexu requested a review from andrewrkNovember 7, 2023 10:59
@andrewrk

Copy link
Copy Markdown
Member

Thanks @ehaas. I think this is fine - passing a few more args to building zig2.c is OK, I just didn't want to add any more steps to the process. For example, to update #17892 after merging this PR, I will only need to adjust a few command line args, but not introduce more logic into bootstrap.c.

Sign up for freeto 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.

make mingw .def.in file parsing use aro's preprocessor instead of clang

3 participants

@ehaas@andrewrk@Vexu
, '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

mingw: Use aro instead of clang for preprocessing import libs - #17771

Merged
andrewrk merged 8 commits into
ziglang:masterfrom
ehaas:mingw-aro
Nov 7, 2023
Merged

mingw: Use aro instead of clang for preprocessing import libs#17771
andrewrk merged 8 commits into
ziglang:masterfrom
ehaas:mingw-aro

Conversation

@ehaas

Copy link
Copy Markdown
Contributor

Based on manual testing, this produces the same output for kernel32.def when compared to clang, other than minor whitespace differences (clang puts a newline at the beginning, and a trailing space on one line which aro does not)

Testing steps:

  1. Clear zig cache
  2. Create empty test.c
  3. With status-quo zig: zig build-lib -target x86_64-windows-gnu -lkernel32 --verbose-cc test.c
    a. This will print a zig clang line to stderr; the output path is the final argument
  4. With this branch: ./zig-out/bin/zig build-lib -target x86_64-windows-gnu -lkernel32 --verbose-cc test.c
    a. This will print output path: <ZIG_CACHE_PATH>/o/<SOME HASH>/kernel32.def
  5. Diff the two files
  6. Available targets are x86_64-windows-gnu, x86-windows-gnu, arm-windows-gnu, aarch64-windows-gnu

I manually tested error handling by editing kernel32.def.in to have an invalid preprocessing directive and got the following:

zig-out/lib/zig/libc/mingw/lib-common/kernel32.def.in:1:1: error: invalid preprocessing directive
#foo
^
1 error generated.
error: unable to generate DLL import .lib file for kernel32: AroPreprocessorFailed

Closes#17753

@ehaas
ehaasforce-pushed the mingw-aro branch 2 times, most recently from 68f16db to fb0fb5bCompareOctober 29, 2023 06:53
@andrewrk

Copy link
Copy Markdown
Member

I suggest to put a check for build_options.only_core_functionality to prevent Aro from being compiled into zig1.wasm or zig2.c during the bootstrap process. This will also fix the current CI failures.

@ehaas

Copy link
Copy Markdown
ContributorAuthor

Is there a way to test this locally if I don't have access to a windows machine? I don't want to spam the CI with attempts, since I'm not totally sure where the check should go. It seems like the function is being used, since we're hitting that panic - does that mean that if build_options.only_core_functionality is true, we should use the existing zig clang solution, and otherwise use the new aro one?

@andrewrk

Copy link
Copy Markdown
Member

Yes, here is a way to test it:

  1. put @compileError() somewhere inside aro
  2. zig build -Donly-c

If you get the compile error, it's incorrectly including aro in the build.

The check goes at the top of buildImportLib:

if (build_options.only_core_functionality) @panic("building import libs not included in core functionality");

@andrewrk

Copy link
Copy Markdown
Member

Oops, I gave you some bad advice. It should be checking only_c instead of only_core_functionality.

We don't want the logic to be part of zig1.wasm, however we do want the logic to be part of zig2.c.

The use case for only_core_functionality is for example package fetching. We certainly do not need zig2 to have the package manager logic inside of it.

@ehaas

Copy link
Copy Markdown
ContributorAuthor

Ok, if I add that I assume it means it's also safe for me to remove the if (builtin.zig_backend == .stage2_c) @panic("the CBE cannot compile Aro yet!"); from later in the function, right before I import aro?

Comment threadsrc/mingw.zig Outdated
Comment threadsrc/mingw.zig Outdated
Comment threadsrc/mingw.zig Outdated
Comment threadsrc/mingw.zig
});
errdefer comp.gpa.free(lib_final_path);

if (!build_options.have_llvm) return error.ZigCompilerNotBuiltWithLLVMExtensions;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ah, I forgot about this. I'll open another issue for making zig support writing import libraries from def files.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@ehaas

ehaas commented Nov 2, 2023

Copy link
Copy Markdown
ContributorAuthor

@Vexu I will need your help integrating the arocc's GenerateDef changes with zig's build.zig - I'm not sure how to add the def files to the aro module.

@Vexu

Vexu commented Nov 2, 2023

Copy link
Copy Markdown
Member

I don't think there's going to be an easy way to do so because of the bootstrapping process. I'd just copy the generated files from the cache and replace the def files.

@Vexu

Vexu commented Nov 2, 2023

Copy link
Copy Markdown
Member

One possible option would be to add a stubbed def file and then in CMake add that as the module for the def files for the purpose of bootstrapping. For building them regularly it should be easy enough to copy some parts from Aro's build.zig.

This should enable bootstrapping:

pubfnwith(comptimeProperties: type) type {
returnstruct {
tag: Tag=@enumFromInt(0),
properties: Properties=undefined,
pubconstmax_param_count=1;
pubconstlongest_name=0;
pubconstdata= [_]@This(){.{}};
pubinlinefnfromName(_: []constu8) ?@This() {
returnif (@hasField(Properties, "declspec")) nullelse .{};
}
pubfnnameFromUniqueIndex(_: u16, _: []u8) []u8 {
return"";
}
pubfnuniqueIndex(_: []constu8) ?u16 {
returnnull;
}
pubconstTag=enum(u16) { _ };
pubfnnameFromTag(_: Tag) NameBuf {
return .{};
}
pubfntagFromName(name: []constu8) ?Tag {
return@enumFromInt(name.len);
}
pubconstNameBuf=struct {
pubfnspan(_: *constNameBuf) []constu8 {
return"";
}
};
};
}

ref: 45eb8a700bfa885af7144a54ffd01f291c6f598f
Vexu
Vexu approved these changes Nov 3, 2023

@VexuVexu left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I forgot about the "file exists in multiple modules" error again and made the stub work for both. It could be simplified for them individually but this works too.

I simplified the names stub while fixing the build error.

@Vexu
Vexuforce-pushed the mingw-aro branch 2 times, most recently from 1459d8a to caa2c12CompareNovember 3, 2023 17:42
@ehaas

ehaas commented Nov 3, 2023

Copy link
Copy Markdown
ContributorAuthor

The issue I was seeing was that stage3 was unable to build the zig compiler due to not finding the def files. I fixed it with the following diff:

diff --git a/CMakeLists.txt b/CMakeLists.txt
index dcbddc476..d5fd9b4b1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -647,8 +647,11 @@ set(ZIG_STAGE2_SOURCES
"${CMAKE_SOURCE_DIR}/src/windows_sdk.zig"
"${CMAKE_SOURCE_DIR}/src/stubs/aro_builtins.zig"
"${CMAKE_SOURCE_DIR}/src/stubs/aro_attributes.zig"
+ "${CMAKE_SOURCE_DIR}/deps/aro/Attribute/names.def"
+ "${CMAKE_SOURCE_DIR}/deps/aro/Builtins/Builtin.def"
)
+
if(MSVC)
set(MSVC_DIA_SDK_DIR "$ENV{VSINSTALLDIR}DIA SDK")
if(IS_DIRECTORY ${MSVC_DIA_SDK_DIR})
@@ -947,3 +950,10 @@ install(CODE "set(ZIG_BUILD_ARGS \"${ZIG_BUILD_ARGS}\")")
install(CODE "set(CMAKE_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}\")")
install(CODE "set(CMAKE_SOURCE_DIR \"${CMAKE_SOURCE_DIR}\")")
install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/install.cmake")
+
+
+file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/deps/aro/Attribute/names.def
+ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/deps/aro/Attribute)
+
+file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/deps/aro/Builtins/Builtin.def
+ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/deps/aro/Builtins)

I'm not sure if this is the correct fix; I also did this without your changes to this branch or to aro from today.

@andrewrk

Copy link
Copy Markdown
Member

Please don't add any additional logic to CMakeLists.txt. Zig should depend on Aro only as a set of zig files. I don't want to add any Aro-related build system logic to zig's build process.

@Vexu

Vexu commented Nov 3, 2023

Copy link
Copy Markdown
Member

The issue I was seeing was that stage3 was unable to build the zig compiler due to not finding the def files.

I think the issue was Vexu/arocc@9f4c28a

@ehaas

ehaas commented Nov 3, 2023

Copy link
Copy Markdown
ContributorAuthor

If we want to completely eliminate the CMakeLists.txt changes (so, no stub modules or anything) I have a local patch that does that by replacing the .def file contents with the generated versions. It succeeds at the bootstrap + stage4 build. Let me know if that is desired and I can push it.

@Vexu
Vexu requested a review from andrewrkNovember 7, 2023 10:59
@andrewrk

Copy link
Copy Markdown
Member

Thanks @ehaas. I think this is fine - passing a few more args to building zig2.c is OK, I just didn't want to add any more steps to the process. For example, to update #17892 after merging this PR, I will only need to adjust a few command line args, but not introduce more logic into bootstrap.c.

Sign up for freeto 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.

make mingw .def.in file parsing use aro's preprocessor instead of clang

3 participants

@ehaas@andrewrk@Vexu
, '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

mingw: Use aro instead of clang for preprocessing import libs - #17771

Merged
andrewrk merged 8 commits into
ziglang:masterfrom
ehaas:mingw-aro
Nov 7, 2023
Merged

mingw: Use aro instead of clang for preprocessing import libs#17771
andrewrk merged 8 commits into
ziglang:masterfrom
ehaas:mingw-aro

Conversation

@ehaas

Copy link
Copy Markdown
Contributor

Based on manual testing, this produces the same output for kernel32.def when compared to clang, other than minor whitespace differences (clang puts a newline at the beginning, and a trailing space on one line which aro does not)

Testing steps:

  1. Clear zig cache
  2. Create empty test.c
  3. With status-quo zig: zig build-lib -target x86_64-windows-gnu -lkernel32 --verbose-cc test.c
    a. This will print a zig clang line to stderr; the output path is the final argument
  4. With this branch: ./zig-out/bin/zig build-lib -target x86_64-windows-gnu -lkernel32 --verbose-cc test.c
    a. This will print output path: <ZIG_CACHE_PATH>/o/<SOME HASH>/kernel32.def
  5. Diff the two files
  6. Available targets are x86_64-windows-gnu, x86-windows-gnu, arm-windows-gnu, aarch64-windows-gnu

I manually tested error handling by editing kernel32.def.in to have an invalid preprocessing directive and got the following:

zig-out/lib/zig/libc/mingw/lib-common/kernel32.def.in:1:1: error: invalid preprocessing directive
#foo
^
1 error generated.
error: unable to generate DLL import .lib file for kernel32: AroPreprocessorFailed

Closes#17753

@ehaas
ehaasforce-pushed the mingw-aro branch 2 times, most recently from 68f16db to fb0fb5bCompareOctober 29, 2023 06:53
@andrewrk

Copy link
Copy Markdown
Member

I suggest to put a check for build_options.only_core_functionality to prevent Aro from being compiled into zig1.wasm or zig2.c during the bootstrap process. This will also fix the current CI failures.

@ehaas

Copy link
Copy Markdown
ContributorAuthor

Is there a way to test this locally if I don't have access to a windows machine? I don't want to spam the CI with attempts, since I'm not totally sure where the check should go. It seems like the function is being used, since we're hitting that panic - does that mean that if build_options.only_core_functionality is true, we should use the existing zig clang solution, and otherwise use the new aro one?

@andrewrk

Copy link
Copy Markdown
Member

Yes, here is a way to test it:

  1. put @compileError() somewhere inside aro
  2. zig build -Donly-c

If you get the compile error, it's incorrectly including aro in the build.

The check goes at the top of buildImportLib:

if (build_options.only_core_functionality) @panic("building import libs not included in core functionality");

@andrewrk

Copy link
Copy Markdown
Member

Oops, I gave you some bad advice. It should be checking only_c instead of only_core_functionality.

We don't want the logic to be part of zig1.wasm, however we do want the logic to be part of zig2.c.

The use case for only_core_functionality is for example package fetching. We certainly do not need zig2 to have the package manager logic inside of it.

@ehaas

Copy link
Copy Markdown
ContributorAuthor

Ok, if I add that I assume it means it's also safe for me to remove the if (builtin.zig_backend == .stage2_c) @panic("the CBE cannot compile Aro yet!"); from later in the function, right before I import aro?

Comment threadsrc/mingw.zig Outdated
Comment threadsrc/mingw.zig Outdated
Comment threadsrc/mingw.zig Outdated
Comment threadsrc/mingw.zig
});
errdefer comp.gpa.free(lib_final_path);

if (!build_options.have_llvm) return error.ZigCompilerNotBuiltWithLLVMExtensions;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ah, I forgot about this. I'll open another issue for making zig support writing import libraries from def files.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@ehaas

ehaas commented Nov 2, 2023

Copy link
Copy Markdown
ContributorAuthor

@Vexu I will need your help integrating the arocc's GenerateDef changes with zig's build.zig - I'm not sure how to add the def files to the aro module.

@Vexu

Vexu commented Nov 2, 2023

Copy link
Copy Markdown
Member

I don't think there's going to be an easy way to do so because of the bootstrapping process. I'd just copy the generated files from the cache and replace the def files.

@Vexu

Vexu commented Nov 2, 2023

Copy link
Copy Markdown
Member

One possible option would be to add a stubbed def file and then in CMake add that as the module for the def files for the purpose of bootstrapping. For building them regularly it should be easy enough to copy some parts from Aro's build.zig.

This should enable bootstrapping:

pubfnwith(comptimeProperties: type) type {
returnstruct {
tag: Tag=@enumFromInt(0),
properties: Properties=undefined,
pubconstmax_param_count=1;
pubconstlongest_name=0;
pubconstdata= [_]@This(){.{}};
pubinlinefnfromName(_: []constu8) ?@This() {
returnif (@hasField(Properties, "declspec")) nullelse .{};
}
pubfnnameFromUniqueIndex(_: u16, _: []u8) []u8 {
return"";
}
pubfnuniqueIndex(_: []constu8) ?u16 {
returnnull;
}
pubconstTag=enum(u16) { _ };
pubfnnameFromTag(_: Tag) NameBuf {
return .{};
}
pubfntagFromName(name: []constu8) ?Tag {
return@enumFromInt(name.len);
}
pubconstNameBuf=struct {
pubfnspan(_: *constNameBuf) []constu8 {
return"";
}
};
};
}

ref: 45eb8a700bfa885af7144a54ffd01f291c6f598f
Vexu
Vexu approved these changes Nov 3, 2023

@VexuVexu left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I forgot about the "file exists in multiple modules" error again and made the stub work for both. It could be simplified for them individually but this works too.

I simplified the names stub while fixing the build error.

@Vexu
Vexuforce-pushed the mingw-aro branch 2 times, most recently from 1459d8a to caa2c12CompareNovember 3, 2023 17:42
@ehaas

ehaas commented Nov 3, 2023

Copy link
Copy Markdown
ContributorAuthor

The issue I was seeing was that stage3 was unable to build the zig compiler due to not finding the def files. I fixed it with the following diff:

diff --git a/CMakeLists.txt b/CMakeLists.txt
index dcbddc476..d5fd9b4b1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -647,8 +647,11 @@ set(ZIG_STAGE2_SOURCES
"${CMAKE_SOURCE_DIR}/src/windows_sdk.zig"
"${CMAKE_SOURCE_DIR}/src/stubs/aro_builtins.zig"
"${CMAKE_SOURCE_DIR}/src/stubs/aro_attributes.zig"
+ "${CMAKE_SOURCE_DIR}/deps/aro/Attribute/names.def"
+ "${CMAKE_SOURCE_DIR}/deps/aro/Builtins/Builtin.def"
)
+
if(MSVC)
set(MSVC_DIA_SDK_DIR "$ENV{VSINSTALLDIR}DIA SDK")
if(IS_DIRECTORY ${MSVC_DIA_SDK_DIR})
@@ -947,3 +950,10 @@ install(CODE "set(ZIG_BUILD_ARGS \"${ZIG_BUILD_ARGS}\")")
install(CODE "set(CMAKE_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}\")")
install(CODE "set(CMAKE_SOURCE_DIR \"${CMAKE_SOURCE_DIR}\")")
install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/install.cmake")
+
+
+file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/deps/aro/Attribute/names.def
+ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/deps/aro/Attribute)
+
+file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/deps/aro/Builtins/Builtin.def
+ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/deps/aro/Builtins)

I'm not sure if this is the correct fix; I also did this without your changes to this branch or to aro from today.

@andrewrk

Copy link
Copy Markdown
Member

Please don't add any additional logic to CMakeLists.txt. Zig should depend on Aro only as a set of zig files. I don't want to add any Aro-related build system logic to zig's build process.

@Vexu

Vexu commented Nov 3, 2023

Copy link
Copy Markdown
Member

The issue I was seeing was that stage3 was unable to build the zig compiler due to not finding the def files.

I think the issue was Vexu/arocc@9f4c28a

@ehaas

ehaas commented Nov 3, 2023

Copy link
Copy Markdown
ContributorAuthor

If we want to completely eliminate the CMakeLists.txt changes (so, no stub modules or anything) I have a local patch that does that by replacing the .def file contents with the generated versions. It succeeds at the bootstrap + stage4 build. Let me know if that is desired and I can push it.

@Vexu
Vexu requested a review from andrewrkNovember 7, 2023 10:59
@andrewrk

Copy link
Copy Markdown
Member

Thanks @ehaas. I think this is fine - passing a few more args to building zig2.c is OK, I just didn't want to add any more steps to the process. For example, to update #17892 after merging this PR, I will only need to adjust a few command line args, but not introduce more logic into bootstrap.c.

Sign up for freeto 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.

make mingw .def.in file parsing use aro's preprocessor instead of clang

3 participants

@ehaas@andrewrk@Vexu
, '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

mingw: Use aro instead of clang for preprocessing import libs - #17771

Merged
andrewrk merged 8 commits into
ziglang:masterfrom
ehaas:mingw-aro
Nov 7, 2023
Merged

mingw: Use aro instead of clang for preprocessing import libs#17771
andrewrk merged 8 commits into
ziglang:masterfrom
ehaas:mingw-aro

Conversation

@ehaas

Copy link
Copy Markdown
Contributor

Based on manual testing, this produces the same output for kernel32.def when compared to clang, other than minor whitespace differences (clang puts a newline at the beginning, and a trailing space on one line which aro does not)

Testing steps:

  1. Clear zig cache
  2. Create empty test.c
  3. With status-quo zig: zig build-lib -target x86_64-windows-gnu -lkernel32 --verbose-cc test.c
    a. This will print a zig clang line to stderr; the output path is the final argument
  4. With this branch: ./zig-out/bin/zig build-lib -target x86_64-windows-gnu -lkernel32 --verbose-cc test.c
    a. This will print output path: <ZIG_CACHE_PATH>/o/<SOME HASH>/kernel32.def
  5. Diff the two files
  6. Available targets are x86_64-windows-gnu, x86-windows-gnu, arm-windows-gnu, aarch64-windows-gnu

I manually tested error handling by editing kernel32.def.in to have an invalid preprocessing directive and got the following:

zig-out/lib/zig/libc/mingw/lib-common/kernel32.def.in:1:1: error: invalid preprocessing directive
#foo
^
1 error generated.
error: unable to generate DLL import .lib file for kernel32: AroPreprocessorFailed

Closes#17753

@ehaas
ehaasforce-pushed the mingw-aro branch 2 times, most recently from 68f16db to fb0fb5bCompareOctober 29, 2023 06:53
@andrewrk

Copy link
Copy Markdown
Member

I suggest to put a check for build_options.only_core_functionality to prevent Aro from being compiled into zig1.wasm or zig2.c during the bootstrap process. This will also fix the current CI failures.

@ehaas

Copy link
Copy Markdown
ContributorAuthor

Is there a way to test this locally if I don't have access to a windows machine? I don't want to spam the CI with attempts, since I'm not totally sure where the check should go. It seems like the function is being used, since we're hitting that panic - does that mean that if build_options.only_core_functionality is true, we should use the existing zig clang solution, and otherwise use the new aro one?

@andrewrk

Copy link
Copy Markdown
Member

Yes, here is a way to test it:

  1. put @compileError() somewhere inside aro
  2. zig build -Donly-c

If you get the compile error, it's incorrectly including aro in the build.

The check goes at the top of buildImportLib:

if (build_options.only_core_functionality) @panic("building import libs not included in core functionality");

@andrewrk

Copy link
Copy Markdown
Member

Oops, I gave you some bad advice. It should be checking only_c instead of only_core_functionality.

We don't want the logic to be part of zig1.wasm, however we do want the logic to be part of zig2.c.

The use case for only_core_functionality is for example package fetching. We certainly do not need zig2 to have the package manager logic inside of it.

@ehaas

Copy link
Copy Markdown
ContributorAuthor

Ok, if I add that I assume it means it's also safe for me to remove the if (builtin.zig_backend == .stage2_c) @panic("the CBE cannot compile Aro yet!"); from later in the function, right before I import aro?

Comment threadsrc/mingw.zig Outdated
Comment threadsrc/mingw.zig Outdated
Comment threadsrc/mingw.zig Outdated
Comment threadsrc/mingw.zig
});
errdefer comp.gpa.free(lib_final_path);

if (!build_options.have_llvm) return error.ZigCompilerNotBuiltWithLLVMExtensions;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ah, I forgot about this. I'll open another issue for making zig support writing import libraries from def files.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@ehaas

ehaas commented Nov 2, 2023

Copy link
Copy Markdown
ContributorAuthor

@Vexu I will need your help integrating the arocc's GenerateDef changes with zig's build.zig - I'm not sure how to add the def files to the aro module.

@Vexu

Vexu commented Nov 2, 2023

Copy link
Copy Markdown
Member

I don't think there's going to be an easy way to do so because of the bootstrapping process. I'd just copy the generated files from the cache and replace the def files.

@Vexu

Vexu commented Nov 2, 2023

Copy link
Copy Markdown
Member

One possible option would be to add a stubbed def file and then in CMake add that as the module for the def files for the purpose of bootstrapping. For building them regularly it should be easy enough to copy some parts from Aro's build.zig.

This should enable bootstrapping:

pubfnwith(comptimeProperties: type) type {
returnstruct {
tag: Tag=@enumFromInt(0),
properties: Properties=undefined,
pubconstmax_param_count=1;
pubconstlongest_name=0;
pubconstdata= [_]@This(){.{}};
pubinlinefnfromName(_: []constu8) ?@This() {
returnif (@hasField(Properties, "declspec")) nullelse .{};
}
pubfnnameFromUniqueIndex(_: u16, _: []u8) []u8 {
return"";
}
pubfnuniqueIndex(_: []constu8) ?u16 {
returnnull;
}
pubconstTag=enum(u16) { _ };
pubfnnameFromTag(_: Tag) NameBuf {
return .{};
}
pubfntagFromName(name: []constu8) ?Tag {
return@enumFromInt(name.len);
}
pubconstNameBuf=struct {
pubfnspan(_: *constNameBuf) []constu8 {
return"";
}
};
};
}

ref: 45eb8a700bfa885af7144a54ffd01f291c6f598f
Vexu
Vexu approved these changes Nov 3, 2023

@VexuVexu left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I forgot about the "file exists in multiple modules" error again and made the stub work for both. It could be simplified for them individually but this works too.

I simplified the names stub while fixing the build error.

@Vexu
Vexuforce-pushed the mingw-aro branch 2 times, most recently from 1459d8a to caa2c12CompareNovember 3, 2023 17:42
@ehaas

ehaas commented Nov 3, 2023

Copy link
Copy Markdown
ContributorAuthor

The issue I was seeing was that stage3 was unable to build the zig compiler due to not finding the def files. I fixed it with the following diff:

diff --git a/CMakeLists.txt b/CMakeLists.txt
index dcbddc476..d5fd9b4b1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -647,8 +647,11 @@ set(ZIG_STAGE2_SOURCES
"${CMAKE_SOURCE_DIR}/src/windows_sdk.zig"
"${CMAKE_SOURCE_DIR}/src/stubs/aro_builtins.zig"
"${CMAKE_SOURCE_DIR}/src/stubs/aro_attributes.zig"
+ "${CMAKE_SOURCE_DIR}/deps/aro/Attribute/names.def"
+ "${CMAKE_SOURCE_DIR}/deps/aro/Builtins/Builtin.def"
)
+
if(MSVC)
set(MSVC_DIA_SDK_DIR "$ENV{VSINSTALLDIR}DIA SDK")
if(IS_DIRECTORY ${MSVC_DIA_SDK_DIR})
@@ -947,3 +950,10 @@ install(CODE "set(ZIG_BUILD_ARGS \"${ZIG_BUILD_ARGS}\")")
install(CODE "set(CMAKE_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}\")")
install(CODE "set(CMAKE_SOURCE_DIR \"${CMAKE_SOURCE_DIR}\")")
install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/install.cmake")
+
+
+file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/deps/aro/Attribute/names.def
+ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/deps/aro/Attribute)
+
+file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/deps/aro/Builtins/Builtin.def
+ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/deps/aro/Builtins)

I'm not sure if this is the correct fix; I also did this without your changes to this branch or to aro from today.

@andrewrk

Copy link
Copy Markdown
Member

Please don't add any additional logic to CMakeLists.txt. Zig should depend on Aro only as a set of zig files. I don't want to add any Aro-related build system logic to zig's build process.

@Vexu

Vexu commented Nov 3, 2023

Copy link
Copy Markdown
Member

The issue I was seeing was that stage3 was unable to build the zig compiler due to not finding the def files.

I think the issue was Vexu/arocc@9f4c28a

@ehaas

ehaas commented Nov 3, 2023

Copy link
Copy Markdown
ContributorAuthor

If we want to completely eliminate the CMakeLists.txt changes (so, no stub modules or anything) I have a local patch that does that by replacing the .def file contents with the generated versions. It succeeds at the bootstrap + stage4 build. Let me know if that is desired and I can push it.

@Vexu
Vexu requested a review from andrewrkNovember 7, 2023 10:59
@andrewrk

Copy link
Copy Markdown
Member

Thanks @ehaas. I think this is fine - passing a few more args to building zig2.c is OK, I just didn't want to add any more steps to the process. For example, to update #17892 after merging this PR, I will only need to adjust a few command line args, but not introduce more logic into bootstrap.c.

Sign up for freeto 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.

make mingw .def.in file parsing use aro's preprocessor instead of clang

3 participants

@ehaas@andrewrk@Vexu
, '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

mingw: Use aro instead of clang for preprocessing import libs - #17771

Merged
andrewrk merged 8 commits into
ziglang:masterfrom
ehaas:mingw-aro
Nov 7, 2023
Merged

mingw: Use aro instead of clang for preprocessing import libs#17771
andrewrk merged 8 commits into
ziglang:masterfrom
ehaas:mingw-aro

Conversation

@ehaas

Copy link
Copy Markdown
Contributor

Based on manual testing, this produces the same output for kernel32.def when compared to clang, other than minor whitespace differences (clang puts a newline at the beginning, and a trailing space on one line which aro does not)

Testing steps:

  1. Clear zig cache
  2. Create empty test.c
  3. With status-quo zig: zig build-lib -target x86_64-windows-gnu -lkernel32 --verbose-cc test.c
    a. This will print a zig clang line to stderr; the output path is the final argument
  4. With this branch: ./zig-out/bin/zig build-lib -target x86_64-windows-gnu -lkernel32 --verbose-cc test.c
    a. This will print output path: <ZIG_CACHE_PATH>/o/<SOME HASH>/kernel32.def
  5. Diff the two files
  6. Available targets are x86_64-windows-gnu, x86-windows-gnu, arm-windows-gnu, aarch64-windows-gnu

I manually tested error handling by editing kernel32.def.in to have an invalid preprocessing directive and got the following:

zig-out/lib/zig/libc/mingw/lib-common/kernel32.def.in:1:1: error: invalid preprocessing directive
#foo
^
1 error generated.
error: unable to generate DLL import .lib file for kernel32: AroPreprocessorFailed

Closes#17753

@ehaas
ehaasforce-pushed the mingw-aro branch 2 times, most recently from 68f16db to fb0fb5bCompareOctober 29, 2023 06:53
@andrewrk

Copy link
Copy Markdown
Member

I suggest to put a check for build_options.only_core_functionality to prevent Aro from being compiled into zig1.wasm or zig2.c during the bootstrap process. This will also fix the current CI failures.

@ehaas

Copy link
Copy Markdown
ContributorAuthor

Is there a way to test this locally if I don't have access to a windows machine? I don't want to spam the CI with attempts, since I'm not totally sure where the check should go. It seems like the function is being used, since we're hitting that panic - does that mean that if build_options.only_core_functionality is true, we should use the existing zig clang solution, and otherwise use the new aro one?

@andrewrk

Copy link
Copy Markdown
Member

Yes, here is a way to test it:

  1. put @compileError() somewhere inside aro
  2. zig build -Donly-c

If you get the compile error, it's incorrectly including aro in the build.

The check goes at the top of buildImportLib:

if (build_options.only_core_functionality) @panic("building import libs not included in core functionality");

@andrewrk

Copy link
Copy Markdown
Member

Oops, I gave you some bad advice. It should be checking only_c instead of only_core_functionality.

We don't want the logic to be part of zig1.wasm, however we do want the logic to be part of zig2.c.

The use case for only_core_functionality is for example package fetching. We certainly do not need zig2 to have the package manager logic inside of it.

@ehaas

Copy link
Copy Markdown
ContributorAuthor

Ok, if I add that I assume it means it's also safe for me to remove the if (builtin.zig_backend == .stage2_c) @panic("the CBE cannot compile Aro yet!"); from later in the function, right before I import aro?

Comment threadsrc/mingw.zig Outdated
Comment threadsrc/mingw.zig Outdated
Comment threadsrc/mingw.zig Outdated
Comment threadsrc/mingw.zig
});
errdefer comp.gpa.free(lib_final_path);

if (!build_options.have_llvm) return error.ZigCompilerNotBuiltWithLLVMExtensions;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ah, I forgot about this. I'll open another issue for making zig support writing import libraries from def files.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@ehaas

ehaas commented Nov 2, 2023

Copy link
Copy Markdown
ContributorAuthor

@Vexu I will need your help integrating the arocc's GenerateDef changes with zig's build.zig - I'm not sure how to add the def files to the aro module.

@Vexu

Vexu commented Nov 2, 2023

Copy link
Copy Markdown
Member

I don't think there's going to be an easy way to do so because of the bootstrapping process. I'd just copy the generated files from the cache and replace the def files.

@Vexu

Vexu commented Nov 2, 2023

Copy link
Copy Markdown
Member

One possible option would be to add a stubbed def file and then in CMake add that as the module for the def files for the purpose of bootstrapping. For building them regularly it should be easy enough to copy some parts from Aro's build.zig.

This should enable bootstrapping:

pubfnwith(comptimeProperties: type) type {
returnstruct {
tag: Tag=@enumFromInt(0),
properties: Properties=undefined,
pubconstmax_param_count=1;
pubconstlongest_name=0;
pubconstdata= [_]@This(){.{}};
pubinlinefnfromName(_: []constu8) ?@This() {
returnif (@hasField(Properties, "declspec")) nullelse .{};
}
pubfnnameFromUniqueIndex(_: u16, _: []u8) []u8 {
return"";
}
pubfnuniqueIndex(_: []constu8) ?u16 {
returnnull;
}
pubconstTag=enum(u16) { _ };
pubfnnameFromTag(_: Tag) NameBuf {
return .{};
}
pubfntagFromName(name: []constu8) ?Tag {
return@enumFromInt(name.len);
}
pubconstNameBuf=struct {
pubfnspan(_: *constNameBuf) []constu8 {
return"";
}
};
};
}

ref: 45eb8a700bfa885af7144a54ffd01f291c6f598f
Vexu
Vexu approved these changes Nov 3, 2023

@VexuVexu left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I forgot about the "file exists in multiple modules" error again and made the stub work for both. It could be simplified for them individually but this works too.

I simplified the names stub while fixing the build error.

@Vexu
Vexuforce-pushed the mingw-aro branch 2 times, most recently from 1459d8a to caa2c12CompareNovember 3, 2023 17:42
@ehaas

ehaas commented Nov 3, 2023

Copy link
Copy Markdown
ContributorAuthor

The issue I was seeing was that stage3 was unable to build the zig compiler due to not finding the def files. I fixed it with the following diff:

diff --git a/CMakeLists.txt b/CMakeLists.txt
index dcbddc476..d5fd9b4b1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -647,8 +647,11 @@ set(ZIG_STAGE2_SOURCES
"${CMAKE_SOURCE_DIR}/src/windows_sdk.zig"
"${CMAKE_SOURCE_DIR}/src/stubs/aro_builtins.zig"
"${CMAKE_SOURCE_DIR}/src/stubs/aro_attributes.zig"
+ "${CMAKE_SOURCE_DIR}/deps/aro/Attribute/names.def"
+ "${CMAKE_SOURCE_DIR}/deps/aro/Builtins/Builtin.def"
)
+
if(MSVC)
set(MSVC_DIA_SDK_DIR "$ENV{VSINSTALLDIR}DIA SDK")
if(IS_DIRECTORY ${MSVC_DIA_SDK_DIR})
@@ -947,3 +950,10 @@ install(CODE "set(ZIG_BUILD_ARGS \"${ZIG_BUILD_ARGS}\")")
install(CODE "set(CMAKE_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}\")")
install(CODE "set(CMAKE_SOURCE_DIR \"${CMAKE_SOURCE_DIR}\")")
install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/install.cmake")
+
+
+file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/deps/aro/Attribute/names.def
+ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/deps/aro/Attribute)
+
+file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/deps/aro/Builtins/Builtin.def
+ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/deps/aro/Builtins)

I'm not sure if this is the correct fix; I also did this without your changes to this branch or to aro from today.

@andrewrk

Copy link
Copy Markdown
Member

Please don't add any additional logic to CMakeLists.txt. Zig should depend on Aro only as a set of zig files. I don't want to add any Aro-related build system logic to zig's build process.

@Vexu

Vexu commented Nov 3, 2023

Copy link
Copy Markdown
Member

The issue I was seeing was that stage3 was unable to build the zig compiler due to not finding the def files.

I think the issue was Vexu/arocc@9f4c28a

@ehaas

ehaas commented Nov 3, 2023

Copy link
Copy Markdown
ContributorAuthor

If we want to completely eliminate the CMakeLists.txt changes (so, no stub modules or anything) I have a local patch that does that by replacing the .def file contents with the generated versions. It succeeds at the bootstrap + stage4 build. Let me know if that is desired and I can push it.

@Vexu
Vexu requested a review from andrewrkNovember 7, 2023 10:59
@andrewrk

Copy link
Copy Markdown
Member

Thanks @ehaas. I think this is fine - passing a few more args to building zig2.c is OK, I just didn't want to add any more steps to the process. For example, to update #17892 after merging this PR, I will only need to adjust a few command line args, but not introduce more logic into bootstrap.c.

Sign up for freeto 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.

make mingw .def.in file parsing use aro's preprocessor instead of clang

3 participants

@ehaas@andrewrk@Vexu
, '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

mingw: Use aro instead of clang for preprocessing import libs - #17771

Merged
andrewrk merged 8 commits into
ziglang:masterfrom
ehaas:mingw-aro
Nov 7, 2023
Merged

mingw: Use aro instead of clang for preprocessing import libs#17771
andrewrk merged 8 commits into
ziglang:masterfrom
ehaas:mingw-aro

Conversation

@ehaas

Copy link
Copy Markdown
Contributor

Based on manual testing, this produces the same output for kernel32.def when compared to clang, other than minor whitespace differences (clang puts a newline at the beginning, and a trailing space on one line which aro does not)

Testing steps:

  1. Clear zig cache
  2. Create empty test.c
  3. With status-quo zig: zig build-lib -target x86_64-windows-gnu -lkernel32 --verbose-cc test.c
    a. This will print a zig clang line to stderr; the output path is the final argument
  4. With this branch: ./zig-out/bin/zig build-lib -target x86_64-windows-gnu -lkernel32 --verbose-cc test.c
    a. This will print output path: <ZIG_CACHE_PATH>/o/<SOME HASH>/kernel32.def
  5. Diff the two files
  6. Available targets are x86_64-windows-gnu, x86-windows-gnu, arm-windows-gnu, aarch64-windows-gnu

I manually tested error handling by editing kernel32.def.in to have an invalid preprocessing directive and got the following:

zig-out/lib/zig/libc/mingw/lib-common/kernel32.def.in:1:1: error: invalid preprocessing directive
#foo
^
1 error generated.
error: unable to generate DLL import .lib file for kernel32: AroPreprocessorFailed

Closes#17753

@ehaas
ehaasforce-pushed the mingw-aro branch 2 times, most recently from 68f16db to fb0fb5bCompareOctober 29, 2023 06:53
@andrewrk

Copy link
Copy Markdown
Member

I suggest to put a check for build_options.only_core_functionality to prevent Aro from being compiled into zig1.wasm or zig2.c during the bootstrap process. This will also fix the current CI failures.

@ehaas

Copy link
Copy Markdown
ContributorAuthor

Is there a way to test this locally if I don't have access to a windows machine? I don't want to spam the CI with attempts, since I'm not totally sure where the check should go. It seems like the function is being used, since we're hitting that panic - does that mean that if build_options.only_core_functionality is true, we should use the existing zig clang solution, and otherwise use the new aro one?

@andrewrk

Copy link
Copy Markdown
Member

Yes, here is a way to test it:

  1. put @compileError() somewhere inside aro
  2. zig build -Donly-c

If you get the compile error, it's incorrectly including aro in the build.

The check goes at the top of buildImportLib:

if (build_options.only_core_functionality) @panic("building import libs not included in core functionality");

@andrewrk

Copy link
Copy Markdown
Member

Oops, I gave you some bad advice. It should be checking only_c instead of only_core_functionality.

We don't want the logic to be part of zig1.wasm, however we do want the logic to be part of zig2.c.

The use case for only_core_functionality is for example package fetching. We certainly do not need zig2 to have the package manager logic inside of it.

@ehaas

Copy link
Copy Markdown
ContributorAuthor

Ok, if I add that I assume it means it's also safe for me to remove the if (builtin.zig_backend == .stage2_c) @panic("the CBE cannot compile Aro yet!"); from later in the function, right before I import aro?

Comment threadsrc/mingw.zig Outdated
Comment threadsrc/mingw.zig Outdated
Comment threadsrc/mingw.zig Outdated
Comment threadsrc/mingw.zig
});
errdefer comp.gpa.free(lib_final_path);

if (!build_options.have_llvm) return error.ZigCompilerNotBuiltWithLLVMExtensions;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ah, I forgot about this. I'll open another issue for making zig support writing import libraries from def files.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@ehaas

ehaas commented Nov 2, 2023

Copy link
Copy Markdown
ContributorAuthor

@Vexu I will need your help integrating the arocc's GenerateDef changes with zig's build.zig - I'm not sure how to add the def files to the aro module.

@Vexu

Vexu commented Nov 2, 2023

Copy link
Copy Markdown
Member

I don't think there's going to be an easy way to do so because of the bootstrapping process. I'd just copy the generated files from the cache and replace the def files.

@Vexu

Vexu commented Nov 2, 2023

Copy link
Copy Markdown
Member

One possible option would be to add a stubbed def file and then in CMake add that as the module for the def files for the purpose of bootstrapping. For building them regularly it should be easy enough to copy some parts from Aro's build.zig.

This should enable bootstrapping:

pubfnwith(comptimeProperties: type) type {
returnstruct {
tag: Tag=@enumFromInt(0),
properties: Properties=undefined,
pubconstmax_param_count=1;
pubconstlongest_name=0;
pubconstdata= [_]@This(){.{}};
pubinlinefnfromName(_: []constu8) ?@This() {
returnif (@hasField(Properties, "declspec")) nullelse .{};
}
pubfnnameFromUniqueIndex(_: u16, _: []u8) []u8 {
return"";
}
pubfnuniqueIndex(_: []constu8) ?u16 {
returnnull;
}
pubconstTag=enum(u16) { _ };
pubfnnameFromTag(_: Tag) NameBuf {
return .{};
}
pubfntagFromName(name: []constu8) ?Tag {
return@enumFromInt(name.len);
}
pubconstNameBuf=struct {
pubfnspan(_: *constNameBuf) []constu8 {
return"";
}
};
};
}

ref: 45eb8a700bfa885af7144a54ffd01f291c6f598f
Vexu
Vexu approved these changes Nov 3, 2023

@VexuVexu left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I forgot about the "file exists in multiple modules" error again and made the stub work for both. It could be simplified for them individually but this works too.

I simplified the names stub while fixing the build error.

@Vexu
Vexuforce-pushed the mingw-aro branch 2 times, most recently from 1459d8a to caa2c12CompareNovember 3, 2023 17:42
@ehaas

ehaas commented Nov 3, 2023

Copy link
Copy Markdown
ContributorAuthor

The issue I was seeing was that stage3 was unable to build the zig compiler due to not finding the def files. I fixed it with the following diff:

diff --git a/CMakeLists.txt b/CMakeLists.txt
index dcbddc476..d5fd9b4b1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -647,8 +647,11 @@ set(ZIG_STAGE2_SOURCES
"${CMAKE_SOURCE_DIR}/src/windows_sdk.zig"
"${CMAKE_SOURCE_DIR}/src/stubs/aro_builtins.zig"
"${CMAKE_SOURCE_DIR}/src/stubs/aro_attributes.zig"
+ "${CMAKE_SOURCE_DIR}/deps/aro/Attribute/names.def"
+ "${CMAKE_SOURCE_DIR}/deps/aro/Builtins/Builtin.def"
)
+
if(MSVC)
set(MSVC_DIA_SDK_DIR "$ENV{VSINSTALLDIR}DIA SDK")
if(IS_DIRECTORY ${MSVC_DIA_SDK_DIR})
@@ -947,3 +950,10 @@ install(CODE "set(ZIG_BUILD_ARGS \"${ZIG_BUILD_ARGS}\")")
install(CODE "set(CMAKE_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}\")")
install(CODE "set(CMAKE_SOURCE_DIR \"${CMAKE_SOURCE_DIR}\")")
install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/install.cmake")
+
+
+file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/deps/aro/Attribute/names.def
+ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/deps/aro/Attribute)
+
+file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/deps/aro/Builtins/Builtin.def
+ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/deps/aro/Builtins)

I'm not sure if this is the correct fix; I also did this without your changes to this branch or to aro from today.

@andrewrk

Copy link
Copy Markdown
Member

Please don't add any additional logic to CMakeLists.txt. Zig should depend on Aro only as a set of zig files. I don't want to add any Aro-related build system logic to zig's build process.

@Vexu

Vexu commented Nov 3, 2023

Copy link
Copy Markdown
Member

The issue I was seeing was that stage3 was unable to build the zig compiler due to not finding the def files.

I think the issue was Vexu/arocc@9f4c28a

@ehaas

ehaas commented Nov 3, 2023

Copy link
Copy Markdown
ContributorAuthor

If we want to completely eliminate the CMakeLists.txt changes (so, no stub modules or anything) I have a local patch that does that by replacing the .def file contents with the generated versions. It succeeds at the bootstrap + stage4 build. Let me know if that is desired and I can push it.

@Vexu
Vexu requested a review from andrewrkNovember 7, 2023 10:59
@andrewrk

Copy link
Copy Markdown
Member

Thanks @ehaas. I think this is fine - passing a few more args to building zig2.c is OK, I just didn't want to add any more steps to the process. For example, to update #17892 after merging this PR, I will only need to adjust a few command line args, but not introduce more logic into bootstrap.c.

Sign up for freeto 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.

make mingw .def.in file parsing use aro's preprocessor instead of clang

3 participants

@ehaas@andrewrk@Vexu
, '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

mingw: Use aro instead of clang for preprocessing import libs - #17771

Merged
andrewrk merged 8 commits into
ziglang:masterfrom
ehaas:mingw-aro
Nov 7, 2023
Merged

mingw: Use aro instead of clang for preprocessing import libs#17771
andrewrk merged 8 commits into
ziglang:masterfrom
ehaas:mingw-aro

Conversation

@ehaas

Copy link
Copy Markdown
Contributor

Based on manual testing, this produces the same output for kernel32.def when compared to clang, other than minor whitespace differences (clang puts a newline at the beginning, and a trailing space on one line which aro does not)

Testing steps:

  1. Clear zig cache
  2. Create empty test.c
  3. With status-quo zig: zig build-lib -target x86_64-windows-gnu -lkernel32 --verbose-cc test.c
    a. This will print a zig clang line to stderr; the output path is the final argument
  4. With this branch: ./zig-out/bin/zig build-lib -target x86_64-windows-gnu -lkernel32 --verbose-cc test.c
    a. This will print output path: <ZIG_CACHE_PATH>/o/<SOME HASH>/kernel32.def
  5. Diff the two files
  6. Available targets are x86_64-windows-gnu, x86-windows-gnu, arm-windows-gnu, aarch64-windows-gnu

I manually tested error handling by editing kernel32.def.in to have an invalid preprocessing directive and got the following:

zig-out/lib/zig/libc/mingw/lib-common/kernel32.def.in:1:1: error: invalid preprocessing directive
#foo
^
1 error generated.
error: unable to generate DLL import .lib file for kernel32: AroPreprocessorFailed

Closes#17753

@ehaas
ehaasforce-pushed the mingw-aro branch 2 times, most recently from 68f16db to fb0fb5bCompareOctober 29, 2023 06:53
@andrewrk

Copy link
Copy Markdown
Member

I suggest to put a check for build_options.only_core_functionality to prevent Aro from being compiled into zig1.wasm or zig2.c during the bootstrap process. This will also fix the current CI failures.

@ehaas

Copy link
Copy Markdown
ContributorAuthor

Is there a way to test this locally if I don't have access to a windows machine? I don't want to spam the CI with attempts, since I'm not totally sure where the check should go. It seems like the function is being used, since we're hitting that panic - does that mean that if build_options.only_core_functionality is true, we should use the existing zig clang solution, and otherwise use the new aro one?

@andrewrk

Copy link
Copy Markdown
Member

Yes, here is a way to test it:

  1. put @compileError() somewhere inside aro
  2. zig build -Donly-c

If you get the compile error, it's incorrectly including aro in the build.

The check goes at the top of buildImportLib:

if (build_options.only_core_functionality) @panic("building import libs not included in core functionality");

@andrewrk

Copy link
Copy Markdown
Member

Oops, I gave you some bad advice. It should be checking only_c instead of only_core_functionality.

We don't want the logic to be part of zig1.wasm, however we do want the logic to be part of zig2.c.

The use case for only_core_functionality is for example package fetching. We certainly do not need zig2 to have the package manager logic inside of it.

@ehaas

Copy link
Copy Markdown
ContributorAuthor

Ok, if I add that I assume it means it's also safe for me to remove the if (builtin.zig_backend == .stage2_c) @panic("the CBE cannot compile Aro yet!"); from later in the function, right before I import aro?

Comment threadsrc/mingw.zig Outdated
Comment threadsrc/mingw.zig Outdated
Comment threadsrc/mingw.zig Outdated
Comment threadsrc/mingw.zig
});
errdefer comp.gpa.free(lib_final_path);

if (!build_options.have_llvm) return error.ZigCompilerNotBuiltWithLLVMExtensions;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ah, I forgot about this. I'll open another issue for making zig support writing import libraries from def files.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@ehaas

ehaas commented Nov 2, 2023

Copy link
Copy Markdown
ContributorAuthor

@Vexu I will need your help integrating the arocc's GenerateDef changes with zig's build.zig - I'm not sure how to add the def files to the aro module.

@Vexu

Vexu commented Nov 2, 2023

Copy link
Copy Markdown
Member

I don't think there's going to be an easy way to do so because of the bootstrapping process. I'd just copy the generated files from the cache and replace the def files.

@Vexu

Vexu commented Nov 2, 2023

Copy link
Copy Markdown
Member

One possible option would be to add a stubbed def file and then in CMake add that as the module for the def files for the purpose of bootstrapping. For building them regularly it should be easy enough to copy some parts from Aro's build.zig.

This should enable bootstrapping:

pubfnwith(comptimeProperties: type) type {
returnstruct {
tag: Tag=@enumFromInt(0),
properties: Properties=undefined,
pubconstmax_param_count=1;
pubconstlongest_name=0;
pubconstdata= [_]@This(){.{}};
pubinlinefnfromName(_: []constu8) ?@This() {
returnif (@hasField(Properties, "declspec")) nullelse .{};
}
pubfnnameFromUniqueIndex(_: u16, _: []u8) []u8 {
return"";
}
pubfnuniqueIndex(_: []constu8) ?u16 {
returnnull;
}
pubconstTag=enum(u16) { _ };
pubfnnameFromTag(_: Tag) NameBuf {
return .{};
}
pubfntagFromName(name: []constu8) ?Tag {
return@enumFromInt(name.len);
}
pubconstNameBuf=struct {
pubfnspan(_: *constNameBuf) []constu8 {
return"";
}
};
};
}

ref: 45eb8a700bfa885af7144a54ffd01f291c6f598f
Vexu
Vexu approved these changes Nov 3, 2023

@VexuVexu left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I forgot about the "file exists in multiple modules" error again and made the stub work for both. It could be simplified for them individually but this works too.

I simplified the names stub while fixing the build error.

@Vexu
Vexuforce-pushed the mingw-aro branch 2 times, most recently from 1459d8a to caa2c12CompareNovember 3, 2023 17:42
@ehaas

ehaas commented Nov 3, 2023

Copy link
Copy Markdown
ContributorAuthor

The issue I was seeing was that stage3 was unable to build the zig compiler due to not finding the def files. I fixed it with the following diff:

diff --git a/CMakeLists.txt b/CMakeLists.txt
index dcbddc476..d5fd9b4b1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -647,8 +647,11 @@ set(ZIG_STAGE2_SOURCES
"${CMAKE_SOURCE_DIR}/src/windows_sdk.zig"
"${CMAKE_SOURCE_DIR}/src/stubs/aro_builtins.zig"
"${CMAKE_SOURCE_DIR}/src/stubs/aro_attributes.zig"
+ "${CMAKE_SOURCE_DIR}/deps/aro/Attribute/names.def"
+ "${CMAKE_SOURCE_DIR}/deps/aro/Builtins/Builtin.def"
)
+
if(MSVC)
set(MSVC_DIA_SDK_DIR "$ENV{VSINSTALLDIR}DIA SDK")
if(IS_DIRECTORY ${MSVC_DIA_SDK_DIR})
@@ -947,3 +950,10 @@ install(CODE "set(ZIG_BUILD_ARGS \"${ZIG_BUILD_ARGS}\")")
install(CODE "set(CMAKE_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}\")")
install(CODE "set(CMAKE_SOURCE_DIR \"${CMAKE_SOURCE_DIR}\")")
install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/install.cmake")
+
+
+file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/deps/aro/Attribute/names.def
+ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/deps/aro/Attribute)
+
+file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/deps/aro/Builtins/Builtin.def
+ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/deps/aro/Builtins)

I'm not sure if this is the correct fix; I also did this without your changes to this branch or to aro from today.

@andrewrk

Copy link
Copy Markdown
Member

Please don't add any additional logic to CMakeLists.txt. Zig should depend on Aro only as a set of zig files. I don't want to add any Aro-related build system logic to zig's build process.

@Vexu

Vexu commented Nov 3, 2023

Copy link
Copy Markdown
Member

The issue I was seeing was that stage3 was unable to build the zig compiler due to not finding the def files.

I think the issue was Vexu/arocc@9f4c28a

@ehaas

ehaas commented Nov 3, 2023

Copy link
Copy Markdown
ContributorAuthor

If we want to completely eliminate the CMakeLists.txt changes (so, no stub modules or anything) I have a local patch that does that by replacing the .def file contents with the generated versions. It succeeds at the bootstrap + stage4 build. Let me know if that is desired and I can push it.

@Vexu
Vexu requested a review from andrewrkNovember 7, 2023 10:59
@andrewrk

Copy link
Copy Markdown
Member

Thanks @ehaas. I think this is fine - passing a few more args to building zig2.c is OK, I just didn't want to add any more steps to the process. For example, to update #17892 after merging this PR, I will only need to adjust a few command line args, but not introduce more logic into bootstrap.c.

Sign up for freeto 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.

make mingw .def.in file parsing use aro's preprocessor instead of clang

3 participants

@ehaas@andrewrk@Vexu