Minimum CMake downgrade for Linux - #39044

Merged
jkoritzinsky merged 36 commits into
dotnet:masterfrom
jkoritzinsky:cmake-downgrade
Aug 4, 2020
Merged

Minimum CMake downgrade for Linux#39044
jkoritzinsky merged 36 commits into
dotnet:masterfrom
jkoritzinsky:cmake-downgrade

Conversation

@jkoritzinsky

Copy link
Copy Markdown
Member

Downgrade the minimum version of CMake to 3.6.2 for our Linux builds and change our CMake scripts appropriately:

Currently completed steps:

  • Provide our own implementation of add_compile_definitions since it is easily polyfillable
  • Move away from add_link_options since it is not easy to create our own implementation of that functions the same. Move back to setting linker options via the flag properties.
  • Manually enable PIE/PIC on Linux/Mac (this support was added in CMake 3.9)
  • Manually check for IPO support on Linux/Mac (this support was added in CMake 3.13)
  • Revert to the old CMake command line (this support was added in CMake 3.10)

So far I've only undone the changes that I made in dotnet/coreclr#26980 that I know are required. @janvorli can you help out with some of the other issues that we'll encounter when lowering the CMake version? I don't know all of the corner case behaviors that we've started to depend on in the last 10ish months.

Validation that we actually build on CMake 3.6.2 will come when we get a new Docker image has CMake 3.6.2 (and no newer) installed (@jashook is working on this).

Contributes to #38755

Depends on dotnet/arcade#5770

cc: @dleeapho@janvorli@jashook@omajid@jkotas@tmds@wfurt@RheaAyase

@ghost

ghost commented Jul 9, 2020

Copy link
Copy Markdown

Tagging subscribers to this area: @ViktorHofer
Notify danmosemsft if you want to be subscribed.

Comment threadeng/native/configurecompiler.cmake Outdated
Comment threadeng/native/configurecompiler.cmake Outdated
Comment threadeng/native/configurecompiler.cmake Outdated
Comment threadsrc/coreclr/src/dlls/mscoree/coreclr/CMakeLists.txt Outdated
Comment threadeng/native/configureplatform.cmake Outdated
Comment threadeng/native/build-commons.sh
Comment threadeng/native/configureplatform.cmake
Comment threadsrc/coreclr/pgosupport.cmake Outdated
Comment threadsrc/coreclr/src/ToolBox/SOS/DacTableGen/CMakeLists.txt
Comment threadsrc/libraries/Native/Unix/CMakeLists.txt Outdated
@omajid

omajid commented Jul 14, 2020

Copy link
Copy Markdown
Member

Thanks for this PR!

I tried building ad16a9797a2e899caec8a610f667789e0bec6524 using ./build.sh on RHEL 8. It doesn't seem to work. This is cmake version 3.11.4

 Detected Linux x86_64 -- Performing Test COMPILER_SUPPORTS_F_STACK_PROTECTOR_STRONG -- Performing Test COMPILER_SUPPORTS_F_STACK_PROTECTOR_STRONG - Success -- The ASM compiler identification is Clang -- Found assembler: /usr/bin/clang CMake Error at cli/exe.cmake:7 (cmake_policy): Policy "CMP0083" is not known to this version of CMake. Call Stack (most recent call first): cli/apphost/static/CMakeLists.txt:41 (include) -- Performing Test HAVE_DIRENT_D_TYPE -- Performing Test HAVE_DIRENT_D_TYPE - Success Looking for coreclr_static lib at location: '/home/dotnet/runtime/artifacts/bin/coreclr/Linux.x64.Debug//lib'. CMake Error at cli/exe.cmake:7 (cmake_policy): Policy "CMP0083" is not known to this version of CMake. Call Stack (most recent call first): cli/apphost/standalone/CMakeLists.txt:39 (include) CMake Error at cli/exe.cmake:7 (cmake_policy): Policy "CMP0083" is not known to this version of CMake. Call Stack (most recent call first): cli/dotnet/CMakeLists.txt:16 (include) CMake Error at cli/fxr/standalone/CMakeLists.txt:51 (target_link_libraries): Target "libhostfxr_static" of type OBJECT_LIBRARY may not be linked into another target. One may link only to INTERFACE, STATIC or SHARED libraries, or to executables with the ENABLE_EXPORTS property set. CMake Error at cli/test/mockhostfxr/CMakeLists.txt:4 (cmake_minimum_required): CMake 3.14.5 or higher is required. You are running version 3.11.4 -- Configuring incomplete, errors occurred!

Please let me know if there's anything I can do to help.

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

I've fixed the issues that I've found relatively simple (removing the unknown policy and removing the extra cmake_minimum_required), but I'm not sure how to fix the libhostfxr_static linking issue. If you know how to downgrade that, I'd appreciate the help.

@omajid

Copy link
Copy Markdown
Member

If you know how to downgrade that, I'd appreciate the help.

Not off the top of my head. I will dig around.

@janvorli

Copy link
Copy Markdown
Member

but I'm not sure how to fix the libhostfxr_static linking issue

The object libraries cannot be used as regular libraries to link to prior to cmake 3.14. All places need to be changed so that the objects from the object libraries are added to the respective targets like source files. E.g.:

add_library(... $<TARGET_OBJECTS:objlib> ...)

@jashook

Copy link
Copy Markdown
Contributor

I am having trouble building with 3.6.2. Seems that https://github.com/dotnet/runtime/blob/master/src/coreclr/src/vm/eventing/CMakeLists.txt#L11 requires cmake 3.8+.

How did you get around this @jkoritzinsky

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

I forgot about that. I need to roll that back to use the old find python module.

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

@safern can you take a look at the libraries build failures on OSX?

@janvorli

Copy link
Copy Markdown
Member

I've pushed a fix. The problem was that the VM_HEADERS_WKS_ARCH_ASM that contained the asmconstants.h was being added to VM_SOURCES_WKS_ARCH_ASM, which is a set of files that are to be compiled with assembler. It needed to be added to VM_SOURCES_WKS instead (which is done just to let the header appear in the visual studio solution explorer, cmake is clever enough to not to pass .h files to the C++ compiler).

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

@omajid can you do a test build against the RHEL 7 image you'll be building against for the distro build?

@omajid

Copy link
Copy Markdown
Member

@omajid can you do a test build against the RHEL 7 image you'll be building against for the distro build?

Of course. I have tested on RHEL 8 using this PR (it works!). I am currently testing on RHEL 8 end-to-end now (using source-build Preview 4 + a manual backport of this patch). If/when that works, RHEL 7 is next on my list.

@jkoritzinsky
jkoritzinsky marked this pull request as ready for review July 31, 2020 19:10
@omajid

omajid commented Jul 31, 2020

Copy link
Copy Markdown
Member

@omajid can you do a test build against the RHEL 7 image you'll be building against for the distro build?

A ./build.sh clr works with commit 265f684da4d370909c70399fd9be4bd089c607b2 after this trivial change:

diff --git a/src/installer/corehost/CMakeLists.txt b/src/installer/corehost/CMakeLists.txt
index 178d8ab..46d1c5e 100644
--- a/src/installer/corehost/CMakeLists.txt+++ b/src/installer/corehost/CMakeLists.txt@@ -1,4 +1,4 @@-cmake_minimum_required(VERSION 3.6.3)+cmake_minimum_required(VERSION 3.6.2)
project(corehost)
diff --git a/src/libraries/Native/Unix/CMakeLists.txt b/src/libraries/Native/Unix/CMakeLists.txt
index dee9e51..3168c7e 100644
--- a/src/libraries/Native/Unix/CMakeLists.txt+++ b/src/libraries/Native/Unix/CMakeLists.txt@@ -1,4 +1,4 @@-cmake_minimum_required(VERSION 3.6.3)+cmake_minimum_required(VERSION 3.6.2)
if(CLR_CMAKE_TARGET_IOS OR CLR_CMAKE_TARGET_TVOS) # CMake 3.14.5 contains bug fixes for iOS cmake_minimum_required(VERSION 3.14.5) diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt
index c75e5db..77fcc16 100644
--- a/src/tests/CMakeLists.txt+++ b/src/tests/CMakeLists.txt@@ -1,4 +1,4 @@-cmake_minimum_required(VERSION 3.6.3)+cmake_minimum_required(VERSION 3.6.2)
cmake_policy(SET CMP0042 NEW)
project(Tests)

Edit: I am still working on backporting this to preview 4 so I can test end-to-end with source-build (on RHEL 7 and RHEL 8).

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

I've applied your patch. Marking this PR as ready for review/non-work in progress

@jkoritzinskyjkoritzinsky changed the title [WIP] Minimum CMake downgrade for LinuxMinimum CMake downgrade for LinuxJul 31, 2020

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

The non-coreclr specific changes look good to me (can't vouch for the coreclr changes).


add_dependencies(bcltype eventing_headers)
add_dependencies(bcltype_obj eventing_headers)
add_library(bcltype INTERFACE)

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.

An idea for a future cleanup: This add_library / target_sources pair pattern is used at 24 places. It may be nice to clean this up in a follow up change by creating a cmake function for this pattern. Or even encapsulate the add_library_clr in that function, getting something along these lines:

add_intermediate_library_clr(bcltype${BCLTYPE_SOURCES})
add_intermediate_library_dependencies(bcltypeeventing_headers)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Yes, we should clean this up in the future by making some additional functions.

../../../hostfxr_resolver.h
)

list(APPEND SOURCES $<TARGET_OBJECTS:libhostfxr_static> $<TARGET_OBJECTS:libhostpolicy_static>)

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 wonder why was this change needed. Linking to the static libraries should work fine. The only case when we need to use object libraries is when a static library is built as a combination of other libraries, but it is not the case here.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

The libhostfxr_static and libhostpolicy_static targets are object libraries. The corehost CMake infra could really use some updates and cleanup to be more straightforward. I'd like to do that in a future PR.

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.

Hmm, interesting. I can see that they were changed to object ones few months ago and I am not sure why.

I agree that the corehost cmakefiles are very difficult to mentally parse. They looks as if msbuild style of build programming was used here. Instead of using functions for doing common stuff, ambient cmake variables are being set and then common helper cmake files included. I'd love to see it transformed to a natural cmake way at some point.

Comment threadsrc/libraries/Native/Unix/System.Globalization.Native/CMakeLists.txt Outdated
@jeffschwMSFT

Copy link
Copy Markdown
Member

cc @mmitche

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

@janvorli any more comments?

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

LGTM, thank you!

@janvorli

Copy link
Copy Markdown
Member

@jkoritzinsky no, I have thought I've already approved it, but I can see I haven't. So I've just done that.

@jkoritzinsky
jkoritzinsky merged commit ece10ad into dotnet:masterAug 4, 2020
@jkoritzinsky
jkoritzinsky deleted the cmake-downgrade branch August 4, 2020 18:04
@jashook

Copy link
Copy Markdown
Contributor

Thank you @jkoritzinsky for driving this effort!

@jashook

Copy link
Copy Markdown
Contributor

@omajid which version of clang are we using on redhat 7 for source build? We noticed that by default centos 7 installs 3.4 which we do not support building with.

/cc @janvorli@jkoritzinsky

@omajid

omajid commented Aug 4, 2020

Copy link
Copy Markdown
Member

which version of clang are we using on redhat 7 for source build?

We have generally used llvm-toolset-7.0-cmake (CentOS version here), which is 3.6.2.

This is how we are building 3.1 with llvm-toolset-7.0: https://git.centos.org/rpms/rh-dotnet31-dotnet/blob/c7-dotnet/f/SPECS/dotnet.spec#_314. I don't have a 5.0 version yet, because I haven't been able to build source-build there.

@jashook

jashook commented Aug 4, 2020

Copy link
Copy Markdown
Contributor

Clean builds using the following:

OsCmakeClang/llvm
Centos 73.6.27
Centos 83.11.48

@mmitche

Copy link
Copy Markdown
Member

@jeffschwMSFT Was this supposed to be ported to p8?

@jeffschwMSFT

Copy link
Copy Markdown
Member

@mmitche yes, @jashook is working on the port.

@omajid

Copy link
Copy Markdown
Member

I did a port to preview 4, so I could build against older cmake versions using source-build. Source-build is currently at 5.0 Preview 4. Port is available here: https://github.com/omajid/runtime/tree/5.0-preview4-cmake-backport

jashook pushed a commit to jashook/runtime that referenced this pull request Aug 6, 2020
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
mmitche pushed a commit that referenced this pull request Aug 7, 2020
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
Co-authored-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
Jacksondr5 pushed a commit to Jacksondr5/runtime that referenced this pull request Aug 10, 2020
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
@ghostghost locked as resolved and limited conversation to collaborators Dec 8, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Requiring CMake versions that aren't in the default package repository

8 participants

@jkoritzinsky@omajid@janvorli@jashook@jeffschwMSFT@mmitche@akoeplinger@safern
, '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

Minimum CMake downgrade for Linux - #39044

Merged
jkoritzinsky merged 36 commits into
dotnet:masterfrom
jkoritzinsky:cmake-downgrade
Aug 4, 2020
Merged

Minimum CMake downgrade for Linux#39044
jkoritzinsky merged 36 commits into
dotnet:masterfrom
jkoritzinsky:cmake-downgrade

Conversation

@jkoritzinsky

Copy link
Copy Markdown
Member

Downgrade the minimum version of CMake to 3.6.2 for our Linux builds and change our CMake scripts appropriately:

Currently completed steps:

  • Provide our own implementation of add_compile_definitions since it is easily polyfillable
  • Move away from add_link_options since it is not easy to create our own implementation of that functions the same. Move back to setting linker options via the flag properties.
  • Manually enable PIE/PIC on Linux/Mac (this support was added in CMake 3.9)
  • Manually check for IPO support on Linux/Mac (this support was added in CMake 3.13)
  • Revert to the old CMake command line (this support was added in CMake 3.10)

So far I've only undone the changes that I made in dotnet/coreclr#26980 that I know are required. @janvorli can you help out with some of the other issues that we'll encounter when lowering the CMake version? I don't know all of the corner case behaviors that we've started to depend on in the last 10ish months.

Validation that we actually build on CMake 3.6.2 will come when we get a new Docker image has CMake 3.6.2 (and no newer) installed (@jashook is working on this).

Contributes to #38755

Depends on dotnet/arcade#5770

cc: @dleeapho@janvorli@jashook@omajid@jkotas@tmds@wfurt@RheaAyase

@ghost

ghost commented Jul 9, 2020

Copy link
Copy Markdown

Tagging subscribers to this area: @ViktorHofer
Notify danmosemsft if you want to be subscribed.

Comment threadeng/native/configurecompiler.cmake Outdated
Comment threadeng/native/configurecompiler.cmake Outdated
Comment threadeng/native/configurecompiler.cmake Outdated
Comment threadsrc/coreclr/src/dlls/mscoree/coreclr/CMakeLists.txt Outdated
Comment threadeng/native/configureplatform.cmake Outdated
Comment threadeng/native/build-commons.sh
Comment threadeng/native/configureplatform.cmake
Comment threadsrc/coreclr/pgosupport.cmake Outdated
Comment threadsrc/coreclr/src/ToolBox/SOS/DacTableGen/CMakeLists.txt
Comment threadsrc/libraries/Native/Unix/CMakeLists.txt Outdated
@omajid

omajid commented Jul 14, 2020

Copy link
Copy Markdown
Member

Thanks for this PR!

I tried building ad16a9797a2e899caec8a610f667789e0bec6524 using ./build.sh on RHEL 8. It doesn't seem to work. This is cmake version 3.11.4

 Detected Linux x86_64 -- Performing Test COMPILER_SUPPORTS_F_STACK_PROTECTOR_STRONG -- Performing Test COMPILER_SUPPORTS_F_STACK_PROTECTOR_STRONG - Success -- The ASM compiler identification is Clang -- Found assembler: /usr/bin/clang CMake Error at cli/exe.cmake:7 (cmake_policy): Policy "CMP0083" is not known to this version of CMake. Call Stack (most recent call first): cli/apphost/static/CMakeLists.txt:41 (include) -- Performing Test HAVE_DIRENT_D_TYPE -- Performing Test HAVE_DIRENT_D_TYPE - Success Looking for coreclr_static lib at location: '/home/dotnet/runtime/artifacts/bin/coreclr/Linux.x64.Debug//lib'. CMake Error at cli/exe.cmake:7 (cmake_policy): Policy "CMP0083" is not known to this version of CMake. Call Stack (most recent call first): cli/apphost/standalone/CMakeLists.txt:39 (include) CMake Error at cli/exe.cmake:7 (cmake_policy): Policy "CMP0083" is not known to this version of CMake. Call Stack (most recent call first): cli/dotnet/CMakeLists.txt:16 (include) CMake Error at cli/fxr/standalone/CMakeLists.txt:51 (target_link_libraries): Target "libhostfxr_static" of type OBJECT_LIBRARY may not be linked into another target. One may link only to INTERFACE, STATIC or SHARED libraries, or to executables with the ENABLE_EXPORTS property set. CMake Error at cli/test/mockhostfxr/CMakeLists.txt:4 (cmake_minimum_required): CMake 3.14.5 or higher is required. You are running version 3.11.4 -- Configuring incomplete, errors occurred!

Please let me know if there's anything I can do to help.

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

I've fixed the issues that I've found relatively simple (removing the unknown policy and removing the extra cmake_minimum_required), but I'm not sure how to fix the libhostfxr_static linking issue. If you know how to downgrade that, I'd appreciate the help.

@omajid

Copy link
Copy Markdown
Member

If you know how to downgrade that, I'd appreciate the help.

Not off the top of my head. I will dig around.

@janvorli

Copy link
Copy Markdown
Member

but I'm not sure how to fix the libhostfxr_static linking issue

The object libraries cannot be used as regular libraries to link to prior to cmake 3.14. All places need to be changed so that the objects from the object libraries are added to the respective targets like source files. E.g.:

add_library(... $<TARGET_OBJECTS:objlib> ...)

@jashook

Copy link
Copy Markdown
Contributor

I am having trouble building with 3.6.2. Seems that https://github.com/dotnet/runtime/blob/master/src/coreclr/src/vm/eventing/CMakeLists.txt#L11 requires cmake 3.8+.

How did you get around this @jkoritzinsky

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

I forgot about that. I need to roll that back to use the old find python module.

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

@safern can you take a look at the libraries build failures on OSX?

@janvorli

Copy link
Copy Markdown
Member

I've pushed a fix. The problem was that the VM_HEADERS_WKS_ARCH_ASM that contained the asmconstants.h was being added to VM_SOURCES_WKS_ARCH_ASM, which is a set of files that are to be compiled with assembler. It needed to be added to VM_SOURCES_WKS instead (which is done just to let the header appear in the visual studio solution explorer, cmake is clever enough to not to pass .h files to the C++ compiler).

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

@omajid can you do a test build against the RHEL 7 image you'll be building against for the distro build?

@omajid

Copy link
Copy Markdown
Member

@omajid can you do a test build against the RHEL 7 image you'll be building against for the distro build?

Of course. I have tested on RHEL 8 using this PR (it works!). I am currently testing on RHEL 8 end-to-end now (using source-build Preview 4 + a manual backport of this patch). If/when that works, RHEL 7 is next on my list.

@jkoritzinsky
jkoritzinsky marked this pull request as ready for review July 31, 2020 19:10
@omajid

omajid commented Jul 31, 2020

Copy link
Copy Markdown
Member

@omajid can you do a test build against the RHEL 7 image you'll be building against for the distro build?

A ./build.sh clr works with commit 265f684da4d370909c70399fd9be4bd089c607b2 after this trivial change:

diff --git a/src/installer/corehost/CMakeLists.txt b/src/installer/corehost/CMakeLists.txt
index 178d8ab..46d1c5e 100644
--- a/src/installer/corehost/CMakeLists.txt+++ b/src/installer/corehost/CMakeLists.txt@@ -1,4 +1,4 @@-cmake_minimum_required(VERSION 3.6.3)+cmake_minimum_required(VERSION 3.6.2)
project(corehost)
diff --git a/src/libraries/Native/Unix/CMakeLists.txt b/src/libraries/Native/Unix/CMakeLists.txt
index dee9e51..3168c7e 100644
--- a/src/libraries/Native/Unix/CMakeLists.txt+++ b/src/libraries/Native/Unix/CMakeLists.txt@@ -1,4 +1,4 @@-cmake_minimum_required(VERSION 3.6.3)+cmake_minimum_required(VERSION 3.6.2)
if(CLR_CMAKE_TARGET_IOS OR CLR_CMAKE_TARGET_TVOS) # CMake 3.14.5 contains bug fixes for iOS cmake_minimum_required(VERSION 3.14.5) diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt
index c75e5db..77fcc16 100644
--- a/src/tests/CMakeLists.txt+++ b/src/tests/CMakeLists.txt@@ -1,4 +1,4 @@-cmake_minimum_required(VERSION 3.6.3)+cmake_minimum_required(VERSION 3.6.2)
cmake_policy(SET CMP0042 NEW)
project(Tests)

Edit: I am still working on backporting this to preview 4 so I can test end-to-end with source-build (on RHEL 7 and RHEL 8).

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

I've applied your patch. Marking this PR as ready for review/non-work in progress

@jkoritzinskyjkoritzinsky changed the title [WIP] Minimum CMake downgrade for LinuxMinimum CMake downgrade for LinuxJul 31, 2020

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

The non-coreclr specific changes look good to me (can't vouch for the coreclr changes).


add_dependencies(bcltype eventing_headers)
add_dependencies(bcltype_obj eventing_headers)
add_library(bcltype INTERFACE)

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.

An idea for a future cleanup: This add_library / target_sources pair pattern is used at 24 places. It may be nice to clean this up in a follow up change by creating a cmake function for this pattern. Or even encapsulate the add_library_clr in that function, getting something along these lines:

add_intermediate_library_clr(bcltype${BCLTYPE_SOURCES})
add_intermediate_library_dependencies(bcltypeeventing_headers)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Yes, we should clean this up in the future by making some additional functions.

../../../hostfxr_resolver.h
)

list(APPEND SOURCES $<TARGET_OBJECTS:libhostfxr_static> $<TARGET_OBJECTS:libhostpolicy_static>)

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 wonder why was this change needed. Linking to the static libraries should work fine. The only case when we need to use object libraries is when a static library is built as a combination of other libraries, but it is not the case here.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

The libhostfxr_static and libhostpolicy_static targets are object libraries. The corehost CMake infra could really use some updates and cleanup to be more straightforward. I'd like to do that in a future PR.

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.

Hmm, interesting. I can see that they were changed to object ones few months ago and I am not sure why.

I agree that the corehost cmakefiles are very difficult to mentally parse. They looks as if msbuild style of build programming was used here. Instead of using functions for doing common stuff, ambient cmake variables are being set and then common helper cmake files included. I'd love to see it transformed to a natural cmake way at some point.

Comment threadsrc/libraries/Native/Unix/System.Globalization.Native/CMakeLists.txt Outdated
@jeffschwMSFT

Copy link
Copy Markdown
Member

cc @mmitche

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

@janvorli any more comments?

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

LGTM, thank you!

@janvorli

Copy link
Copy Markdown
Member

@jkoritzinsky no, I have thought I've already approved it, but I can see I haven't. So I've just done that.

@jkoritzinsky
jkoritzinsky merged commit ece10ad into dotnet:masterAug 4, 2020
@jkoritzinsky
jkoritzinsky deleted the cmake-downgrade branch August 4, 2020 18:04
@jashook

Copy link
Copy Markdown
Contributor

Thank you @jkoritzinsky for driving this effort!

@jashook

Copy link
Copy Markdown
Contributor

@omajid which version of clang are we using on redhat 7 for source build? We noticed that by default centos 7 installs 3.4 which we do not support building with.

/cc @janvorli@jkoritzinsky

@omajid

omajid commented Aug 4, 2020

Copy link
Copy Markdown
Member

which version of clang are we using on redhat 7 for source build?

We have generally used llvm-toolset-7.0-cmake (CentOS version here), which is 3.6.2.

This is how we are building 3.1 with llvm-toolset-7.0: https://git.centos.org/rpms/rh-dotnet31-dotnet/blob/c7-dotnet/f/SPECS/dotnet.spec#_314. I don't have a 5.0 version yet, because I haven't been able to build source-build there.

@jashook

jashook commented Aug 4, 2020

Copy link
Copy Markdown
Contributor

Clean builds using the following:

OsCmakeClang/llvm
Centos 73.6.27
Centos 83.11.48

@mmitche

Copy link
Copy Markdown
Member

@jeffschwMSFT Was this supposed to be ported to p8?

@jeffschwMSFT

Copy link
Copy Markdown
Member

@mmitche yes, @jashook is working on the port.

@omajid

Copy link
Copy Markdown
Member

I did a port to preview 4, so I could build against older cmake versions using source-build. Source-build is currently at 5.0 Preview 4. Port is available here: https://github.com/omajid/runtime/tree/5.0-preview4-cmake-backport

jashook pushed a commit to jashook/runtime that referenced this pull request Aug 6, 2020
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
mmitche pushed a commit that referenced this pull request Aug 7, 2020
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
Co-authored-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
Jacksondr5 pushed a commit to Jacksondr5/runtime that referenced this pull request Aug 10, 2020
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
@ghostghost locked as resolved and limited conversation to collaborators Dec 8, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Requiring CMake versions that aren't in the default package repository

8 participants

@jkoritzinsky@omajid@janvorli@jashook@jeffschwMSFT@mmitche@akoeplinger@safern
, '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

Minimum CMake downgrade for Linux - #39044

Merged
jkoritzinsky merged 36 commits into
dotnet:masterfrom
jkoritzinsky:cmake-downgrade
Aug 4, 2020
Merged

Minimum CMake downgrade for Linux#39044
jkoritzinsky merged 36 commits into
dotnet:masterfrom
jkoritzinsky:cmake-downgrade

Conversation

@jkoritzinsky

Copy link
Copy Markdown
Member

Downgrade the minimum version of CMake to 3.6.2 for our Linux builds and change our CMake scripts appropriately:

Currently completed steps:

  • Provide our own implementation of add_compile_definitions since it is easily polyfillable
  • Move away from add_link_options since it is not easy to create our own implementation of that functions the same. Move back to setting linker options via the flag properties.
  • Manually enable PIE/PIC on Linux/Mac (this support was added in CMake 3.9)
  • Manually check for IPO support on Linux/Mac (this support was added in CMake 3.13)
  • Revert to the old CMake command line (this support was added in CMake 3.10)

So far I've only undone the changes that I made in dotnet/coreclr#26980 that I know are required. @janvorli can you help out with some of the other issues that we'll encounter when lowering the CMake version? I don't know all of the corner case behaviors that we've started to depend on in the last 10ish months.

Validation that we actually build on CMake 3.6.2 will come when we get a new Docker image has CMake 3.6.2 (and no newer) installed (@jashook is working on this).

Contributes to #38755

Depends on dotnet/arcade#5770

cc: @dleeapho@janvorli@jashook@omajid@jkotas@tmds@wfurt@RheaAyase

@ghost

ghost commented Jul 9, 2020

Copy link
Copy Markdown

Tagging subscribers to this area: @ViktorHofer
Notify danmosemsft if you want to be subscribed.

Comment threadeng/native/configurecompiler.cmake Outdated
Comment threadeng/native/configurecompiler.cmake Outdated
Comment threadeng/native/configurecompiler.cmake Outdated
Comment threadsrc/coreclr/src/dlls/mscoree/coreclr/CMakeLists.txt Outdated
Comment threadeng/native/configureplatform.cmake Outdated
Comment threadeng/native/build-commons.sh
Comment threadeng/native/configureplatform.cmake
Comment threadsrc/coreclr/pgosupport.cmake Outdated
Comment threadsrc/coreclr/src/ToolBox/SOS/DacTableGen/CMakeLists.txt
Comment threadsrc/libraries/Native/Unix/CMakeLists.txt Outdated
@omajid

omajid commented Jul 14, 2020

Copy link
Copy Markdown
Member

Thanks for this PR!

I tried building ad16a9797a2e899caec8a610f667789e0bec6524 using ./build.sh on RHEL 8. It doesn't seem to work. This is cmake version 3.11.4

 Detected Linux x86_64 -- Performing Test COMPILER_SUPPORTS_F_STACK_PROTECTOR_STRONG -- Performing Test COMPILER_SUPPORTS_F_STACK_PROTECTOR_STRONG - Success -- The ASM compiler identification is Clang -- Found assembler: /usr/bin/clang CMake Error at cli/exe.cmake:7 (cmake_policy): Policy "CMP0083" is not known to this version of CMake. Call Stack (most recent call first): cli/apphost/static/CMakeLists.txt:41 (include) -- Performing Test HAVE_DIRENT_D_TYPE -- Performing Test HAVE_DIRENT_D_TYPE - Success Looking for coreclr_static lib at location: '/home/dotnet/runtime/artifacts/bin/coreclr/Linux.x64.Debug//lib'. CMake Error at cli/exe.cmake:7 (cmake_policy): Policy "CMP0083" is not known to this version of CMake. Call Stack (most recent call first): cli/apphost/standalone/CMakeLists.txt:39 (include) CMake Error at cli/exe.cmake:7 (cmake_policy): Policy "CMP0083" is not known to this version of CMake. Call Stack (most recent call first): cli/dotnet/CMakeLists.txt:16 (include) CMake Error at cli/fxr/standalone/CMakeLists.txt:51 (target_link_libraries): Target "libhostfxr_static" of type OBJECT_LIBRARY may not be linked into another target. One may link only to INTERFACE, STATIC or SHARED libraries, or to executables with the ENABLE_EXPORTS property set. CMake Error at cli/test/mockhostfxr/CMakeLists.txt:4 (cmake_minimum_required): CMake 3.14.5 or higher is required. You are running version 3.11.4 -- Configuring incomplete, errors occurred!

Please let me know if there's anything I can do to help.

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

I've fixed the issues that I've found relatively simple (removing the unknown policy and removing the extra cmake_minimum_required), but I'm not sure how to fix the libhostfxr_static linking issue. If you know how to downgrade that, I'd appreciate the help.

@omajid

Copy link
Copy Markdown
Member

If you know how to downgrade that, I'd appreciate the help.

Not off the top of my head. I will dig around.

@janvorli

Copy link
Copy Markdown
Member

but I'm not sure how to fix the libhostfxr_static linking issue

The object libraries cannot be used as regular libraries to link to prior to cmake 3.14. All places need to be changed so that the objects from the object libraries are added to the respective targets like source files. E.g.:

add_library(... $<TARGET_OBJECTS:objlib> ...)

@jashook

Copy link
Copy Markdown
Contributor

I am having trouble building with 3.6.2. Seems that https://github.com/dotnet/runtime/blob/master/src/coreclr/src/vm/eventing/CMakeLists.txt#L11 requires cmake 3.8+.

How did you get around this @jkoritzinsky

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

I forgot about that. I need to roll that back to use the old find python module.

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

@safern can you take a look at the libraries build failures on OSX?

@janvorli

Copy link
Copy Markdown
Member

I've pushed a fix. The problem was that the VM_HEADERS_WKS_ARCH_ASM that contained the asmconstants.h was being added to VM_SOURCES_WKS_ARCH_ASM, which is a set of files that are to be compiled with assembler. It needed to be added to VM_SOURCES_WKS instead (which is done just to let the header appear in the visual studio solution explorer, cmake is clever enough to not to pass .h files to the C++ compiler).

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

@omajid can you do a test build against the RHEL 7 image you'll be building against for the distro build?

@omajid

Copy link
Copy Markdown
Member

@omajid can you do a test build against the RHEL 7 image you'll be building against for the distro build?

Of course. I have tested on RHEL 8 using this PR (it works!). I am currently testing on RHEL 8 end-to-end now (using source-build Preview 4 + a manual backport of this patch). If/when that works, RHEL 7 is next on my list.

@jkoritzinsky
jkoritzinsky marked this pull request as ready for review July 31, 2020 19:10
@omajid

omajid commented Jul 31, 2020

Copy link
Copy Markdown
Member

@omajid can you do a test build against the RHEL 7 image you'll be building against for the distro build?

A ./build.sh clr works with commit 265f684da4d370909c70399fd9be4bd089c607b2 after this trivial change:

diff --git a/src/installer/corehost/CMakeLists.txt b/src/installer/corehost/CMakeLists.txt
index 178d8ab..46d1c5e 100644
--- a/src/installer/corehost/CMakeLists.txt+++ b/src/installer/corehost/CMakeLists.txt@@ -1,4 +1,4 @@-cmake_minimum_required(VERSION 3.6.3)+cmake_minimum_required(VERSION 3.6.2)
project(corehost)
diff --git a/src/libraries/Native/Unix/CMakeLists.txt b/src/libraries/Native/Unix/CMakeLists.txt
index dee9e51..3168c7e 100644
--- a/src/libraries/Native/Unix/CMakeLists.txt+++ b/src/libraries/Native/Unix/CMakeLists.txt@@ -1,4 +1,4 @@-cmake_minimum_required(VERSION 3.6.3)+cmake_minimum_required(VERSION 3.6.2)
if(CLR_CMAKE_TARGET_IOS OR CLR_CMAKE_TARGET_TVOS) # CMake 3.14.5 contains bug fixes for iOS cmake_minimum_required(VERSION 3.14.5) diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt
index c75e5db..77fcc16 100644
--- a/src/tests/CMakeLists.txt+++ b/src/tests/CMakeLists.txt@@ -1,4 +1,4 @@-cmake_minimum_required(VERSION 3.6.3)+cmake_minimum_required(VERSION 3.6.2)
cmake_policy(SET CMP0042 NEW)
project(Tests)

Edit: I am still working on backporting this to preview 4 so I can test end-to-end with source-build (on RHEL 7 and RHEL 8).

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

I've applied your patch. Marking this PR as ready for review/non-work in progress

@jkoritzinskyjkoritzinsky changed the title [WIP] Minimum CMake downgrade for LinuxMinimum CMake downgrade for LinuxJul 31, 2020

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

The non-coreclr specific changes look good to me (can't vouch for the coreclr changes).


add_dependencies(bcltype eventing_headers)
add_dependencies(bcltype_obj eventing_headers)
add_library(bcltype INTERFACE)

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.

An idea for a future cleanup: This add_library / target_sources pair pattern is used at 24 places. It may be nice to clean this up in a follow up change by creating a cmake function for this pattern. Or even encapsulate the add_library_clr in that function, getting something along these lines:

add_intermediate_library_clr(bcltype${BCLTYPE_SOURCES})
add_intermediate_library_dependencies(bcltypeeventing_headers)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Yes, we should clean this up in the future by making some additional functions.

../../../hostfxr_resolver.h
)

list(APPEND SOURCES $<TARGET_OBJECTS:libhostfxr_static> $<TARGET_OBJECTS:libhostpolicy_static>)

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 wonder why was this change needed. Linking to the static libraries should work fine. The only case when we need to use object libraries is when a static library is built as a combination of other libraries, but it is not the case here.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

The libhostfxr_static and libhostpolicy_static targets are object libraries. The corehost CMake infra could really use some updates and cleanup to be more straightforward. I'd like to do that in a future PR.

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.

Hmm, interesting. I can see that they were changed to object ones few months ago and I am not sure why.

I agree that the corehost cmakefiles are very difficult to mentally parse. They looks as if msbuild style of build programming was used here. Instead of using functions for doing common stuff, ambient cmake variables are being set and then common helper cmake files included. I'd love to see it transformed to a natural cmake way at some point.

Comment threadsrc/libraries/Native/Unix/System.Globalization.Native/CMakeLists.txt Outdated
@jeffschwMSFT

Copy link
Copy Markdown
Member

cc @mmitche

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

@janvorli any more comments?

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

LGTM, thank you!

@janvorli

Copy link
Copy Markdown
Member

@jkoritzinsky no, I have thought I've already approved it, but I can see I haven't. So I've just done that.

@jkoritzinsky
jkoritzinsky merged commit ece10ad into dotnet:masterAug 4, 2020
@jkoritzinsky
jkoritzinsky deleted the cmake-downgrade branch August 4, 2020 18:04
@jashook

Copy link
Copy Markdown
Contributor

Thank you @jkoritzinsky for driving this effort!

@jashook

Copy link
Copy Markdown
Contributor

@omajid which version of clang are we using on redhat 7 for source build? We noticed that by default centos 7 installs 3.4 which we do not support building with.

/cc @janvorli@jkoritzinsky

@omajid

omajid commented Aug 4, 2020

Copy link
Copy Markdown
Member

which version of clang are we using on redhat 7 for source build?

We have generally used llvm-toolset-7.0-cmake (CentOS version here), which is 3.6.2.

This is how we are building 3.1 with llvm-toolset-7.0: https://git.centos.org/rpms/rh-dotnet31-dotnet/blob/c7-dotnet/f/SPECS/dotnet.spec#_314. I don't have a 5.0 version yet, because I haven't been able to build source-build there.

@jashook

jashook commented Aug 4, 2020

Copy link
Copy Markdown
Contributor

Clean builds using the following:

OsCmakeClang/llvm
Centos 73.6.27
Centos 83.11.48

@mmitche

Copy link
Copy Markdown
Member

@jeffschwMSFT Was this supposed to be ported to p8?

@jeffschwMSFT

Copy link
Copy Markdown
Member

@mmitche yes, @jashook is working on the port.

@omajid

Copy link
Copy Markdown
Member

I did a port to preview 4, so I could build against older cmake versions using source-build. Source-build is currently at 5.0 Preview 4. Port is available here: https://github.com/omajid/runtime/tree/5.0-preview4-cmake-backport

jashook pushed a commit to jashook/runtime that referenced this pull request Aug 6, 2020
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
mmitche pushed a commit that referenced this pull request Aug 7, 2020
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
Co-authored-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
Jacksondr5 pushed a commit to Jacksondr5/runtime that referenced this pull request Aug 10, 2020
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
@ghostghost locked as resolved and limited conversation to collaborators Dec 8, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Requiring CMake versions that aren't in the default package repository

8 participants

@jkoritzinsky@omajid@janvorli@jashook@jeffschwMSFT@mmitche@akoeplinger@safern
, '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

Minimum CMake downgrade for Linux - #39044

Merged
jkoritzinsky merged 36 commits into
dotnet:masterfrom
jkoritzinsky:cmake-downgrade
Aug 4, 2020
Merged

Minimum CMake downgrade for Linux#39044
jkoritzinsky merged 36 commits into
dotnet:masterfrom
jkoritzinsky:cmake-downgrade

Conversation

@jkoritzinsky

Copy link
Copy Markdown
Member

Downgrade the minimum version of CMake to 3.6.2 for our Linux builds and change our CMake scripts appropriately:

Currently completed steps:

  • Provide our own implementation of add_compile_definitions since it is easily polyfillable
  • Move away from add_link_options since it is not easy to create our own implementation of that functions the same. Move back to setting linker options via the flag properties.
  • Manually enable PIE/PIC on Linux/Mac (this support was added in CMake 3.9)
  • Manually check for IPO support on Linux/Mac (this support was added in CMake 3.13)
  • Revert to the old CMake command line (this support was added in CMake 3.10)

So far I've only undone the changes that I made in dotnet/coreclr#26980 that I know are required. @janvorli can you help out with some of the other issues that we'll encounter when lowering the CMake version? I don't know all of the corner case behaviors that we've started to depend on in the last 10ish months.

Validation that we actually build on CMake 3.6.2 will come when we get a new Docker image has CMake 3.6.2 (and no newer) installed (@jashook is working on this).

Contributes to #38755

Depends on dotnet/arcade#5770

cc: @dleeapho@janvorli@jashook@omajid@jkotas@tmds@wfurt@RheaAyase

@ghost

ghost commented Jul 9, 2020

Copy link
Copy Markdown

Tagging subscribers to this area: @ViktorHofer
Notify danmosemsft if you want to be subscribed.

Comment threadeng/native/configurecompiler.cmake Outdated
Comment threadeng/native/configurecompiler.cmake Outdated
Comment threadeng/native/configurecompiler.cmake Outdated
Comment threadsrc/coreclr/src/dlls/mscoree/coreclr/CMakeLists.txt Outdated
Comment threadeng/native/configureplatform.cmake Outdated
Comment threadeng/native/build-commons.sh
Comment threadeng/native/configureplatform.cmake
Comment threadsrc/coreclr/pgosupport.cmake Outdated
Comment threadsrc/coreclr/src/ToolBox/SOS/DacTableGen/CMakeLists.txt
Comment threadsrc/libraries/Native/Unix/CMakeLists.txt Outdated
@omajid

omajid commented Jul 14, 2020

Copy link
Copy Markdown
Member

Thanks for this PR!

I tried building ad16a9797a2e899caec8a610f667789e0bec6524 using ./build.sh on RHEL 8. It doesn't seem to work. This is cmake version 3.11.4

 Detected Linux x86_64 -- Performing Test COMPILER_SUPPORTS_F_STACK_PROTECTOR_STRONG -- Performing Test COMPILER_SUPPORTS_F_STACK_PROTECTOR_STRONG - Success -- The ASM compiler identification is Clang -- Found assembler: /usr/bin/clang CMake Error at cli/exe.cmake:7 (cmake_policy): Policy "CMP0083" is not known to this version of CMake. Call Stack (most recent call first): cli/apphost/static/CMakeLists.txt:41 (include) -- Performing Test HAVE_DIRENT_D_TYPE -- Performing Test HAVE_DIRENT_D_TYPE - Success Looking for coreclr_static lib at location: '/home/dotnet/runtime/artifacts/bin/coreclr/Linux.x64.Debug//lib'. CMake Error at cli/exe.cmake:7 (cmake_policy): Policy "CMP0083" is not known to this version of CMake. Call Stack (most recent call first): cli/apphost/standalone/CMakeLists.txt:39 (include) CMake Error at cli/exe.cmake:7 (cmake_policy): Policy "CMP0083" is not known to this version of CMake. Call Stack (most recent call first): cli/dotnet/CMakeLists.txt:16 (include) CMake Error at cli/fxr/standalone/CMakeLists.txt:51 (target_link_libraries): Target "libhostfxr_static" of type OBJECT_LIBRARY may not be linked into another target. One may link only to INTERFACE, STATIC or SHARED libraries, or to executables with the ENABLE_EXPORTS property set. CMake Error at cli/test/mockhostfxr/CMakeLists.txt:4 (cmake_minimum_required): CMake 3.14.5 or higher is required. You are running version 3.11.4 -- Configuring incomplete, errors occurred!

Please let me know if there's anything I can do to help.

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

I've fixed the issues that I've found relatively simple (removing the unknown policy and removing the extra cmake_minimum_required), but I'm not sure how to fix the libhostfxr_static linking issue. If you know how to downgrade that, I'd appreciate the help.

@omajid

Copy link
Copy Markdown
Member

If you know how to downgrade that, I'd appreciate the help.

Not off the top of my head. I will dig around.

@janvorli

Copy link
Copy Markdown
Member

but I'm not sure how to fix the libhostfxr_static linking issue

The object libraries cannot be used as regular libraries to link to prior to cmake 3.14. All places need to be changed so that the objects from the object libraries are added to the respective targets like source files. E.g.:

add_library(... $<TARGET_OBJECTS:objlib> ...)

@jashook

Copy link
Copy Markdown
Contributor

I am having trouble building with 3.6.2. Seems that https://github.com/dotnet/runtime/blob/master/src/coreclr/src/vm/eventing/CMakeLists.txt#L11 requires cmake 3.8+.

How did you get around this @jkoritzinsky

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

I forgot about that. I need to roll that back to use the old find python module.

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

@safern can you take a look at the libraries build failures on OSX?

@janvorli

Copy link
Copy Markdown
Member

I've pushed a fix. The problem was that the VM_HEADERS_WKS_ARCH_ASM that contained the asmconstants.h was being added to VM_SOURCES_WKS_ARCH_ASM, which is a set of files that are to be compiled with assembler. It needed to be added to VM_SOURCES_WKS instead (which is done just to let the header appear in the visual studio solution explorer, cmake is clever enough to not to pass .h files to the C++ compiler).

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

@omajid can you do a test build against the RHEL 7 image you'll be building against for the distro build?

@omajid

Copy link
Copy Markdown
Member

@omajid can you do a test build against the RHEL 7 image you'll be building against for the distro build?

Of course. I have tested on RHEL 8 using this PR (it works!). I am currently testing on RHEL 8 end-to-end now (using source-build Preview 4 + a manual backport of this patch). If/when that works, RHEL 7 is next on my list.

@jkoritzinsky
jkoritzinsky marked this pull request as ready for review July 31, 2020 19:10
@omajid

omajid commented Jul 31, 2020

Copy link
Copy Markdown
Member

@omajid can you do a test build against the RHEL 7 image you'll be building against for the distro build?

A ./build.sh clr works with commit 265f684da4d370909c70399fd9be4bd089c607b2 after this trivial change:

diff --git a/src/installer/corehost/CMakeLists.txt b/src/installer/corehost/CMakeLists.txt
index 178d8ab..46d1c5e 100644
--- a/src/installer/corehost/CMakeLists.txt+++ b/src/installer/corehost/CMakeLists.txt@@ -1,4 +1,4 @@-cmake_minimum_required(VERSION 3.6.3)+cmake_minimum_required(VERSION 3.6.2)
project(corehost)
diff --git a/src/libraries/Native/Unix/CMakeLists.txt b/src/libraries/Native/Unix/CMakeLists.txt
index dee9e51..3168c7e 100644
--- a/src/libraries/Native/Unix/CMakeLists.txt+++ b/src/libraries/Native/Unix/CMakeLists.txt@@ -1,4 +1,4 @@-cmake_minimum_required(VERSION 3.6.3)+cmake_minimum_required(VERSION 3.6.2)
if(CLR_CMAKE_TARGET_IOS OR CLR_CMAKE_TARGET_TVOS) # CMake 3.14.5 contains bug fixes for iOS cmake_minimum_required(VERSION 3.14.5) diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt
index c75e5db..77fcc16 100644
--- a/src/tests/CMakeLists.txt+++ b/src/tests/CMakeLists.txt@@ -1,4 +1,4 @@-cmake_minimum_required(VERSION 3.6.3)+cmake_minimum_required(VERSION 3.6.2)
cmake_policy(SET CMP0042 NEW)
project(Tests)

Edit: I am still working on backporting this to preview 4 so I can test end-to-end with source-build (on RHEL 7 and RHEL 8).

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

I've applied your patch. Marking this PR as ready for review/non-work in progress

@jkoritzinskyjkoritzinsky changed the title [WIP] Minimum CMake downgrade for LinuxMinimum CMake downgrade for LinuxJul 31, 2020

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

The non-coreclr specific changes look good to me (can't vouch for the coreclr changes).


add_dependencies(bcltype eventing_headers)
add_dependencies(bcltype_obj eventing_headers)
add_library(bcltype INTERFACE)

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.

An idea for a future cleanup: This add_library / target_sources pair pattern is used at 24 places. It may be nice to clean this up in a follow up change by creating a cmake function for this pattern. Or even encapsulate the add_library_clr in that function, getting something along these lines:

add_intermediate_library_clr(bcltype${BCLTYPE_SOURCES})
add_intermediate_library_dependencies(bcltypeeventing_headers)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Yes, we should clean this up in the future by making some additional functions.

../../../hostfxr_resolver.h
)

list(APPEND SOURCES $<TARGET_OBJECTS:libhostfxr_static> $<TARGET_OBJECTS:libhostpolicy_static>)

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 wonder why was this change needed. Linking to the static libraries should work fine. The only case when we need to use object libraries is when a static library is built as a combination of other libraries, but it is not the case here.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

The libhostfxr_static and libhostpolicy_static targets are object libraries. The corehost CMake infra could really use some updates and cleanup to be more straightforward. I'd like to do that in a future PR.

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.

Hmm, interesting. I can see that they were changed to object ones few months ago and I am not sure why.

I agree that the corehost cmakefiles are very difficult to mentally parse. They looks as if msbuild style of build programming was used here. Instead of using functions for doing common stuff, ambient cmake variables are being set and then common helper cmake files included. I'd love to see it transformed to a natural cmake way at some point.

Comment threadsrc/libraries/Native/Unix/System.Globalization.Native/CMakeLists.txt Outdated
@jeffschwMSFT

Copy link
Copy Markdown
Member

cc @mmitche

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

@janvorli any more comments?

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

LGTM, thank you!

@janvorli

Copy link
Copy Markdown
Member

@jkoritzinsky no, I have thought I've already approved it, but I can see I haven't. So I've just done that.

@jkoritzinsky
jkoritzinsky merged commit ece10ad into dotnet:masterAug 4, 2020
@jkoritzinsky
jkoritzinsky deleted the cmake-downgrade branch August 4, 2020 18:04
@jashook

Copy link
Copy Markdown
Contributor

Thank you @jkoritzinsky for driving this effort!

@jashook

Copy link
Copy Markdown
Contributor

@omajid which version of clang are we using on redhat 7 for source build? We noticed that by default centos 7 installs 3.4 which we do not support building with.

/cc @janvorli@jkoritzinsky

@omajid

omajid commented Aug 4, 2020

Copy link
Copy Markdown
Member

which version of clang are we using on redhat 7 for source build?

We have generally used llvm-toolset-7.0-cmake (CentOS version here), which is 3.6.2.

This is how we are building 3.1 with llvm-toolset-7.0: https://git.centos.org/rpms/rh-dotnet31-dotnet/blob/c7-dotnet/f/SPECS/dotnet.spec#_314. I don't have a 5.0 version yet, because I haven't been able to build source-build there.

@jashook

jashook commented Aug 4, 2020

Copy link
Copy Markdown
Contributor

Clean builds using the following:

OsCmakeClang/llvm
Centos 73.6.27
Centos 83.11.48

@mmitche

Copy link
Copy Markdown
Member

@jeffschwMSFT Was this supposed to be ported to p8?

@jeffschwMSFT

Copy link
Copy Markdown
Member

@mmitche yes, @jashook is working on the port.

@omajid

Copy link
Copy Markdown
Member

I did a port to preview 4, so I could build against older cmake versions using source-build. Source-build is currently at 5.0 Preview 4. Port is available here: https://github.com/omajid/runtime/tree/5.0-preview4-cmake-backport

jashook pushed a commit to jashook/runtime that referenced this pull request Aug 6, 2020
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
mmitche pushed a commit that referenced this pull request Aug 7, 2020
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
Co-authored-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
Jacksondr5 pushed a commit to Jacksondr5/runtime that referenced this pull request Aug 10, 2020
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
@ghostghost locked as resolved and limited conversation to collaborators Dec 8, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Requiring CMake versions that aren't in the default package repository

8 participants

@jkoritzinsky@omajid@janvorli@jashook@jeffschwMSFT@mmitche@akoeplinger@safern
, '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

Minimum CMake downgrade for Linux - #39044

Merged
jkoritzinsky merged 36 commits into
dotnet:masterfrom
jkoritzinsky:cmake-downgrade
Aug 4, 2020
Merged

Minimum CMake downgrade for Linux#39044
jkoritzinsky merged 36 commits into
dotnet:masterfrom
jkoritzinsky:cmake-downgrade

Conversation

@jkoritzinsky

Copy link
Copy Markdown
Member

Downgrade the minimum version of CMake to 3.6.2 for our Linux builds and change our CMake scripts appropriately:

Currently completed steps:

  • Provide our own implementation of add_compile_definitions since it is easily polyfillable
  • Move away from add_link_options since it is not easy to create our own implementation of that functions the same. Move back to setting linker options via the flag properties.
  • Manually enable PIE/PIC on Linux/Mac (this support was added in CMake 3.9)
  • Manually check for IPO support on Linux/Mac (this support was added in CMake 3.13)
  • Revert to the old CMake command line (this support was added in CMake 3.10)

So far I've only undone the changes that I made in dotnet/coreclr#26980 that I know are required. @janvorli can you help out with some of the other issues that we'll encounter when lowering the CMake version? I don't know all of the corner case behaviors that we've started to depend on in the last 10ish months.

Validation that we actually build on CMake 3.6.2 will come when we get a new Docker image has CMake 3.6.2 (and no newer) installed (@jashook is working on this).

Contributes to #38755

Depends on dotnet/arcade#5770

cc: @dleeapho@janvorli@jashook@omajid@jkotas@tmds@wfurt@RheaAyase

@ghost

ghost commented Jul 9, 2020

Copy link
Copy Markdown

Tagging subscribers to this area: @ViktorHofer
Notify danmosemsft if you want to be subscribed.

Comment threadeng/native/configurecompiler.cmake Outdated
Comment threadeng/native/configurecompiler.cmake Outdated
Comment threadeng/native/configurecompiler.cmake Outdated
Comment threadsrc/coreclr/src/dlls/mscoree/coreclr/CMakeLists.txt Outdated
Comment threadeng/native/configureplatform.cmake Outdated
Comment threadeng/native/build-commons.sh
Comment threadeng/native/configureplatform.cmake
Comment threadsrc/coreclr/pgosupport.cmake Outdated
Comment threadsrc/coreclr/src/ToolBox/SOS/DacTableGen/CMakeLists.txt
Comment threadsrc/libraries/Native/Unix/CMakeLists.txt Outdated
@omajid

omajid commented Jul 14, 2020

Copy link
Copy Markdown
Member

Thanks for this PR!

I tried building ad16a9797a2e899caec8a610f667789e0bec6524 using ./build.sh on RHEL 8. It doesn't seem to work. This is cmake version 3.11.4

 Detected Linux x86_64 -- Performing Test COMPILER_SUPPORTS_F_STACK_PROTECTOR_STRONG -- Performing Test COMPILER_SUPPORTS_F_STACK_PROTECTOR_STRONG - Success -- The ASM compiler identification is Clang -- Found assembler: /usr/bin/clang CMake Error at cli/exe.cmake:7 (cmake_policy): Policy "CMP0083" is not known to this version of CMake. Call Stack (most recent call first): cli/apphost/static/CMakeLists.txt:41 (include) -- Performing Test HAVE_DIRENT_D_TYPE -- Performing Test HAVE_DIRENT_D_TYPE - Success Looking for coreclr_static lib at location: '/home/dotnet/runtime/artifacts/bin/coreclr/Linux.x64.Debug//lib'. CMake Error at cli/exe.cmake:7 (cmake_policy): Policy "CMP0083" is not known to this version of CMake. Call Stack (most recent call first): cli/apphost/standalone/CMakeLists.txt:39 (include) CMake Error at cli/exe.cmake:7 (cmake_policy): Policy "CMP0083" is not known to this version of CMake. Call Stack (most recent call first): cli/dotnet/CMakeLists.txt:16 (include) CMake Error at cli/fxr/standalone/CMakeLists.txt:51 (target_link_libraries): Target "libhostfxr_static" of type OBJECT_LIBRARY may not be linked into another target. One may link only to INTERFACE, STATIC or SHARED libraries, or to executables with the ENABLE_EXPORTS property set. CMake Error at cli/test/mockhostfxr/CMakeLists.txt:4 (cmake_minimum_required): CMake 3.14.5 or higher is required. You are running version 3.11.4 -- Configuring incomplete, errors occurred!

Please let me know if there's anything I can do to help.

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

I've fixed the issues that I've found relatively simple (removing the unknown policy and removing the extra cmake_minimum_required), but I'm not sure how to fix the libhostfxr_static linking issue. If you know how to downgrade that, I'd appreciate the help.

@omajid

Copy link
Copy Markdown
Member

If you know how to downgrade that, I'd appreciate the help.

Not off the top of my head. I will dig around.

@janvorli

Copy link
Copy Markdown
Member

but I'm not sure how to fix the libhostfxr_static linking issue

The object libraries cannot be used as regular libraries to link to prior to cmake 3.14. All places need to be changed so that the objects from the object libraries are added to the respective targets like source files. E.g.:

add_library(... $<TARGET_OBJECTS:objlib> ...)

@jashook

Copy link
Copy Markdown
Contributor

I am having trouble building with 3.6.2. Seems that https://github.com/dotnet/runtime/blob/master/src/coreclr/src/vm/eventing/CMakeLists.txt#L11 requires cmake 3.8+.

How did you get around this @jkoritzinsky

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

I forgot about that. I need to roll that back to use the old find python module.

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

@safern can you take a look at the libraries build failures on OSX?

@janvorli

Copy link
Copy Markdown
Member

I've pushed a fix. The problem was that the VM_HEADERS_WKS_ARCH_ASM that contained the asmconstants.h was being added to VM_SOURCES_WKS_ARCH_ASM, which is a set of files that are to be compiled with assembler. It needed to be added to VM_SOURCES_WKS instead (which is done just to let the header appear in the visual studio solution explorer, cmake is clever enough to not to pass .h files to the C++ compiler).

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

@omajid can you do a test build against the RHEL 7 image you'll be building against for the distro build?

@omajid

Copy link
Copy Markdown
Member

@omajid can you do a test build against the RHEL 7 image you'll be building against for the distro build?

Of course. I have tested on RHEL 8 using this PR (it works!). I am currently testing on RHEL 8 end-to-end now (using source-build Preview 4 + a manual backport of this patch). If/when that works, RHEL 7 is next on my list.

@jkoritzinsky
jkoritzinsky marked this pull request as ready for review July 31, 2020 19:10
@omajid

omajid commented Jul 31, 2020

Copy link
Copy Markdown
Member

@omajid can you do a test build against the RHEL 7 image you'll be building against for the distro build?

A ./build.sh clr works with commit 265f684da4d370909c70399fd9be4bd089c607b2 after this trivial change:

diff --git a/src/installer/corehost/CMakeLists.txt b/src/installer/corehost/CMakeLists.txt
index 178d8ab..46d1c5e 100644
--- a/src/installer/corehost/CMakeLists.txt+++ b/src/installer/corehost/CMakeLists.txt@@ -1,4 +1,4 @@-cmake_minimum_required(VERSION 3.6.3)+cmake_minimum_required(VERSION 3.6.2)
project(corehost)
diff --git a/src/libraries/Native/Unix/CMakeLists.txt b/src/libraries/Native/Unix/CMakeLists.txt
index dee9e51..3168c7e 100644
--- a/src/libraries/Native/Unix/CMakeLists.txt+++ b/src/libraries/Native/Unix/CMakeLists.txt@@ -1,4 +1,4 @@-cmake_minimum_required(VERSION 3.6.3)+cmake_minimum_required(VERSION 3.6.2)
if(CLR_CMAKE_TARGET_IOS OR CLR_CMAKE_TARGET_TVOS) # CMake 3.14.5 contains bug fixes for iOS cmake_minimum_required(VERSION 3.14.5) diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt
index c75e5db..77fcc16 100644
--- a/src/tests/CMakeLists.txt+++ b/src/tests/CMakeLists.txt@@ -1,4 +1,4 @@-cmake_minimum_required(VERSION 3.6.3)+cmake_minimum_required(VERSION 3.6.2)
cmake_policy(SET CMP0042 NEW)
project(Tests)

Edit: I am still working on backporting this to preview 4 so I can test end-to-end with source-build (on RHEL 7 and RHEL 8).

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

I've applied your patch. Marking this PR as ready for review/non-work in progress

@jkoritzinskyjkoritzinsky changed the title [WIP] Minimum CMake downgrade for LinuxMinimum CMake downgrade for LinuxJul 31, 2020

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

The non-coreclr specific changes look good to me (can't vouch for the coreclr changes).


add_dependencies(bcltype eventing_headers)
add_dependencies(bcltype_obj eventing_headers)
add_library(bcltype INTERFACE)

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.

An idea for a future cleanup: This add_library / target_sources pair pattern is used at 24 places. It may be nice to clean this up in a follow up change by creating a cmake function for this pattern. Or even encapsulate the add_library_clr in that function, getting something along these lines:

add_intermediate_library_clr(bcltype${BCLTYPE_SOURCES})
add_intermediate_library_dependencies(bcltypeeventing_headers)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Yes, we should clean this up in the future by making some additional functions.

../../../hostfxr_resolver.h
)

list(APPEND SOURCES $<TARGET_OBJECTS:libhostfxr_static> $<TARGET_OBJECTS:libhostpolicy_static>)

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 wonder why was this change needed. Linking to the static libraries should work fine. The only case when we need to use object libraries is when a static library is built as a combination of other libraries, but it is not the case here.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

The libhostfxr_static and libhostpolicy_static targets are object libraries. The corehost CMake infra could really use some updates and cleanup to be more straightforward. I'd like to do that in a future PR.

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.

Hmm, interesting. I can see that they were changed to object ones few months ago and I am not sure why.

I agree that the corehost cmakefiles are very difficult to mentally parse. They looks as if msbuild style of build programming was used here. Instead of using functions for doing common stuff, ambient cmake variables are being set and then common helper cmake files included. I'd love to see it transformed to a natural cmake way at some point.

Comment threadsrc/libraries/Native/Unix/System.Globalization.Native/CMakeLists.txt Outdated
@jeffschwMSFT

Copy link
Copy Markdown
Member

cc @mmitche

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

@janvorli any more comments?

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

LGTM, thank you!

@janvorli

Copy link
Copy Markdown
Member

@jkoritzinsky no, I have thought I've already approved it, but I can see I haven't. So I've just done that.

@jkoritzinsky
jkoritzinsky merged commit ece10ad into dotnet:masterAug 4, 2020
@jkoritzinsky
jkoritzinsky deleted the cmake-downgrade branch August 4, 2020 18:04
@jashook

Copy link
Copy Markdown
Contributor

Thank you @jkoritzinsky for driving this effort!

@jashook

Copy link
Copy Markdown
Contributor

@omajid which version of clang are we using on redhat 7 for source build? We noticed that by default centos 7 installs 3.4 which we do not support building with.

/cc @janvorli@jkoritzinsky

@omajid

omajid commented Aug 4, 2020

Copy link
Copy Markdown
Member

which version of clang are we using on redhat 7 for source build?

We have generally used llvm-toolset-7.0-cmake (CentOS version here), which is 3.6.2.

This is how we are building 3.1 with llvm-toolset-7.0: https://git.centos.org/rpms/rh-dotnet31-dotnet/blob/c7-dotnet/f/SPECS/dotnet.spec#_314. I don't have a 5.0 version yet, because I haven't been able to build source-build there.

@jashook

jashook commented Aug 4, 2020

Copy link
Copy Markdown
Contributor

Clean builds using the following:

OsCmakeClang/llvm
Centos 73.6.27
Centos 83.11.48

@mmitche

Copy link
Copy Markdown
Member

@jeffschwMSFT Was this supposed to be ported to p8?

@jeffschwMSFT

Copy link
Copy Markdown
Member

@mmitche yes, @jashook is working on the port.

@omajid

Copy link
Copy Markdown
Member

I did a port to preview 4, so I could build against older cmake versions using source-build. Source-build is currently at 5.0 Preview 4. Port is available here: https://github.com/omajid/runtime/tree/5.0-preview4-cmake-backport

jashook pushed a commit to jashook/runtime that referenced this pull request Aug 6, 2020
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
mmitche pushed a commit that referenced this pull request Aug 7, 2020
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
Co-authored-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
Jacksondr5 pushed a commit to Jacksondr5/runtime that referenced this pull request Aug 10, 2020
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
@ghostghost locked as resolved and limited conversation to collaborators Dec 8, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Requiring CMake versions that aren't in the default package repository

8 participants

@jkoritzinsky@omajid@janvorli@jashook@jeffschwMSFT@mmitche@akoeplinger@safern
, '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

Minimum CMake downgrade for Linux - #39044

Merged
jkoritzinsky merged 36 commits into
dotnet:masterfrom
jkoritzinsky:cmake-downgrade
Aug 4, 2020
Merged

Minimum CMake downgrade for Linux#39044
jkoritzinsky merged 36 commits into
dotnet:masterfrom
jkoritzinsky:cmake-downgrade

Conversation

@jkoritzinsky

Copy link
Copy Markdown
Member

Downgrade the minimum version of CMake to 3.6.2 for our Linux builds and change our CMake scripts appropriately:

Currently completed steps:

  • Provide our own implementation of add_compile_definitions since it is easily polyfillable
  • Move away from add_link_options since it is not easy to create our own implementation of that functions the same. Move back to setting linker options via the flag properties.
  • Manually enable PIE/PIC on Linux/Mac (this support was added in CMake 3.9)
  • Manually check for IPO support on Linux/Mac (this support was added in CMake 3.13)
  • Revert to the old CMake command line (this support was added in CMake 3.10)

So far I've only undone the changes that I made in dotnet/coreclr#26980 that I know are required. @janvorli can you help out with some of the other issues that we'll encounter when lowering the CMake version? I don't know all of the corner case behaviors that we've started to depend on in the last 10ish months.

Validation that we actually build on CMake 3.6.2 will come when we get a new Docker image has CMake 3.6.2 (and no newer) installed (@jashook is working on this).

Contributes to #38755

Depends on dotnet/arcade#5770

cc: @dleeapho@janvorli@jashook@omajid@jkotas@tmds@wfurt@RheaAyase

@ghost

ghost commented Jul 9, 2020

Copy link
Copy Markdown

Tagging subscribers to this area: @ViktorHofer
Notify danmosemsft if you want to be subscribed.

Comment threadeng/native/configurecompiler.cmake Outdated
Comment threadeng/native/configurecompiler.cmake Outdated
Comment threadeng/native/configurecompiler.cmake Outdated
Comment threadsrc/coreclr/src/dlls/mscoree/coreclr/CMakeLists.txt Outdated
Comment threadeng/native/configureplatform.cmake Outdated
Comment threadeng/native/build-commons.sh
Comment threadeng/native/configureplatform.cmake
Comment threadsrc/coreclr/pgosupport.cmake Outdated
Comment threadsrc/coreclr/src/ToolBox/SOS/DacTableGen/CMakeLists.txt
Comment threadsrc/libraries/Native/Unix/CMakeLists.txt Outdated
@omajid

omajid commented Jul 14, 2020

Copy link
Copy Markdown
Member

Thanks for this PR!

I tried building ad16a9797a2e899caec8a610f667789e0bec6524 using ./build.sh on RHEL 8. It doesn't seem to work. This is cmake version 3.11.4

 Detected Linux x86_64 -- Performing Test COMPILER_SUPPORTS_F_STACK_PROTECTOR_STRONG -- Performing Test COMPILER_SUPPORTS_F_STACK_PROTECTOR_STRONG - Success -- The ASM compiler identification is Clang -- Found assembler: /usr/bin/clang CMake Error at cli/exe.cmake:7 (cmake_policy): Policy "CMP0083" is not known to this version of CMake. Call Stack (most recent call first): cli/apphost/static/CMakeLists.txt:41 (include) -- Performing Test HAVE_DIRENT_D_TYPE -- Performing Test HAVE_DIRENT_D_TYPE - Success Looking for coreclr_static lib at location: '/home/dotnet/runtime/artifacts/bin/coreclr/Linux.x64.Debug//lib'. CMake Error at cli/exe.cmake:7 (cmake_policy): Policy "CMP0083" is not known to this version of CMake. Call Stack (most recent call first): cli/apphost/standalone/CMakeLists.txt:39 (include) CMake Error at cli/exe.cmake:7 (cmake_policy): Policy "CMP0083" is not known to this version of CMake. Call Stack (most recent call first): cli/dotnet/CMakeLists.txt:16 (include) CMake Error at cli/fxr/standalone/CMakeLists.txt:51 (target_link_libraries): Target "libhostfxr_static" of type OBJECT_LIBRARY may not be linked into another target. One may link only to INTERFACE, STATIC or SHARED libraries, or to executables with the ENABLE_EXPORTS property set. CMake Error at cli/test/mockhostfxr/CMakeLists.txt:4 (cmake_minimum_required): CMake 3.14.5 or higher is required. You are running version 3.11.4 -- Configuring incomplete, errors occurred!

Please let me know if there's anything I can do to help.

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

I've fixed the issues that I've found relatively simple (removing the unknown policy and removing the extra cmake_minimum_required), but I'm not sure how to fix the libhostfxr_static linking issue. If you know how to downgrade that, I'd appreciate the help.

@omajid

Copy link
Copy Markdown
Member

If you know how to downgrade that, I'd appreciate the help.

Not off the top of my head. I will dig around.

@janvorli

Copy link
Copy Markdown
Member

but I'm not sure how to fix the libhostfxr_static linking issue

The object libraries cannot be used as regular libraries to link to prior to cmake 3.14. All places need to be changed so that the objects from the object libraries are added to the respective targets like source files. E.g.:

add_library(... $<TARGET_OBJECTS:objlib> ...)

@jashook

Copy link
Copy Markdown
Contributor

I am having trouble building with 3.6.2. Seems that https://github.com/dotnet/runtime/blob/master/src/coreclr/src/vm/eventing/CMakeLists.txt#L11 requires cmake 3.8+.

How did you get around this @jkoritzinsky

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

I forgot about that. I need to roll that back to use the old find python module.

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

@safern can you take a look at the libraries build failures on OSX?

@janvorli

Copy link
Copy Markdown
Member

I've pushed a fix. The problem was that the VM_HEADERS_WKS_ARCH_ASM that contained the asmconstants.h was being added to VM_SOURCES_WKS_ARCH_ASM, which is a set of files that are to be compiled with assembler. It needed to be added to VM_SOURCES_WKS instead (which is done just to let the header appear in the visual studio solution explorer, cmake is clever enough to not to pass .h files to the C++ compiler).

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

@omajid can you do a test build against the RHEL 7 image you'll be building against for the distro build?

@omajid

Copy link
Copy Markdown
Member

@omajid can you do a test build against the RHEL 7 image you'll be building against for the distro build?

Of course. I have tested on RHEL 8 using this PR (it works!). I am currently testing on RHEL 8 end-to-end now (using source-build Preview 4 + a manual backport of this patch). If/when that works, RHEL 7 is next on my list.

@jkoritzinsky
jkoritzinsky marked this pull request as ready for review July 31, 2020 19:10
@omajid

omajid commented Jul 31, 2020

Copy link
Copy Markdown
Member

@omajid can you do a test build against the RHEL 7 image you'll be building against for the distro build?

A ./build.sh clr works with commit 265f684da4d370909c70399fd9be4bd089c607b2 after this trivial change:

diff --git a/src/installer/corehost/CMakeLists.txt b/src/installer/corehost/CMakeLists.txt
index 178d8ab..46d1c5e 100644
--- a/src/installer/corehost/CMakeLists.txt+++ b/src/installer/corehost/CMakeLists.txt@@ -1,4 +1,4 @@-cmake_minimum_required(VERSION 3.6.3)+cmake_minimum_required(VERSION 3.6.2)
project(corehost)
diff --git a/src/libraries/Native/Unix/CMakeLists.txt b/src/libraries/Native/Unix/CMakeLists.txt
index dee9e51..3168c7e 100644
--- a/src/libraries/Native/Unix/CMakeLists.txt+++ b/src/libraries/Native/Unix/CMakeLists.txt@@ -1,4 +1,4 @@-cmake_minimum_required(VERSION 3.6.3)+cmake_minimum_required(VERSION 3.6.2)
if(CLR_CMAKE_TARGET_IOS OR CLR_CMAKE_TARGET_TVOS) # CMake 3.14.5 contains bug fixes for iOS cmake_minimum_required(VERSION 3.14.5) diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt
index c75e5db..77fcc16 100644
--- a/src/tests/CMakeLists.txt+++ b/src/tests/CMakeLists.txt@@ -1,4 +1,4 @@-cmake_minimum_required(VERSION 3.6.3)+cmake_minimum_required(VERSION 3.6.2)
cmake_policy(SET CMP0042 NEW)
project(Tests)

Edit: I am still working on backporting this to preview 4 so I can test end-to-end with source-build (on RHEL 7 and RHEL 8).

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

I've applied your patch. Marking this PR as ready for review/non-work in progress

@jkoritzinskyjkoritzinsky changed the title [WIP] Minimum CMake downgrade for LinuxMinimum CMake downgrade for LinuxJul 31, 2020

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

The non-coreclr specific changes look good to me (can't vouch for the coreclr changes).


add_dependencies(bcltype eventing_headers)
add_dependencies(bcltype_obj eventing_headers)
add_library(bcltype INTERFACE)

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.

An idea for a future cleanup: This add_library / target_sources pair pattern is used at 24 places. It may be nice to clean this up in a follow up change by creating a cmake function for this pattern. Or even encapsulate the add_library_clr in that function, getting something along these lines:

add_intermediate_library_clr(bcltype${BCLTYPE_SOURCES})
add_intermediate_library_dependencies(bcltypeeventing_headers)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Yes, we should clean this up in the future by making some additional functions.

../../../hostfxr_resolver.h
)

list(APPEND SOURCES $<TARGET_OBJECTS:libhostfxr_static> $<TARGET_OBJECTS:libhostpolicy_static>)

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 wonder why was this change needed. Linking to the static libraries should work fine. The only case when we need to use object libraries is when a static library is built as a combination of other libraries, but it is not the case here.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

The libhostfxr_static and libhostpolicy_static targets are object libraries. The corehost CMake infra could really use some updates and cleanup to be more straightforward. I'd like to do that in a future PR.

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.

Hmm, interesting. I can see that they were changed to object ones few months ago and I am not sure why.

I agree that the corehost cmakefiles are very difficult to mentally parse. They looks as if msbuild style of build programming was used here. Instead of using functions for doing common stuff, ambient cmake variables are being set and then common helper cmake files included. I'd love to see it transformed to a natural cmake way at some point.

Comment threadsrc/libraries/Native/Unix/System.Globalization.Native/CMakeLists.txt Outdated
@jeffschwMSFT

Copy link
Copy Markdown
Member

cc @mmitche

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

@janvorli any more comments?

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

LGTM, thank you!

@janvorli

Copy link
Copy Markdown
Member

@jkoritzinsky no, I have thought I've already approved it, but I can see I haven't. So I've just done that.

@jkoritzinsky
jkoritzinsky merged commit ece10ad into dotnet:masterAug 4, 2020
@jkoritzinsky
jkoritzinsky deleted the cmake-downgrade branch August 4, 2020 18:04
@jashook

Copy link
Copy Markdown
Contributor

Thank you @jkoritzinsky for driving this effort!

@jashook

Copy link
Copy Markdown
Contributor

@omajid which version of clang are we using on redhat 7 for source build? We noticed that by default centos 7 installs 3.4 which we do not support building with.

/cc @janvorli@jkoritzinsky

@omajid

omajid commented Aug 4, 2020

Copy link
Copy Markdown
Member

which version of clang are we using on redhat 7 for source build?

We have generally used llvm-toolset-7.0-cmake (CentOS version here), which is 3.6.2.

This is how we are building 3.1 with llvm-toolset-7.0: https://git.centos.org/rpms/rh-dotnet31-dotnet/blob/c7-dotnet/f/SPECS/dotnet.spec#_314. I don't have a 5.0 version yet, because I haven't been able to build source-build there.

@jashook

jashook commented Aug 4, 2020

Copy link
Copy Markdown
Contributor

Clean builds using the following:

OsCmakeClang/llvm
Centos 73.6.27
Centos 83.11.48

@mmitche

Copy link
Copy Markdown
Member

@jeffschwMSFT Was this supposed to be ported to p8?

@jeffschwMSFT

Copy link
Copy Markdown
Member

@mmitche yes, @jashook is working on the port.

@omajid

Copy link
Copy Markdown
Member

I did a port to preview 4, so I could build against older cmake versions using source-build. Source-build is currently at 5.0 Preview 4. Port is available here: https://github.com/omajid/runtime/tree/5.0-preview4-cmake-backport

jashook pushed a commit to jashook/runtime that referenced this pull request Aug 6, 2020
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
mmitche pushed a commit that referenced this pull request Aug 7, 2020
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
Co-authored-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
Jacksondr5 pushed a commit to Jacksondr5/runtime that referenced this pull request Aug 10, 2020
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
@ghostghost locked as resolved and limited conversation to collaborators Dec 8, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Requiring CMake versions that aren't in the default package repository

8 participants

@jkoritzinsky@omajid@janvorli@jashook@jeffschwMSFT@mmitche@akoeplinger@safern
, '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

Minimum CMake downgrade for Linux - #39044

Merged
jkoritzinsky merged 36 commits into
dotnet:masterfrom
jkoritzinsky:cmake-downgrade
Aug 4, 2020
Merged

Minimum CMake downgrade for Linux#39044
jkoritzinsky merged 36 commits into
dotnet:masterfrom
jkoritzinsky:cmake-downgrade

Conversation

@jkoritzinsky

Copy link
Copy Markdown
Member

Downgrade the minimum version of CMake to 3.6.2 for our Linux builds and change our CMake scripts appropriately:

Currently completed steps:

  • Provide our own implementation of add_compile_definitions since it is easily polyfillable
  • Move away from add_link_options since it is not easy to create our own implementation of that functions the same. Move back to setting linker options via the flag properties.
  • Manually enable PIE/PIC on Linux/Mac (this support was added in CMake 3.9)
  • Manually check for IPO support on Linux/Mac (this support was added in CMake 3.13)
  • Revert to the old CMake command line (this support was added in CMake 3.10)

So far I've only undone the changes that I made in dotnet/coreclr#26980 that I know are required. @janvorli can you help out with some of the other issues that we'll encounter when lowering the CMake version? I don't know all of the corner case behaviors that we've started to depend on in the last 10ish months.

Validation that we actually build on CMake 3.6.2 will come when we get a new Docker image has CMake 3.6.2 (and no newer) installed (@jashook is working on this).

Contributes to #38755

Depends on dotnet/arcade#5770

cc: @dleeapho@janvorli@jashook@omajid@jkotas@tmds@wfurt@RheaAyase

@ghost

ghost commented Jul 9, 2020

Copy link
Copy Markdown

Tagging subscribers to this area: @ViktorHofer
Notify danmosemsft if you want to be subscribed.

Comment threadeng/native/configurecompiler.cmake Outdated
Comment threadeng/native/configurecompiler.cmake Outdated
Comment threadeng/native/configurecompiler.cmake Outdated
Comment threadsrc/coreclr/src/dlls/mscoree/coreclr/CMakeLists.txt Outdated
Comment threadeng/native/configureplatform.cmake Outdated
Comment threadeng/native/build-commons.sh
Comment threadeng/native/configureplatform.cmake
Comment threadsrc/coreclr/pgosupport.cmake Outdated
Comment threadsrc/coreclr/src/ToolBox/SOS/DacTableGen/CMakeLists.txt
Comment threadsrc/libraries/Native/Unix/CMakeLists.txt Outdated
@omajid

omajid commented Jul 14, 2020

Copy link
Copy Markdown
Member

Thanks for this PR!

I tried building ad16a9797a2e899caec8a610f667789e0bec6524 using ./build.sh on RHEL 8. It doesn't seem to work. This is cmake version 3.11.4

 Detected Linux x86_64 -- Performing Test COMPILER_SUPPORTS_F_STACK_PROTECTOR_STRONG -- Performing Test COMPILER_SUPPORTS_F_STACK_PROTECTOR_STRONG - Success -- The ASM compiler identification is Clang -- Found assembler: /usr/bin/clang CMake Error at cli/exe.cmake:7 (cmake_policy): Policy "CMP0083" is not known to this version of CMake. Call Stack (most recent call first): cli/apphost/static/CMakeLists.txt:41 (include) -- Performing Test HAVE_DIRENT_D_TYPE -- Performing Test HAVE_DIRENT_D_TYPE - Success Looking for coreclr_static lib at location: '/home/dotnet/runtime/artifacts/bin/coreclr/Linux.x64.Debug//lib'. CMake Error at cli/exe.cmake:7 (cmake_policy): Policy "CMP0083" is not known to this version of CMake. Call Stack (most recent call first): cli/apphost/standalone/CMakeLists.txt:39 (include) CMake Error at cli/exe.cmake:7 (cmake_policy): Policy "CMP0083" is not known to this version of CMake. Call Stack (most recent call first): cli/dotnet/CMakeLists.txt:16 (include) CMake Error at cli/fxr/standalone/CMakeLists.txt:51 (target_link_libraries): Target "libhostfxr_static" of type OBJECT_LIBRARY may not be linked into another target. One may link only to INTERFACE, STATIC or SHARED libraries, or to executables with the ENABLE_EXPORTS property set. CMake Error at cli/test/mockhostfxr/CMakeLists.txt:4 (cmake_minimum_required): CMake 3.14.5 or higher is required. You are running version 3.11.4 -- Configuring incomplete, errors occurred!

Please let me know if there's anything I can do to help.

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

I've fixed the issues that I've found relatively simple (removing the unknown policy and removing the extra cmake_minimum_required), but I'm not sure how to fix the libhostfxr_static linking issue. If you know how to downgrade that, I'd appreciate the help.

@omajid

Copy link
Copy Markdown
Member

If you know how to downgrade that, I'd appreciate the help.

Not off the top of my head. I will dig around.

@janvorli

Copy link
Copy Markdown
Member

but I'm not sure how to fix the libhostfxr_static linking issue

The object libraries cannot be used as regular libraries to link to prior to cmake 3.14. All places need to be changed so that the objects from the object libraries are added to the respective targets like source files. E.g.:

add_library(... $<TARGET_OBJECTS:objlib> ...)

@jashook

Copy link
Copy Markdown
Contributor

I am having trouble building with 3.6.2. Seems that https://github.com/dotnet/runtime/blob/master/src/coreclr/src/vm/eventing/CMakeLists.txt#L11 requires cmake 3.8+.

How did you get around this @jkoritzinsky

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

I forgot about that. I need to roll that back to use the old find python module.

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

@safern can you take a look at the libraries build failures on OSX?

@janvorli

Copy link
Copy Markdown
Member

I've pushed a fix. The problem was that the VM_HEADERS_WKS_ARCH_ASM that contained the asmconstants.h was being added to VM_SOURCES_WKS_ARCH_ASM, which is a set of files that are to be compiled with assembler. It needed to be added to VM_SOURCES_WKS instead (which is done just to let the header appear in the visual studio solution explorer, cmake is clever enough to not to pass .h files to the C++ compiler).

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

@omajid can you do a test build against the RHEL 7 image you'll be building against for the distro build?

@omajid

Copy link
Copy Markdown
Member

@omajid can you do a test build against the RHEL 7 image you'll be building against for the distro build?

Of course. I have tested on RHEL 8 using this PR (it works!). I am currently testing on RHEL 8 end-to-end now (using source-build Preview 4 + a manual backport of this patch). If/when that works, RHEL 7 is next on my list.

@jkoritzinsky
jkoritzinsky marked this pull request as ready for review July 31, 2020 19:10
@omajid

omajid commented Jul 31, 2020

Copy link
Copy Markdown
Member

@omajid can you do a test build against the RHEL 7 image you'll be building against for the distro build?

A ./build.sh clr works with commit 265f684da4d370909c70399fd9be4bd089c607b2 after this trivial change:

diff --git a/src/installer/corehost/CMakeLists.txt b/src/installer/corehost/CMakeLists.txt
index 178d8ab..46d1c5e 100644
--- a/src/installer/corehost/CMakeLists.txt+++ b/src/installer/corehost/CMakeLists.txt@@ -1,4 +1,4 @@-cmake_minimum_required(VERSION 3.6.3)+cmake_minimum_required(VERSION 3.6.2)
project(corehost)
diff --git a/src/libraries/Native/Unix/CMakeLists.txt b/src/libraries/Native/Unix/CMakeLists.txt
index dee9e51..3168c7e 100644
--- a/src/libraries/Native/Unix/CMakeLists.txt+++ b/src/libraries/Native/Unix/CMakeLists.txt@@ -1,4 +1,4 @@-cmake_minimum_required(VERSION 3.6.3)+cmake_minimum_required(VERSION 3.6.2)
if(CLR_CMAKE_TARGET_IOS OR CLR_CMAKE_TARGET_TVOS) # CMake 3.14.5 contains bug fixes for iOS cmake_minimum_required(VERSION 3.14.5) diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt
index c75e5db..77fcc16 100644
--- a/src/tests/CMakeLists.txt+++ b/src/tests/CMakeLists.txt@@ -1,4 +1,4 @@-cmake_minimum_required(VERSION 3.6.3)+cmake_minimum_required(VERSION 3.6.2)
cmake_policy(SET CMP0042 NEW)
project(Tests)

Edit: I am still working on backporting this to preview 4 so I can test end-to-end with source-build (on RHEL 7 and RHEL 8).

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

I've applied your patch. Marking this PR as ready for review/non-work in progress

@jkoritzinskyjkoritzinsky changed the title [WIP] Minimum CMake downgrade for LinuxMinimum CMake downgrade for LinuxJul 31, 2020

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

The non-coreclr specific changes look good to me (can't vouch for the coreclr changes).


add_dependencies(bcltype eventing_headers)
add_dependencies(bcltype_obj eventing_headers)
add_library(bcltype INTERFACE)

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.

An idea for a future cleanup: This add_library / target_sources pair pattern is used at 24 places. It may be nice to clean this up in a follow up change by creating a cmake function for this pattern. Or even encapsulate the add_library_clr in that function, getting something along these lines:

add_intermediate_library_clr(bcltype${BCLTYPE_SOURCES})
add_intermediate_library_dependencies(bcltypeeventing_headers)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Yes, we should clean this up in the future by making some additional functions.

../../../hostfxr_resolver.h
)

list(APPEND SOURCES $<TARGET_OBJECTS:libhostfxr_static> $<TARGET_OBJECTS:libhostpolicy_static>)

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 wonder why was this change needed. Linking to the static libraries should work fine. The only case when we need to use object libraries is when a static library is built as a combination of other libraries, but it is not the case here.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

The libhostfxr_static and libhostpolicy_static targets are object libraries. The corehost CMake infra could really use some updates and cleanup to be more straightforward. I'd like to do that in a future PR.

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.

Hmm, interesting. I can see that they were changed to object ones few months ago and I am not sure why.

I agree that the corehost cmakefiles are very difficult to mentally parse. They looks as if msbuild style of build programming was used here. Instead of using functions for doing common stuff, ambient cmake variables are being set and then common helper cmake files included. I'd love to see it transformed to a natural cmake way at some point.

Comment threadsrc/libraries/Native/Unix/System.Globalization.Native/CMakeLists.txt Outdated
@jeffschwMSFT

Copy link
Copy Markdown
Member

cc @mmitche

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

@janvorli any more comments?

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

LGTM, thank you!

@janvorli

Copy link
Copy Markdown
Member

@jkoritzinsky no, I have thought I've already approved it, but I can see I haven't. So I've just done that.

@jkoritzinsky
jkoritzinsky merged commit ece10ad into dotnet:masterAug 4, 2020
@jkoritzinsky
jkoritzinsky deleted the cmake-downgrade branch August 4, 2020 18:04
@jashook

Copy link
Copy Markdown
Contributor

Thank you @jkoritzinsky for driving this effort!

@jashook

Copy link
Copy Markdown
Contributor

@omajid which version of clang are we using on redhat 7 for source build? We noticed that by default centos 7 installs 3.4 which we do not support building with.

/cc @janvorli@jkoritzinsky

@omajid

omajid commented Aug 4, 2020

Copy link
Copy Markdown
Member

which version of clang are we using on redhat 7 for source build?

We have generally used llvm-toolset-7.0-cmake (CentOS version here), which is 3.6.2.

This is how we are building 3.1 with llvm-toolset-7.0: https://git.centos.org/rpms/rh-dotnet31-dotnet/blob/c7-dotnet/f/SPECS/dotnet.spec#_314. I don't have a 5.0 version yet, because I haven't been able to build source-build there.

@jashook

jashook commented Aug 4, 2020

Copy link
Copy Markdown
Contributor

Clean builds using the following:

OsCmakeClang/llvm
Centos 73.6.27
Centos 83.11.48

@mmitche

Copy link
Copy Markdown
Member

@jeffschwMSFT Was this supposed to be ported to p8?

@jeffschwMSFT

Copy link
Copy Markdown
Member

@mmitche yes, @jashook is working on the port.

@omajid

Copy link
Copy Markdown
Member

I did a port to preview 4, so I could build against older cmake versions using source-build. Source-build is currently at 5.0 Preview 4. Port is available here: https://github.com/omajid/runtime/tree/5.0-preview4-cmake-backport

jashook pushed a commit to jashook/runtime that referenced this pull request Aug 6, 2020
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
mmitche pushed a commit that referenced this pull request Aug 7, 2020
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
Co-authored-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
Jacksondr5 pushed a commit to Jacksondr5/runtime that referenced this pull request Aug 10, 2020
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
@ghostghost locked as resolved and limited conversation to collaborators Dec 8, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Requiring CMake versions that aren't in the default package repository

8 participants

@jkoritzinsky@omajid@janvorli@jashook@jeffschwMSFT@mmitche@akoeplinger@safern
, '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

Minimum CMake downgrade for Linux - #39044

Merged
jkoritzinsky merged 36 commits into
dotnet:masterfrom
jkoritzinsky:cmake-downgrade
Aug 4, 2020
Merged

Minimum CMake downgrade for Linux#39044
jkoritzinsky merged 36 commits into
dotnet:masterfrom
jkoritzinsky:cmake-downgrade

Conversation

@jkoritzinsky

Copy link
Copy Markdown
Member

Downgrade the minimum version of CMake to 3.6.2 for our Linux builds and change our CMake scripts appropriately:

Currently completed steps:

  • Provide our own implementation of add_compile_definitions since it is easily polyfillable
  • Move away from add_link_options since it is not easy to create our own implementation of that functions the same. Move back to setting linker options via the flag properties.
  • Manually enable PIE/PIC on Linux/Mac (this support was added in CMake 3.9)
  • Manually check for IPO support on Linux/Mac (this support was added in CMake 3.13)
  • Revert to the old CMake command line (this support was added in CMake 3.10)

So far I've only undone the changes that I made in dotnet/coreclr#26980 that I know are required. @janvorli can you help out with some of the other issues that we'll encounter when lowering the CMake version? I don't know all of the corner case behaviors that we've started to depend on in the last 10ish months.

Validation that we actually build on CMake 3.6.2 will come when we get a new Docker image has CMake 3.6.2 (and no newer) installed (@jashook is working on this).

Contributes to #38755

Depends on dotnet/arcade#5770

cc: @dleeapho@janvorli@jashook@omajid@jkotas@tmds@wfurt@RheaAyase

@ghost

ghost commented Jul 9, 2020

Copy link
Copy Markdown

Tagging subscribers to this area: @ViktorHofer
Notify danmosemsft if you want to be subscribed.

Comment threadeng/native/configurecompiler.cmake Outdated
Comment threadeng/native/configurecompiler.cmake Outdated
Comment threadeng/native/configurecompiler.cmake Outdated
Comment threadsrc/coreclr/src/dlls/mscoree/coreclr/CMakeLists.txt Outdated
Comment threadeng/native/configureplatform.cmake Outdated
Comment threadeng/native/build-commons.sh
Comment threadeng/native/configureplatform.cmake
Comment threadsrc/coreclr/pgosupport.cmake Outdated
Comment threadsrc/coreclr/src/ToolBox/SOS/DacTableGen/CMakeLists.txt
Comment threadsrc/libraries/Native/Unix/CMakeLists.txt Outdated
@omajid

omajid commented Jul 14, 2020

Copy link
Copy Markdown
Member

Thanks for this PR!

I tried building ad16a9797a2e899caec8a610f667789e0bec6524 using ./build.sh on RHEL 8. It doesn't seem to work. This is cmake version 3.11.4

 Detected Linux x86_64 -- Performing Test COMPILER_SUPPORTS_F_STACK_PROTECTOR_STRONG -- Performing Test COMPILER_SUPPORTS_F_STACK_PROTECTOR_STRONG - Success -- The ASM compiler identification is Clang -- Found assembler: /usr/bin/clang CMake Error at cli/exe.cmake:7 (cmake_policy): Policy "CMP0083" is not known to this version of CMake. Call Stack (most recent call first): cli/apphost/static/CMakeLists.txt:41 (include) -- Performing Test HAVE_DIRENT_D_TYPE -- Performing Test HAVE_DIRENT_D_TYPE - Success Looking for coreclr_static lib at location: '/home/dotnet/runtime/artifacts/bin/coreclr/Linux.x64.Debug//lib'. CMake Error at cli/exe.cmake:7 (cmake_policy): Policy "CMP0083" is not known to this version of CMake. Call Stack (most recent call first): cli/apphost/standalone/CMakeLists.txt:39 (include) CMake Error at cli/exe.cmake:7 (cmake_policy): Policy "CMP0083" is not known to this version of CMake. Call Stack (most recent call first): cli/dotnet/CMakeLists.txt:16 (include) CMake Error at cli/fxr/standalone/CMakeLists.txt:51 (target_link_libraries): Target "libhostfxr_static" of type OBJECT_LIBRARY may not be linked into another target. One may link only to INTERFACE, STATIC or SHARED libraries, or to executables with the ENABLE_EXPORTS property set. CMake Error at cli/test/mockhostfxr/CMakeLists.txt:4 (cmake_minimum_required): CMake 3.14.5 or higher is required. You are running version 3.11.4 -- Configuring incomplete, errors occurred!

Please let me know if there's anything I can do to help.

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

I've fixed the issues that I've found relatively simple (removing the unknown policy and removing the extra cmake_minimum_required), but I'm not sure how to fix the libhostfxr_static linking issue. If you know how to downgrade that, I'd appreciate the help.

@omajid

Copy link
Copy Markdown
Member

If you know how to downgrade that, I'd appreciate the help.

Not off the top of my head. I will dig around.

@janvorli

Copy link
Copy Markdown
Member

but I'm not sure how to fix the libhostfxr_static linking issue

The object libraries cannot be used as regular libraries to link to prior to cmake 3.14. All places need to be changed so that the objects from the object libraries are added to the respective targets like source files. E.g.:

add_library(... $<TARGET_OBJECTS:objlib> ...)

@jashook

Copy link
Copy Markdown
Contributor

I am having trouble building with 3.6.2. Seems that https://github.com/dotnet/runtime/blob/master/src/coreclr/src/vm/eventing/CMakeLists.txt#L11 requires cmake 3.8+.

How did you get around this @jkoritzinsky

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

I forgot about that. I need to roll that back to use the old find python module.

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

@safern can you take a look at the libraries build failures on OSX?

@janvorli

Copy link
Copy Markdown
Member

I've pushed a fix. The problem was that the VM_HEADERS_WKS_ARCH_ASM that contained the asmconstants.h was being added to VM_SOURCES_WKS_ARCH_ASM, which is a set of files that are to be compiled with assembler. It needed to be added to VM_SOURCES_WKS instead (which is done just to let the header appear in the visual studio solution explorer, cmake is clever enough to not to pass .h files to the C++ compiler).

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

@omajid can you do a test build against the RHEL 7 image you'll be building against for the distro build?

@omajid

Copy link
Copy Markdown
Member

@omajid can you do a test build against the RHEL 7 image you'll be building against for the distro build?

Of course. I have tested on RHEL 8 using this PR (it works!). I am currently testing on RHEL 8 end-to-end now (using source-build Preview 4 + a manual backport of this patch). If/when that works, RHEL 7 is next on my list.

@jkoritzinsky
jkoritzinsky marked this pull request as ready for review July 31, 2020 19:10
@omajid

omajid commented Jul 31, 2020

Copy link
Copy Markdown
Member

@omajid can you do a test build against the RHEL 7 image you'll be building against for the distro build?

A ./build.sh clr works with commit 265f684da4d370909c70399fd9be4bd089c607b2 after this trivial change:

diff --git a/src/installer/corehost/CMakeLists.txt b/src/installer/corehost/CMakeLists.txt
index 178d8ab..46d1c5e 100644
--- a/src/installer/corehost/CMakeLists.txt+++ b/src/installer/corehost/CMakeLists.txt@@ -1,4 +1,4 @@-cmake_minimum_required(VERSION 3.6.3)+cmake_minimum_required(VERSION 3.6.2)
project(corehost)
diff --git a/src/libraries/Native/Unix/CMakeLists.txt b/src/libraries/Native/Unix/CMakeLists.txt
index dee9e51..3168c7e 100644
--- a/src/libraries/Native/Unix/CMakeLists.txt+++ b/src/libraries/Native/Unix/CMakeLists.txt@@ -1,4 +1,4 @@-cmake_minimum_required(VERSION 3.6.3)+cmake_minimum_required(VERSION 3.6.2)
if(CLR_CMAKE_TARGET_IOS OR CLR_CMAKE_TARGET_TVOS) # CMake 3.14.5 contains bug fixes for iOS cmake_minimum_required(VERSION 3.14.5) diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt
index c75e5db..77fcc16 100644
--- a/src/tests/CMakeLists.txt+++ b/src/tests/CMakeLists.txt@@ -1,4 +1,4 @@-cmake_minimum_required(VERSION 3.6.3)+cmake_minimum_required(VERSION 3.6.2)
cmake_policy(SET CMP0042 NEW)
project(Tests)

Edit: I am still working on backporting this to preview 4 so I can test end-to-end with source-build (on RHEL 7 and RHEL 8).

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

I've applied your patch. Marking this PR as ready for review/non-work in progress

@jkoritzinskyjkoritzinsky changed the title [WIP] Minimum CMake downgrade for LinuxMinimum CMake downgrade for LinuxJul 31, 2020

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

The non-coreclr specific changes look good to me (can't vouch for the coreclr changes).


add_dependencies(bcltype eventing_headers)
add_dependencies(bcltype_obj eventing_headers)
add_library(bcltype INTERFACE)

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.

An idea for a future cleanup: This add_library / target_sources pair pattern is used at 24 places. It may be nice to clean this up in a follow up change by creating a cmake function for this pattern. Or even encapsulate the add_library_clr in that function, getting something along these lines:

add_intermediate_library_clr(bcltype${BCLTYPE_SOURCES})
add_intermediate_library_dependencies(bcltypeeventing_headers)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Yes, we should clean this up in the future by making some additional functions.

../../../hostfxr_resolver.h
)

list(APPEND SOURCES $<TARGET_OBJECTS:libhostfxr_static> $<TARGET_OBJECTS:libhostpolicy_static>)

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 wonder why was this change needed. Linking to the static libraries should work fine. The only case when we need to use object libraries is when a static library is built as a combination of other libraries, but it is not the case here.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

The libhostfxr_static and libhostpolicy_static targets are object libraries. The corehost CMake infra could really use some updates and cleanup to be more straightforward. I'd like to do that in a future PR.

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.

Hmm, interesting. I can see that they were changed to object ones few months ago and I am not sure why.

I agree that the corehost cmakefiles are very difficult to mentally parse. They looks as if msbuild style of build programming was used here. Instead of using functions for doing common stuff, ambient cmake variables are being set and then common helper cmake files included. I'd love to see it transformed to a natural cmake way at some point.

Comment threadsrc/libraries/Native/Unix/System.Globalization.Native/CMakeLists.txt Outdated
@jeffschwMSFT

Copy link
Copy Markdown
Member

cc @mmitche

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

@janvorli any more comments?

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

LGTM, thank you!

@janvorli

Copy link
Copy Markdown
Member

@jkoritzinsky no, I have thought I've already approved it, but I can see I haven't. So I've just done that.

@jkoritzinsky
jkoritzinsky merged commit ece10ad into dotnet:masterAug 4, 2020
@jkoritzinsky
jkoritzinsky deleted the cmake-downgrade branch August 4, 2020 18:04
@jashook

Copy link
Copy Markdown
Contributor

Thank you @jkoritzinsky for driving this effort!

@jashook

Copy link
Copy Markdown
Contributor

@omajid which version of clang are we using on redhat 7 for source build? We noticed that by default centos 7 installs 3.4 which we do not support building with.

/cc @janvorli@jkoritzinsky

@omajid

omajid commented Aug 4, 2020

Copy link
Copy Markdown
Member

which version of clang are we using on redhat 7 for source build?

We have generally used llvm-toolset-7.0-cmake (CentOS version here), which is 3.6.2.

This is how we are building 3.1 with llvm-toolset-7.0: https://git.centos.org/rpms/rh-dotnet31-dotnet/blob/c7-dotnet/f/SPECS/dotnet.spec#_314. I don't have a 5.0 version yet, because I haven't been able to build source-build there.

@jashook

jashook commented Aug 4, 2020

Copy link
Copy Markdown
Contributor

Clean builds using the following:

OsCmakeClang/llvm
Centos 73.6.27
Centos 83.11.48

@mmitche

Copy link
Copy Markdown
Member

@jeffschwMSFT Was this supposed to be ported to p8?

@jeffschwMSFT

Copy link
Copy Markdown
Member

@mmitche yes, @jashook is working on the port.

@omajid

Copy link
Copy Markdown
Member

I did a port to preview 4, so I could build against older cmake versions using source-build. Source-build is currently at 5.0 Preview 4. Port is available here: https://github.com/omajid/runtime/tree/5.0-preview4-cmake-backport

jashook pushed a commit to jashook/runtime that referenced this pull request Aug 6, 2020
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
mmitche pushed a commit that referenced this pull request Aug 7, 2020
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
Co-authored-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
Jacksondr5 pushed a commit to Jacksondr5/runtime that referenced this pull request Aug 10, 2020
Co-authored-by: Santiago Fernandez Madero <safern@microsoft.com>
Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
@ghostghost locked as resolved and limited conversation to collaborators Dec 8, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Requiring CMake versions that aren't in the default package repository

8 participants

@jkoritzinsky@omajid@janvorli@jashook@jeffschwMSFT@mmitche@akoeplinger@safern