This section demonstrates the possibilities of makefiles customization on an advanced example. Similar to the previous example, this consists of two subprojects: Client and Server.

In addition, the project includes a server-stub subproject (ServerDummy) that implements the communication protocol exactly as in the server, but has a stub instead of functional behaviour.

All subprojects have maintenance unit tests.



The project directory tree is shown in the figure below:

In order to create makefiles as shown in the figure, commands should be run as described in the previous section:

$ me-create -conf
$ me-create -project
$ me-create -subproj src/Server
$ me-create -subproj src/Server/ServerDummy
$ me-create -subproj src/Client

These commands interactively ask which makefile template should be used. In all cases the console application template should be used, i.e. case # 1 should be chosen.

Next, it is necessary to specify a list of base project subprojects in the project makefile. Since ServerDummy is intended for debug stage only, it isn't included in the list of base subprojects:

base_subprojs_dirs := src/Client src/Server



Configuration of Client subprojects is concluded by inclusion of external source directory src/TCPEngine to the build:

Client_source_dirs += src/Client src/TCPEngine

In this way unit tests for included directories will be included into the test build automatically. If a file with a main() function exists among unit tests, then it should be excluded from the tests build:

Client_exclude_files += src/TCPEngine/Tests/TestMain.cpp

Unit test libraries, such as CppUnit and WppUnit, are compatible with Make-Effect in this regard and will not break tests build.



Configuration of Server subprojects (similar to Client subprojects) is completed by inclusion of external source directory src/TCPEngine, but the directory should be included without unit tests support. To complete this part of the configuration the subproject configuration file should be modified as follows:

Server_notests_source_dirs += src/TCPEngine

The exact way in which external directories are included is left up to the developer.



The configuration of the ServerDummy subproject is also relies on the setup of external directories:

ServerDummy_source_dirs += src/Server/DummyServer src/Server
ServerDummy_notests_source_dirs += src/TCPEngine
ServerDummy_exclude_files += src/Server/Server.cpp src/Server/Operations.cpp

The tag _exclude_files prevents inclusion of unwanted files from external directories.



Shown below is the configuration of a session for debugging of the Client subproject, in the case where the subproject Server has not been implemented yet. In order to maintain project settings, a special debug session should be created:

$ me-create -debug Debug_client

Before performing a build it is necessary to check the parameter session in the .me-session file:


Subproject Server should be replaced by DummyServer within the debug session, as shown below:

session_subprojs_dirs = src/Server/ServerDummy
exclude_subproj_dirs = src/Server



In this section a release session will be configured in such a way that a release build process will not require Make-Effect to be installed. This is suitable when a software product is delivered with the source code.

A release session is created automatically upon project creation. However, if no release session exists it can be created by issuing a command from the root project directory as follows:

me-create -release <session name>

Similar to a debug session, the file Makefile.in will be created in the directory named with the session name.

In some cases, it is more appropriate to save a build session configuration file in the root project directory. Make-Effect allows the movement of a session configuration file as long as a specific naming convention is followed: in the project root directory these files have to be named similar to mk-<session name>.in:

$ mv Release/Makefile.in mk-Release.in

By default, a release build session uses partial compilation that relies on the output of the me-autodep utility from the Make-Effect package. In order to disable partial compilation it is necessary to change settings in the file mk-Release.in:

depend = no
default: clean build

If the release session name is not Release, then the default session name parameter should be adjusted in the project makefile appropriately. The value of the session parameter should be specified according to the name used.

If all the necessary steps have been performed, then the make command will build the project.



Make-Effect provides a template for the creation of tar.gz installation packages, that are extracted by the QNX utility command install -u.

In order to enable command make pack (make it able to create installation package) the following parameters in the project makefile should be specified: project - project name, version - project version, installation_dir - installation directory.

The packaging procedure should be implemented in the pack.sh file. For the current example the packaging procedure can be specified as follows:

pax -ws ,$session/bin,$installation_directory, -f $output_tar_file $session/bin

If the packaging procedure has been specified correctly then the following commands will be available: make pack and make install (installation of the project).



Converting TCPEngine to a static library will solve a problem with the unit test of the src/TCPEngine directory that causes it to only function with unit tests of the Client subproject only.

In order to create a static library subproject, it is necessary to run the following command from the root directory of the project:

$ me-create -subproj src/TCPEngine

and choose case #3 - static library template.

All changes in parameters <project name>_source_dirs, <project name>_notests_source_dirs and <project name>_exclude_files should be set to initial values:

file ./src/Client/Makefile.in :
Client_source_dirs += src/Client
Client_exclude_files +=

file ./src/Server/DummyServer/Makefile.in :
ServerDummy_notests_source_dirs +=

file ./src/Server/Makefile.in :
Server_notests_source_dirs +=

But parameters <project name>_ldflags should be specified as follows:

file ./src/Client/Makefile.in :
Client_ldflags += -L $(session)/bin -l TCPEngine.lib

file ./src/Server/DummyServer/Makefile.in :
Server_ldflags += -L $(session)/bin -l TCPEngine.lib

file ./src/Server/Makefile.in :
ServerDummy_ldflags += -L $(session)/bin -l TCPEngine.lib

In order to automatically rebuild subprojects when the library changes, the following strings should be added to the subproject makefiles of Client and Server:

file ./src/Client/Makefile.in :
$(Client_out_dir)/Client: $(session)/bin/TCPEngine.lib

file ./src/Server/Makefile.in :
$(Server_out_dir)/Server: $(session)/bin/TCPEngine.lib

The new subproject should be included in the list of base subprojects of the project makefile:

base_subprojs_dirs := TCPEngine Client Server

Since building is performed in the same order as projects are defined in the list, the library should be placed at the head of the list.