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
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
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
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).
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>_notests_source_dirs and
<project name>_exclude_files should be set to initial values:
Client_source_dirs += src/Client
<project name>_ldflags should be specified as follows:
Client_ldflags += -L $(session)/bin -l TCPEngine.lib
Server_ldflags += -L $(session)/bin -l TCPEngine.lib
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:
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.