I am pretty much certain that I now understand what happened to cause my asdf problem. At the end of this I have a few final questions that maybe somebody can answer definitively for me. If you are curious about the details, read on.
Here are some background facts:
- What I was seeing is a failure of asdf to locate a new system in my ~/common-lisp directory as it should.
- This problem only occurred in the CCL IDE, not when running CCL from the command line.
- There is an asdf internal variable called asdf/source-registry:*source-registry* which contains a list of all the .asd files it can find as a result of searching all of the directories where asdf thinks they might be. In my case that was my ~/common-lisp/ directory. In asdf itself.
- That variable is only initialized when a file is searched for. That might happen either via an explicit asdf call (e.g.(asdf::find-system <something>) or indirectly via a quickload call such as (ql::quickload <something>).
- Just loading asdf will not cause the *source-registry* to be initialized
- However, it turns out that just loading quickload WILL cause the asdf *source-registry* variable to be initialized.
- Once that variable is initialized, asdf will never try to initialize it again since that would waste a lot of time looking for .asd files all over again.
So knowing all that, here is what happened.
- I installed and rebuilt the latest CCL a couple of months ago.
- As part of building the CCL IDE after that, both asdf and quickload were loaded into the CCL IDE image that was created (one question later is related to this)
- As a normal result of loading quickload, the asdf/source-registry:*source-registry* variable was initialized (another question below is related to this)
- When the CCL IDE image was built it included the value of that asdf *source-registry* variable, so that when the IDE was launched that variable was initialized.
- Only recently did I add additional asdf-defined systems to the ~/common-lisp/ directory. But of course when asdf tried to find them it couldn’t because the *source-registry* variable was effectively initialized when the IDE was built (long before I added my new systems).
- I can explicitly call an asdf function to reinitialize that variable and then everything is found normally.
One question I have left is whether loading asdf and quickload into the CCL IDE is something that is done explicitly by the process that is now used to build the IDE or whether there is some option to not include them. Was there something that I should have done or not done when building the IDE that would have prevented this problem?
Had there been nothing in my ~/common-lisp directory to find, then the value of that asdf variable would have been nil and that is enough to make asdf reinitialize it. But assuring that each time I build seems like a pain.
My next question is why loading quicklisp causes it to initialize that variable? Conceivably it needs to search for .asd files that might be in its load environment and uses asdf to do so.
Next I’m wondering whether there is some change to asdf code that can be made to reinitialize the *source-registry* every time the IDE is re-started.
As another possibility, perhaps the CCL code for dumping the IDE can be modified in some way. In a private email Robert suggested:
"If you have time to look, take a peek at asdf/uiop/image.lisp and asdf/bundle.lisp which should have code Fare wrote about dumping an image in a way that it will restart happily.”
That seems like something that CCL maintainers might want to consider.
While waiting for fixes or other suggestions, I will put an explicit call to reinitialize the *source-registry* in my ccl-ide-init.lisp file:
(asdf/source-registry::initialize-source-registry)
If anyone else has an environment similar to mine and rebuilds their own version of the IDE, I would suggest they do the same.