Closed 2bndy5 closed 3 weeks ago
I think there's a regression about consecutive builds using cpp.apigen. I now get warnings about documents not included in any toctree upon rebuilding docs (without flushing old build artifacts):
C:\dev\sphinx-immaterial\docs\cpp_apigen_generated/cpp_apigen_demo.Array-ce8a1651-06f1923e.rst: WARNING: document isn't included in any toctree
C:\dev\sphinx-immaterial\docs\cpp_apigen_generated/cpp_apigen_demo.DataOrder-62e6a0a2-a428c0b6.rst: WARNING: document isn't included in any toctree
C:\dev\sphinx-immaterial\docs\cpp_apigen_generated/cpp_apigen_demo.IndexInterval-562a996b-19da0973.rst: WARNING: document isn't included in any toctree
...
C:\dev\sphinx-immaterial\sphinx_immaterial.apidoc.cpp.apigen:1: WARNING: toctree contains reference to nonexisting document 'cpp_apigen_generated/cpp_apigen_demo.IndexInterval-562a996b'
C:\dev\sphinx-immaterial\sphinx_immaterial.apidoc.cpp.apigen:1: WARNING: toctree contains reference to nonexisting document 'cpp_apigen_generated/cpp_apigen_demo.DataOrder-62e6a0a2'
C:\dev\sphinx-immaterial\sphinx_immaterial.apidoc.cpp.apigen:1: WARNING: toctree contains reference to nonexisting document 'cpp_apigen_generated/cpp_apigen_demo.Array-ce8a1651'
I think there's an undesired behavior specific to Windows (or any Case sensitive file system) in which a consecutive build fails after a certain number of rebuilds. It seems that a hash is added to the file name each time a build is invoked, and at some point the path to the generated file becomes too long. This happens with both python apigen and cpp apigen.
We may need to investigate exactly how the previous state is reloaded when sphinx does an incremental build.
cpp apigen stuffs some extra attributes into app.env
, and then define a _builder_inited
that modifies it in place to add the hashes.
I think we may similarly add attributes to app.env
elsewhere in this theme, and I think in all cases we don't want that data to be persisted to the next build.
Therefore we may need to change where it is stored --- possibly on the app
object itself would be better.
I think I found the problem.
https://github.com/jbms/sphinx-immaterial/blob/61c3ef0fc8361f1e7e79c5953abd4d23ca52d1b7/sphinx_immaterial/apidoc/cpp/apigen.py#L897-L902
entities["page_name"]
gets appended another hash every time _builder_inited()
runs.
I think the fix is to consolidate the for loop in above link with the for loop located just afterward in the locally-scoped function
https://github.com/jbms/sphinx-immaterial/blob/61c3ef0fc8361f1e7e79c5953abd4d23ca52d1b7/sphinx_immaterial/apidoc/cpp/apigen.py#L903-L915 My idea is to calc the hash (which based on os.path.basename(entities["pagename"])
) without caching the hash-appended file name. Honestly though, I think hashing the bytes written to the file might be a bit more of a cache buster.
Well I was able to use the file content (in bytes) as the hash seed, and it did prevent writing new files when the content hasn't changed (for both python and cpp apigen). See https://github.com/jbms/sphinx-immaterial/pull/346/commits/f97200f58ce513498d7d029407245614c85abad1
Now, I'm noticing that the site index is generated for 99 pages on a fresh doc build, but the site index is only generated for 63 files on a subsequent build.
Well I was able to use the file content (in bytes) as the hash seed, and it did prevent writing new files when the content hasn't changed (for both python and cpp apigen). See f97200f
Now, I'm noticing that the site index is generated for 99 pages on a fresh doc build, but the site index is only generated for 63 files on a subsequent build.
We don't want to use the file content because in fact the purpose is not cache busting but the opposite --- to ensure a stable URL even as the content changes when the documentation updates. The hash is to deal with case insensitive filesystems where we may have two document names that differ only in casing.
I think there may have been a change in how incremental rebuild state is saved. We want to make sure that this information is not saved across rebuilds, so I think we should move it out of app.env
if app.env
is getting pickled.
We want to make sure that this information is not saved across rebuilds, so I think we should move it out of app.env if app.env is getting pickled.
I did this, but now I think we've hit another problem.
> checking consistency... C:\dev\sphinx-immaterial\docs\cpp_apigen_generated/cpp_apigen_demo.Array-ce8a1651.rst: WARNING: document isn't included in any toctree C:\dev\sphinx-immaterial\docs\cpp_apigen_generated/cpp_apigen_demo.Array.Array-convert-338c580d.rst: WARNING: document isn't included in any toctree C:\dev\sphinx-immaterial\docs\cpp_apigen_generated/cpp_apigen_demo.Array.Array-data-shape-ba8897f2.rst: WARNING: document isn't included in any toctree C:\dev\sphinx-immaterial\docs\cpp_apigen_generated/cpp_apigen_demo.Array.data-b9e4202e.rst: WARNING: document isn't included in any toctree C:\dev\sphinx-immaterial\docs\cpp_apigen_generated/cpp_apigen_demo.Array.operator-subscript-257a2cc4.rst: WARNING: document isn't included in any toctree C:\dev\sphinx-immaterial\docs\cpp_apigen_generated/cpp_apigen_demo.Array.order-4d0a1cd0.rst: WARNING: document isn't included in any toctree C:\dev\sphinx-immaterial\docs\cpp_apigen_generated/cpp_apigen_demo.Array.shape-c9344e8b.rst: WARNING: document isn't included in any toctree C:\dev\sphinx-immaterial\docs\cpp_apigen_generated/cpp_apigen_demo.DataOrder-62e6a0a2.rst: WARNING: document isn't included in any toctree C:\dev\sphinx-immaterial\docs\cpp_apigen_generated/cpp_apigen_demo.IndexInterval-562a996b.rst: WARNING: document isn't included in any toctree C:\dev\sphinx-immaterial\docs\cpp_apigen_generated/cpp_apigen_demo.IndexInterval.IndexInterval-46626a6e.rst: WARNING: document isn't included in any toctree C:\dev\sphinx-immaterial\docs\cpp_apigen_generated/cpp_apigen_demo.IndexInterval.lower-024c21ab.rst: WARNING: document isn't included in any toctree C:\dev\sphinx-immaterial\docs\cpp_apigen_generated/cpp_apigen_demo.IndexInterval.operator-shift_left-b727dea4.rst: WARNING: document isn't included in any toctree C:\dev\sphinx-immaterial\docs\cpp_apigen_generated/cpp_apigen_demo.IndexInterval.upper-aa98da78.rst: WARNING: document isn't included in any toctree C:\dev\sphinx-immaterial\docs\cpp_apigen_generated/cpp_apigen_demo.Union-a8b425ad.rst: WARNING: document isn't included in any toctree C:\dev\sphinx-immaterial\docs\cpp_apigen_generated/cpp_apigen_demo.operator-shift_left-6191f4da.rst: WARNING: document isn't included in any toctree done
> C:\dev\sphinx-immaterial\sphinx_immaterial.apidoc.cpp.apigen:1: WARNING: toctree contains reference to nonexisting document 'cpp_apigen_generated/cpp_apigen_demo.IndexInterval' C:\dev\sphinx-immaterial\sphinx_immaterial.apidoc.cpp.apigen:1: WARNING: toctree contains reference to nonexisting document 'cpp_apigen_generated/cpp_apigen_demo.DataOrder' C:\dev\sphinx-immaterial\sphinx_immaterial.apidoc.cpp.apigen:1: WARNING: toctree contains reference to nonexisting document 'cpp_apigen_generated/cpp_apigen_demo.Array' C:\dev\sphinx-immaterial\cpp_apigen_demo\index_interval.h:11: WARNING: unknown document: '/cpp_apigen_generated/cpp_apigen_demo.IndexInterval' C:\dev\sphinx-immaterial\cpp_apigen_demo\index_interval.h:11: WARNING: unknown document: '/cpp_apigen_generated/cpp_apigen_demo.IndexInterval' C:\dev\sphinx-immaterial\cpp_apigen_demo\array.h:11: WARNING: unknown document: '/cpp_apigen_generated/cpp_apigen_demo.DataOrder' C:\dev\sphinx-immaterial\cpp_apigen_demo\array.h:29: WARNING: unknown document: '/cpp_apigen_generated/cpp_apigen_demo.Array' C:\dev\sphinx-immaterial\cpp_apigen_demo\array.h:36: WARNING: unknown document: '/cpp_apigen_generated/cpp_apigen_demo.Array.Array-data-shape' C:\dev\sphinx-immaterial\cpp_apigen_demo\array.h:44: WARNING: unknown document: '/cpp_apigen_generated/cpp_apigen_demo.Array.Array-convert' C:\dev\sphinx-immaterial\cpp_apigen_demo\array.h:47: WARNING: unknown document: '/cpp_apigen_generated/cpp_apigen_demo.Array.data' C:\dev\sphinx-immaterial\cpp_apigen_demo\array.h:50: WARNING: unknown document: '/cpp_apigen_generated/cpp_apigen_demo.Array.shape' C:\dev\sphinx-immaterial\cpp_apigen_demo\array.h:53: WARNING: unknown document: '/cpp_apigen_generated/cpp_apigen_demo.Array.order' C:\dev\sphinx-immaterial\cpp_apigen_demo\array.h:59: WARNING: unknown document: '/cpp_apigen_generated/cpp_apigen_demo.Array.operator-subscript' C:\dev\sphinx-immaterial\cpp_apigen_demo\array.h:59: WARNING: unknown document: '/cpp_apigen_generated/cpp_apigen_demo.Array.operator-subscript' C:\dev\sphinx-immaterial\cpp_apigen_demo\array.h:21: WARNING: unknown document: '/cpp_apigen_generated/cpp_apigen_demo.operator-shift_left' C:\dev\sphinx-immaterial\cpp_apigen_demo\index_interval.h:17: WARNING: unknown document: '/cpp_apigen_generated/cpp_apigen_demo.IndexInterval.IndexInterval' C:\dev\sphinx-immaterial\cpp_apigen_demo\index_interval.h:20: WARNING: unknown document: '/cpp_apigen_generated/cpp_apigen_demo.IndexInterval.operator-shift_left' C:\dev\sphinx-immaterial\cpp_apigen_demo\index_interval.h:25: WARNING: unknown document: '/cpp_apigen_generated/cpp_apigen_demo.IndexInterval.lower' C:\dev\sphinx-immaterial\cpp_apigen_demo\index_interval.h:28: WARNING: unknown document: '/cpp_apigen_generated/cpp_apigen_demo.IndexInterval.upper' C:\dev\sphinx-immaterial\cpp_apigen_demo\index_interval.h:34: WARNING: unknown document: '/cpp_apigen_generated/cpp_apigen_demo.Union'
I'm not sure why, but libclang (v18.1.1) on macos is failing to parse the cpp.apigen demo sources. It seems related to sighingnow/libclang#71
I don't have a mac I could use to test/debug this one.
I'm not sure why, but libclang (v18.1.1) on macos is failing to parse the cpp.apigen demo sources. It seems related to sighingnow/libclang#71
I don't have a mac I could use to test/debug this one.
Perhaps we can just add a libclang<17 requirement as a workaround until this gets fixed upstream?
resolves #345