Most transforms have assumptions that they are processing children as part of a FuncOp currently, so migrating these to FunctionOpInterface is natural and does not change semantics. While some passes, upon inspection *could* operate on another container, I just uniformly changed them all to FunctionOpInterface for consistency and to avoid hidden gotchas.
I was somewhat surprised that on the CMake side none of this had a dependency on the Func dialect: I guess that was coming in transitively.
This is nearly an NFC, however, the change to InterfacePass means that the passes only work with PassManagers that have been explicitly nested properly (OperationPass has some legacy fallback paths for implicit nesting that do not exist in the new paths). I expect that this mainly impacts *-opt invocations, which must switch to a -pass-pipeline that is nested properly. However, it is possible that C++ code is also incorrect, in which case it will begin asserting and nesting must be done explicitly.