-
Notifications
You must be signed in to change notification settings - Fork 48
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix failures in cpm_generate_pins-nested tests #724
Fix failures in cpm_generate_pins-nested tests #724
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
An amazing write-up on this
As for Issue 2. I think it is safe to map the |
Problem 3: All of our tests of pinning are incorrectly checking for rmm with the wrong case:
I think the solution is that the test checks should use |
Yes I was considering this as well. CPM sets the |
I think that this is orthogonal to |
Lets use it. We already rely on it inside the pinning logic |
That makes sense 👍 |
…g with versions.json
I uncovered one more issue in #725, but I'm not going to try and fix that here. |
Description
Recent nightly failures of the
cpm_generate_pins-nested
test are unexpected because neither rapids-cmake, CPM, nor CMake have changed recently. The error shows that the list of projects to verify is being completely filtered out because none of them have a<project>_SOURCE_DIR
variable set. This led me down a rabbit hole of finding a number of different issues in both rapids-cmake itself and in tests. I'll detail them one by one below.Problem 1: Our logic for when to download packages for which rapids-cmake provides specialized
rapids_cpm*
commands is wrongThe first piece of evidence here is the difference between recent builds of our CI images. The most recent builds of miniforge-cuda have spdlog in the base environment, while previous builds do not. That should not affect our tests because we set
CPM_DOWNLOAD_ALL
when populating the CMake cache, but it turns out that #348 introduced a bug where thealways_download
variable gets defaulted to OFF and because of how it propagates toCPM_DOWNLOAD_ALL
in parent scope we wind up withCPM_DOWNLOAD_ALL
always being false. As a result, we have actually been ignoringCPM_DOWNLOAD_ALL
for any packages for whichrapids_cpm_package_details
is called (the more specificCPM_DOWNLOAD_<project>
should still have been working since that takes precedence).Solution: We unset the
always_download
variable initially instead of setting it to off so that the check is handled correctly.Problem 2: Even with the above logic fixed, the actual test will use the spdlog from the environment
The above fix ensures that when we populate the CPM source cache in our tests we download spdlog instead of finding it in the environment. However, when tests are subsequently run they will still prefer the package unless
CPM_DOWNLOAD_ALL
(orCPM_DOWNLOAD_<package>
) is set because of how CPM prioritizes.Solution: To resolve this, for all rapids-cpm tests we are now setting
CPM_DOWNLOAD_<pkg>
for all of the packages that have been added to our CPM cache. This fix is safe since it effectively just avoids finding local copies of the built package; the source will always come from the cache by design.This change is sufficient for tests to pass, but on closer inspection we see that only spdlog is verified by the verification script and not rmm or fmt. That's because of the next problems.
Problem 3: All of our tests of pinning are incorrectly checking for rmm with the wrong case
The
project
call in rmm uses the uppercase name "RMM", but the entry in rapids-cmake's versions.json uses the lowercase name. As a result, our current logic for verifying generate pins can never test rmm because the project is initially filtered based on<project>_SOURCE_DIR
being defined, which will use the uppercase name from theproject
call, but when actually verifying we userapids_cpm_package_details
to get the versions.json data using the same string, which will now have the wrong case if we passed the uppercase version originally.Problem 4: All of our tests of pinning are incorrectly checking for fmt with the wrong case
This is the same problem as the above. fmt uses
project(FMT)
.Solution for 3 and 4: We now use the
CPM_PACKAGE_<project>_SOURCE_DIR
variables instead of the<project>_SOURCE_DIR
variables. The former are guaranteed to be using the export names of the package and will therefore always be case-consistent with the values in versions.json.Other changes in this PR
CPM_DOWNLOAD_GTest
explicitly inside the test.The change to
verify_generated_pins.cmake
ensures that all of the above changes are actually having the desired effect, since now rather than silently passing when only a subset of projects requesting verification are downloaded we will error. All projects must be pulled correctly from the CPM cache during the test (which implicitly checks all four problems above) in order for tests to pass.Checklist
cmake-format.json
is up to date with these changes.include_guard(GLOBAL)
)