make install does whatever the
Makefile author wants it to do. Typically, by this point, it is too late to change the install directory, as it is often known earlier, during the build, so help files and configuration files can be referenced with the correct pathnames.
Many projects use the GNU Autotools to try to improve their portability among hardware and operating system differences. (Different Unix variants use slightly different headers for declarations of functions that are slightly off the usual path -- except most programs need one or another of the ones declared in different locations.)
When a project does use the Autotools, the normal mantra to install it is:
./configure typically allows you to use a command line option like
--prefix /opt/apache or something similar to specify a different pathname.
/usr/local/ is a common default
prefix. It is far easier for locally built software to live in one place and distribution-provided software to live in the "main directories":
/bin/, and so on. (Packagers are very careful to never touch files in
/usr/local/ -- they know it is exclusively for system administrators.)
./configure --prefix /path/to/new/prefix will set a variable in the
Makefile that is available when compiling the program, modifying the manual pages so they point to the correct locations for files, modifying configuration files, etc. So
make will build the software specifically for the install location you want and
make install will install it into that location.
Most programs can run even without the final
make install step -- just
./program_name will often start them up. This is definitely a per-project thing -- some, like
qmail, etc., are made up of many different moving pieces and rely on them all working together. Others, like
su might be self-contained enough to execute fine from the directory they were built in. (This is not often useful -- but sometimes very useful.)
However, not all projects use the Autotools -- they are huge, complicated, and miserable to maintain. Hand-written
Makefiles are much simpler to write, and I personally think just distributing a simple
Makefile with configuration variables available is a lot easier on developers and users both. (Though the
./configure ; make ; make install mantra is really easy on users when it works.)
make installsteps from a programmers point of view.