8.2 Detecting a Project

Project detection happens with the list of ede-project-autoload instances stored in ede-project-class-files. The full project detection scheme works like this:

Step 1:

find-file-hook calls ede-turn-on-hook on BUFFER.

Step 2:

ede-turn-on-hook turns on ede-minor-mode

Step 3:

ede-minor-mode looks to see if BUFFER is associated with any open projects. If not, it calls ede-load-project-file to find a project associated with the current directory BUFFER is in.

Step 4:

ede-minor-mode associates the found project with the current buffer with a series of variables, such as ede-object, and ede-object-project and ede-object-root-project.

Once a buffer is associated, EDE minor mode commands will operate on that buffer.

The function ede-load-project-file is at the heart of detecting projects, and it works by looping over all the known project autoload types in ede-project-autoload using the utility ede-directory-project-p.

The function ede-directory-project-p will call ede-dir-to-projectfile on every ede-project-autoload until one of them returns true. The method ede-dir-to-projectfile in turn gets the :proj-file slot from the autoload. If it is a string (i.e., a project file name), it checks to see if that exists in BUFFER’s directory. If it is a function, then it calls that function and expects it to return a file name or nil. If the file exists, then this directory is assumed to be part of a project, and ede-directory-project-p returns the instance of ede-project-autoload that matched.

If the current directory contains the file .ede-ignore then that directory is automatically assumed to contain no projects, even if there is a matching pattern. Use this type of file in a directory that may contain many other sub projects, but still has a Makefile of some sort.

If the current directory is a project, then EDE scans upwards till it finds the top of the project. It does this by calling ede-toplevel-project. If this hasn’t already been discovered, the directories as scanned upward one at a time until a directory with no project is found. The last found project becomes the project root. If the found instance of ede-project-autoload has a valid proj-root slot value, then that function is called instead of scanning the project by hand. Some project types have a short-cut for determining the root of a project, so this comes in handy.

Getting back to ede-load-project-file, this now has an instance of ede-project-autoload. It uses the load-type slot to both autoload in the project type, and to create a new instance of the project type found for the root of the project. That project is added to the global list of all projects. All subprojects are then created and assembled into the project data structures.