As explained in the Building and running SDK Samples page, makefiles are provided in the eXtremeDB root directory and all sample (project) directories. If it is necessary to rebuild the eXtremeDB libraries, the build system is a process of running the GNU make utility with a combination of cascade makefiles, project files and possible additional third-party products as described in the following sections.
The instructions in the sections below use the following terms:
- The product: McObject's eXtremeDB DBMS (DataBase Management System)
- Build system: A computer system used to convert the eXtremeDB source code to executable binary code for host and target systems
- Target system: A computer system where the eXtremeDB code will to be executed
- Host system: A computer system used to develop applications for the target system
- Third-party software: Software developed outside of McObject used in eXtremeDB code
- Make: the GNU make utility (v 3.81 and later) used to build eXtremeDB code
- Toolchain: A set of programs used to produce executable code out of source code (compiler, linker, etc)
- Compiler family: A number of toolchains with similar behavior. Compiler family defines compiler/linker executable names, the way to pass control switches to the compiler, parameter conventions and other details on how to make the compiler produce binary code.
Build systems entry-points
The build system supports the following entry points:
all
Build all binaries
make … all …clean
Clean the tree. This command removes only intermediate files leaving the final products and build-logs intact.
make … clean …distclean
Total cleanup. This command removes all the intermediate files and directories; the final files and the build logs will be purged out of the directory tree.
make … distclean …
Also, the following old-fashion targets (from eXtremeDB releases prior to version 8.0) are left for compatibility:
host
Builds only the host-side executables.
target
Builds only the target-side utilities and libraries.
tools
This is the logical combination
host + targetsamples
Builds the samples only.
Make systems tips
Following are some tips for using the build system:
- Run make with the
-jcommand line option to enable a parallel build. The option has parameter "-j X" whereXis the number of CPUs allowed to use. The specification-j 1runs make on a single CPU which is good for build issue investigations. Running-jwith no limitation will use all available CPUs in the build system.- In some cases running the build procedure on many CPUs may exhaust the system resources or reach user limitations (quotas). If, during the build process, the system become unresponsive or reports an insufficiency of file or process handles, try to adjust the limits or decrease the number of CPUs used.
- Be courteous to other users on your build system if you share one. Do not consume the full machine power at once. A parallel build on a server may affect other users and services on the system.
For MacOS systems:
Make sure your
JAVA_HOMEenvironment variable has a valid value. The typical way to initialize the variable is in the~/.profile. Add following line into the file:export JAVA_HOME=$(/usr/libexec/java_home)Make sure your user has enough resources available. Increase the "number of processes per user" limit using:
sudo sysctl -w kern.maxprocperuid=4096Templates
Following are some templates for files of the build system, ready for copy-paste. You need to make a unique name for your project and substitute
<project-name>with this name.Sub-directory or Project-directory level makefile
Do not forget to change
<offset-path-to-the-root-directory>with your offset path.MCO_ROOT=$(abspath <offset-path-to-the-root-directory>) include $(MCO_ROOT)/include/settings.makefile include $(if $(findstring yes,$(MCO_QUICK_BUILD))$(findstring on,$(MCO_QUICK_BUILD)),, $(MCO_ROOT)/)makefile.cascade include $(MCO_ROOT)/include/rules.makefile
Sub-directory level makefile.cascade
Substitute
<directory1>…<directoryN>with the names of your directories. If some of the directories are optional put "-" before theincludedirective.include $(call mco_makefile_file, \ <directory1>/makefile.cascade \ ... <directoryN>/makefile.cascade \ )
Project-directory level makefile.cascade
Do not forget to change
<project-name>with the unique name of your project. If you have several projects in the same directory and some of them are optional (i.e. the existence of the project depends on features included into the package), then "-" may be specified in front of theincludedirective.MCO_FILE_DIR:=$(dir $(lastword $(MAKEFILE_LIST))) include $(MCO_FILE_DIR)makefile.project.<project-name-1> ... include $(MCO_FILE_DIR)makefile.project.<project-name-N>
Project-directory level makefile.project.<project-name> for a sample program
Do not forget to change
<project-name>with the unique name of your project.MCO_PRJ_LIST += <project-name> PRJ_TARGET_EXECUTABLE_DPTR += <project-name> PRJ_TARGET_EXECUTABLE_OFFS += <project-name> PRJ_<project-name>_TAGS:=<project-name> sample core PRJ_<project-name>_DIR:=$(call mco_project_dir) PRJ_<project-name>_SRC:=$(call mco_project_file,main.c) $(MCO_SAMPLES_COMMON_DIR)/common.c PRJ_<project-name>_SCHEMAS:=$(call mco_project_file,schema.mco) PRJ_<project-name>_DATABASES:=<database-name> PRJ_<project-name>_RUNTIME:=YES PRJ_<project-name>_MEMDEV:=PRIVATE PRJ_<project-name>_STORAGE:=TRANSIENT PRJ_<project-name>_SYNC:=AUTO PRJ_<project-name>_TRANSMGR:=MURSIW
Project-directory level makefile.project.<project-name> for a library
Do not forget to change
<project-name>with the unique name of your project.MCO_PRJ_LIST += <project-name> PRJ_TARGET_LIBRARY_DPTR_STATIC += <project-name> PRJ_TARGET_LIBRARY_DPTR_DYNAMIC += <project-name> PRJ_TARGET_LIBRARY_OFFS_STATIC += <project-name> PRJ_TARGET_LIBRARY_OFFS_DYNAMIC += <project-name> PRJ_<project-name>_TAGS:=<project-name> target core PRJ_<project-name>_DIR :=$(call mco_project_dir) PRJ_<project-name>_SRC :=$(call mco_project_file, mcosrc1.c … mcosrcN.cpp)
Issues and diagnostics
In most cases, build issues come from the incompatibility of third-party products installed in the build system and eXtremeDB requirements. Sometimes the versions of the products are different from those required. Sometimes the build system lacks the development headers of the products.
Usually, the process of issue detecting is specific for every case, but a good approach is to:
1. Use
MCO_EXPLAIN=python,opensslto see why and how the build script decided to use the third-party components:$ make qqq MCO_EXPLAIN=openssl,python Analyzing build environment... MCO_FORCE_PYTHON=auto MCO_BUILD_PYTHON=/usr/bin/python [X] - OpenSSL 1.1.1 exists on the build system [ ] - Forced to use MCO_OPENSSL_INCLUDE_PATH env. variable [ ] - Forced to use build system OpenSSL installation [ ] - Forced to build and use own OpenSSL installation [ ] - auto-detection enabled, MCO_OPENSSL_INCLUDE_PATH env. variable is set and development headers are present [ ] - auto-detection enabled, the build system match to the target system and there are usable development headers in the local OpenSSL installation [X] - auto-detection enabled, build and use own OpenSSL installation if all above failed [ ] - Invalid value of MCO_FORCE_OPENSSL detected, build and use own OpenSSL installation MCO_TARGET_OPENSSL_INCLUDE=/home/x/t1219/eXtremeDB/target/sal/net/openssl-Linux-x86_64/include [X] Python does exist on the build system [X] Target and build-system arch. signatures are the same [+] or Build system is x86_64 and the target is x86 [+] (python is runnable and good for the target usage) [X] DBus width match (otherwise not good for target usage) [X] Build python is 2.7.x (otherwise not good for target/cross usage) [ ] Dev. headers are present (otherwise not good for target usage) BUILD_PYTHON =/usr/bin/python CROSS_PYTHON =/home/x/t1219/eXtremeDB/target/python/Python-2.7.14-Linux-x86_64/bin/python2.7 TARGET_PYTHON=/home/x/t1219/eXtremeDB/target/python/Python-2.7.14-Linux-x86_64/bin/python2.7 Loading cascade make system... Setting up the build procedure... Processing... make: *** No rule to make target 'qqq'. Stop.
2. Run make with explanations enabled and gather it's output log and internal database:
$ make MCO_EXPLAIN=openssl,python all -p>issue-log 2>&1
3. For investigation of any compilation, it is good to disable parallel building and enable detailed logging (no
-jmake option!)make MCO_BUILD_LOG=full all
The make utility
The eXtremeDB build system utilizes the GNU make utility to build the product's source code into a set of executables and libraries used during development of end-user applications. To do its job, the make utility maintains products and source files dependency information in the form of a dependency tree where the top-level node (target in make's terminology) that depends on several sub-targets, then sub-sub-targets and so on down to the terminal nodes which are the source files. The make utility is able to track source file modifications using the file systems timestamps and file "exist" functions. Thus, make is able to track changes in the dependency chains and update all affected targets that depend on the modified source file.
The build system includes two sub-systems: one is an array of project files that describe each of the eXtremeDB components as projects, defines the properties of the project and its dependencies; the other is a set of cascade make files that delivers the project information to the make utility in order to maintain the full dependency tree of all components, source code, headers, and eXtremeDB utilities. This full dependency tree gives the make utility the ability to trace and build (and re-build if necessary) any part of eXtremeDB. The build operations can be run as a series of build actions one-step-at-a-time or in parallel to utilize the full multi-CPU power of the build system.
The cascade part of the build system
The cascade makefile system is a set of
makefile.cascadefiles located in all major directories of the product. The cascade makefile defines the hierarchy of directories and includes other downstreammakefile.cascadefiles and project makefiles.The build system's project files
Each component of the product is described by a project makefile for the build system. The project makefile defines what the component is, how it is to be built, it's source code files, flags, and properties. There are several types of project in the product: executables (for the host and the target separately), libraries (static and dynamic), JAVA class and jar files, Python modules and third-party modules used in the product.
Implementation of the build system
The product build system is a set of interconnected makefiles. Among all these build systems files, there are some that are special: the top-level makefile, the include/settings.makefile and the include/rules.makefile.
The top-level makefile initiates the build process. First, it includes the include/settings.makefile. This file contains all start-up settings for the build system and the required auto-detection heuristic. A user can override the settings externally or put necessary tunings into the include/settings.makefile. Then, the top-level makefile includes the top-level cascade file which runs (using the cascade inclusion technique) through the all the product's source tree and gathers other cascade and project makefiles. This step delivers the project properties of all the components and samples into the make system. Finally, the top-level makefile includes the include/rules.makefile. This file instructs the make utility how to build all the product files and all necessary intermediate files. This includes the dependency information that instructs the make utility what depends on what. Also, it generates the top-level target for the make command that initiates the build process.
All other sub-directory makefiles (those with no extension) are necessary to be able to initiate the build procedure for this sub-directory and downstream directories. Internally the sub-directory makefiles define the current and top-level directory, and include the top-level makefile. This gives the build system the ability to check and, if necessary, rebuild not only the files in the current directory but even those in another parallel (from the source tree's point of view) directories in order to maintain correctness of the build process when one or several of the components was/were modified.
The auto-detection heuristic implemented in the include/settings.makefile does the following:
1. Detects the build platforms environment: Hardware architecture and OS.
2. Sets the build utilities (such as echo, copy, make, etc.) used in the build process. (This setting depends on the build system.)
3. Sets the build system's compiler family. The same compiler family is set for both host and target systems if no override is given in form of command line options
HOST_COMPILER_FAMILYandTARGET_COMPILER_FAMILY(see section Make system overrides below).4. Using the compiler family information, the script detects the hardware and OS definition for host and target systems.
5. Defines the default setting for eXtremeDB components such as: default memory drivers, synchronization primitives wrapper, file system drivers, etc.
6. Defines the libraries and feature switches for the command generation for compilation and linking, depending on the project properties (for example the libraries that need to be linked into a program to support SQL functionality; or what needs to be given to the source code to make it aware of "Sequences" support).
7. Finally, the script checks the existence of third-party products in the system and decides if it is possible to use the existing installations or if it is required to build its own. (See the detail below on the test and decision-making procedure.)
The dependency-generation code is located in the include/rules.makefile. This code makes the dependency tree for the make utility using the project properties gathered by the cascade sub-system. Each of the projects has a unique name and the set of properties associated with that name. All project properties are defined using make variables, such as
PRJ_<project-name>_XXXX:=YYYY, whereXXXXis a property identifier andYYYYis a value. Also, there are several special variables named "lists" that contain the project names as references.The project needs to be linked into the
MCO_PRJ_LISTlist (i.e. its name needs to be added there asMCO_PRJ_LIST += <project-name>) and at least into one of the following lists:
PRJ_HOST_EXECUTABLE- the list of executable files for the host system. (MCOCOMP, SQL2MCO and etc. are included here.)PRJ_TARGET_EXECUTABLE_DPTR- the list of executable files for the target system built for theDPTRvariant of the eXtremeDB runtime. (For example, all of theDPTR-samples are included here.)PRJ_TARGET_EXECUTABLE_OFFS- the list of executable files for the target system built for theOFFSvariant of the eXtremeDB runtime. (For example, all theOFFS-samples are included here.)PRJ_TARGET_LIBRARY_DPTR_STATIC- the list of the staticDPTRlibraries for the productPRJ_TARGET_LIBRARY_DPTR_DYNAMIC- the list of the dynamicDPTRlibraries for the productPRJ_TARGET_LIBRARY_OFFS_STATIC- the list of the staticOFFSlibraries for the productPRJ_TARGET_LIBRARY_OFFS_DYNAMIC- the list of the dynamicOFFSlibraries for the productPRJ_TARGET_JAR- the list of the Java JARsPRJ_TARGET_CLASS- the list of the Java programs for the productPRJ_CUSTOM- the list of the third-party components that need to be built for the productA project can be added to several suitable
PRJ* lists (eg. C/C++ projects are good for libraries and executables, Java-projects - for Classes and Jars). For example, themcovtmemproject is included into thePRJ_TARGET_LIBRARY_DPTR_STATICandPRJ_TARGET_LIBRARY_DPTR_DYNAMIClists only, while themcovtdsklibrary is present in all fourPRJ_TARGET_LIBRARY_*lists. The build system sets up a special build procedure for every project based on these lists.The build script maintains global scope make targets, such as
build allandclean all, using theMCO_PRJ_LISTlist. The build all action is run from the command linemake all, and produces all of the product binary files. Theclean allaction is run from the command linemake clean, and removes all of the intermediate files but leaves the final binaries and build logs. Themake distcleancommand line cleans everything. Also, it is possible to build each of the binary files (executables, the libraries, classes, and jars) separately using a command line likemake <binary-location-and-name>(for examplemake /home/user/eXtremeDB/target/bin/08-benchmarks-perf).
Note that the build system uses full file names to avoid "process current directory"-related disambiguate issues for parallel building.
The build system includes a mechanism that allows the user to include or exclude selective components of eXtremeDB into or out of the build process. The filter is tag-based. Each of the project files defines a set of tags for each of the components and the
MCO_ENABLE/MCO_DISABLEcontrols (see section Make system controls below) let the user determine the way to enumerate which of the target components need to be enabled or disabled. This mechanism not only excludes the named components from the build process, but also makes all of the other components aware of the status of the enabled / disabled components, and updates them accordingly. For example,MCO_DISABLE=opensslwill exclude OpenSSL from the build procedure as well as the references to OpenSSL from the eXtremeDB crypto-driver and OpenSSL-specific examples.Third-party products in the eXtremeDB build system
eXtremeDBuses some third-party software components (such as LUA, Java, Python, and OpenSSL) in its code. The use of these components is pretty version-sensitive: eXtremeDB code relies on the components' API and build-procedures. This is why the build script needs to make sure that the pre-installed version of the components located on the build system is suitable (i.e. that the version matches eXtremeDB requirements, the required hardware is supported, the development headers are present and so on). To achieve this, there are special precautions implemented in the build script:
- LUA: This component does not require much. eXtremeDB has its full source code (+patches) in its source tree. The only thing is the cross-build procedure. The build system needs to build LUA code for every target platform separately.
- Java: The build system always uses the build platform java installation. It is required to define the
JAVA_HOMEenvironment variable for the current build system.- Python: eXtremeDB works with Python 2.7.x only. It has the Python 2.7.14 source code package in its source tree. The build script tests the build system Python installation for the version number and development headers. Also, the target platform needs to match the build platform. If any of these conditions fail, the build script will build a target-specific Python installation and will use it to produce the eXtremeDB Python module. In some cases, the build script will need to build a cross-python - a python installation matching with data bus with to the target system and able to be executed on the build system.
- OpenSSL: eXtremeDB is sensitive to the version of the OpenSSL component. The build system matches the version of the installed OpenSSL, its hardware platform and checks for development headers. If any of these conditions fail, the script builds the target-specific installation of the OpenSSL software out of the source code package existing in the eXtremeDB source tree.
Note: it is possible to override the auto-detection for Python and OpenSSL using the
MCO_FORCE_OPENSSLandMCO_FORCE_PYTHONcontrols. (See section Make system overrides below.)Structure of the makefiles
This section explains the internal structure of different kinds of makefiles used in the build system.
root-level and sub-directory makefiles
The root-level makefile defines the location of the eXtremeDB installation as an absolute path in the
MCO_ROOTvariable, includes the required parts of the build system and activates the cascade sub-system and the build process:MCO_ROOT=$(abspath .) include $(MCO_ROOT)/include/settings.makefile include $(if $(findstring yes,$(MCO_QUICK_BUILD)) $(findstring on,$(MCO_QUICK_BUILD)),,$(MCO_ROOT)/)makefile.cascade include $(MCO_ROOT)/include/rules.makefileThe only difference for a sub-directory makefile is in the way to define
MCO_ROOT. It converts an offset path to the root directory to its absolute representation:MCO_ROOT=$(abspath ..) include $(MCO_ROOT)/include/settings.makefile include $(if $(findstring yes,$(MCO_QUICK_BUILD)) $(findstring on,$(MCO_QUICK_BUILD)),,$(MCO_ROOT)/)makefile.cascade include $(MCO_ROOT)/include/rules.makefileIn most cases, it is enough to copy an existing sub-directory makefile into a new directory and adjust the
MCO_ROOTvariable to produce a new sub-directory makefile.
Note that the makefiles have some logic that work according to the
MCO_QUICK_BUILDcontrol. (See section Make system controls below for details.)makefile.cascade
Typical sub-directory makefile.cascade files include all cascade files from the sub-directories below its level:
-include $(call mco_makefile_file, \ crypt/makefile.cascade \ mcobackup/makefile.cascade \ ... python/makefile.cascade \ feedhandler/makefile.cascade \ )The project-level makefile.cascade file includes the project files and delivers the project properties into the make utility:
MCO_FILE_DIR:=$(dir $(lastword $(MAKEFILE_LIST))) include $(MCO_FILE_DIR)makefile.project.mcolibThe simplest way to create a new sub-directory or project makefile.cascade file is to copy an existing one and adjust the inclusion of the downstream cascade and project files.
Note that very few cascade files contain logic that includes downstream projects depending on settings from the
include/settings.makefile. For exampletarget/sal/sync/makefile.cascade: include $(call mco_makefile_file, $(addprefix makefile.project.mcos,$(MCO_TARGET_SYNC_IMPLEMENTATIONS)))
Note that some cascade files have a dash ("-") in front of the "include" directive. This construct of the make utility language defines optional inclusion, which is good for cases when a sub-level makefile.cascade needs to be included (may be or may be not present) in the source tree depending on the features included in a package.
makefile.project.XXXX
A typical project makefile defines the name of the project, its properties (such as source code files, databases, eXtremeDB features used etc.) and ties the project to appropriate lists to cause the build system to generate build procedures for the project.
Following is a sample of a library-project makefile:
MCO_PRJ_LIST += mcosql PRJ_TARGET_LIBRARY_DPTR_STATIC += mcosql PRJ_TARGET_LIBRARY_DPTR_DYNAMIC += mcosql PRJ_TARGET_LIBRARY_OFFS_STATIC += mcosql PRJ_TARGET_LIBRARY_OFFS_DYNAMIC += mcosql PRJ_mcosql_TAGS:=target sql malloc PRJ_mcosql_DIR :=$(call mco_project_dir) PRJ_mcosql_SRC :=$(call mco_project_file, dbapi.cpp compiler.cpp sqlc.cpp operators.cpp optimizer.cpp nodes.cpp schema.cpp sql.cpp utils.cpp exceptions.cpp stub.cpp value.cpp hash.cpp multisql.cpp mcoapi.cpp mcosql.cpp mcoseq.cpp mcoapic.cpp)Following is a sample of an executable-project makefile:
MCO_PRJ_LIST += hasimple-master PRJ_TARGET_EXECUTABLE_DPTR += PRJ_TARGET_EXECUTABLE_OFFS += hasimple-master PRJ_hasimple-master_TAGS:=sample ha PRJ_hasimple-master_DIR:=$(call mco_project_dir) PRJ_hasimple-master_SRC:=$(call mco_project_file, master.c) $(MCO_SAMPLES_COMMON_DIR)/common.c $(MCO_SAMPLES_COMMON_DIR)/commonha.c PRJ_hasimple-master_SCHEMAS:=$(call mco_project_file,schema.mco) PRJ_hasimple-master_DATABASES:=simplemstdb PRJ_hasimple-master_RUNTIME:=YES PRJ_hasimple-master_MEMDEV:=PRIVATE PRJ_hasimple-master_STORAGE:=TRANSIENT PRJ_hasimple-master_SYNC:=AUTO PRJ_hasimple-master_TRANSMGR:=MURSIW PRJ_hasimple-master_F_HA:=TCP
Note that the project files add the projects to the corresponding build system lists and the defined project properties. For the meaning of the "properties" see section Project makefile flags below.
Third-party makefiles
The make system wraps the third-party make systems with special project files. A project file is "special" depending on the details of how the third-party product build process needs to be handled. These files are pretty complicated. For reference see:
target/sal/net/makefile.project.opensslortarget/python/makefile.project.python. The build procedure, products, build-logs and intermediate files are handled via thePRJ_CUSTOMlist. (See section Project makefile flags below for details.)
Control switches and overrides
Following is the full list of available control switches, overrides and project properties.
Project makefile flags
Build lists
The following lists are common for all project makefiles. A project needs to be included into
MCO_PRJ_LISTand into at least one of otherPRJ_-lists depending on the meaning of the project. The project can be included in as manyPRJ_-lists as required provided the project's code is suitable for it.
Note that the "+=" operator is used for the inclusion.
MCO_PRJ_LISTA project needs to be included into
MCO_PRJ_LISTto make the build system aware of it. This list is used to generate global-scope operation code for thebuild allandclean alloperations.Example:
MCO_PRJ_LIST += <project-name>
PRJ_HOST_EXECUTABLEThis list contains all the projects that generate host-side executable files including
mcocomp,sql2mco eXtremeDB host utilities.Example:
PRJ_HOST_EXECUTABLE += <project-name>
PRJ_TARGET_EXECUTABLE_DPTR
PRJ_TARGET_EXECUTABLE_OFFSThese lists include target-side eXtremeDB executables such as the
regunlockutility and xSQL. The project needs to be put in theDPTR-list orOFFS-list depending on its meaning, or possibly into both of them.Example:
PRJ_TARGET_EXECUTABLE_DPTR += <project-name> PRJ_TARGET_EXECUTABLE_OFFS += <project-name>
PRJ_TARGET_LIBRARY_DPTR_DYNAMIC
PRJ_TARGET_LIBRARY_OFFS_DYNAMIC
PRJ_TARGET_LIBRARY_DPTR_STATIC
PRJ_TARGET_LIBRARY_OFFS_STATICThese lists include all target-side eXtremeDB library-projects. If a library is meant to be built as a static code container, it needs to be added to the
STATIC-list, and toDYNAMIC-list for dynamic-loaded modules. TheDPTR-lists andOFFS-lists separateDPTRandOFFSversions of the libraries. In most cases a library project would be included into all four of the lists but in some cases only a dynamic version is desired (for example feed handlers modules), or only theOFFSversion makes sense (eg. themcovtdsklibrary).Example:
PRJ_TARGET_LIBRARY_DPTR_DYNAMIC += <project-name> PRJ_TARGET_LIBRARY_OFFS_DYNAMIC += <project-name> PRJ_TARGET_LIBRARY_DPTR_STATIC += <project-name> PRJ_TARGET_LIBRARY_OFFS_STATIC += <project-name>
PRJ_TARGET_CLASSThis list defines projects meant to be Java-classes. These projects are processed by the Java compiler into separate class-files.
Example:
PRJ_TARGET_CLASS += <project-name>
PRJ_TARGET_JARThe projects from this list produce Java code library JAR files. These projects are compiled using the Java compiler and are then put together with the jar utility.
Example:
PRJ_TARGET_JAR += <project-name>
PRJ_TARGET_ANALYZE_ONLYThis is a quite special list. The build system processes the projects on the list, generates build properties out of the project properties, but does not generate code that produces the project products. The generated build properties may be used for some projects that need a special procedure to build its products.
Example:
PRJ_TARGET_ANALYZE_ONLY += <project-name>
PRJ_CUSTOMThis is another special project list. The projects from this list need to be built using a special custom procedure defined in the project's makefile.
Other
PRJ-flags are required to be set for projects such asPRJ_<project-name>_PRODUCTS,PRJ_<project-name>_PRODUCT_DIRS,PRJ_<project-name>_INTERMEDIATE_DIRSandPRJ_<project-name>_BUILD_LOGS. In most cases, the project needs to add its build procedure to thePRJ_GENERATE_CUSTOM_RULESlist.Example:
PRJ_CUSTOM += <project-name> PRJ_GENERATE_CUSTOM_RULES += <project-name-build-proc> PRJ_<project-name>_PRODUCTS :=$(addprefix $(MCO_PRODUCT_ROOT)/target/bin/<dir>, <project-name>.so <project-name>_debug.so) PRJ_<project-name>_PRODUCT_DIRS :=$(MCO_PRODUCT_ROOT)/target/bin/<dir> PRJ_<project-name>_INTERMEDIATE_DIRS:=$(subst $(MCO_ROOT),$(MCO_BUILD_ROOT), $(PRJ_<project-name>_DIR)/build-$(MCO_TARGET_ARCH_SFX))
Common project flags
The following flags define basic project properties and need to be included into every project file. Certainly, every project has to have a unique
<project-name>; like "00-ddl" for instance.
Note that the ":=" operator is used for value assignment. Other kinds of assignment mean value expansion for the make utility and need to be used very carefully due to the asynchronous nature of the build procedure. There is no way to predict the order of the values assignment.
PRJ_<project-name>_DIR:=$(call mco_project_dir)This list defines the location of the project as an absolute path. All projects initialize this property via
$(call mco_project_dir). This construct calculates the path out of themakefile.project-filelocation.Example:
PRJ_00-ddl_DIR:=$(call mco_project_dir)
PRJ_<project-name>_TAGSThis list assigns tag(s) to the project (as a space-separated list). Using the tags it is possible to define logical groups within the project (by a feature, os-specific, etc). The build system is able to enable/disable the groups by user request or automatically.
Example:
PRJ_00-ddl_TAGS:=sample core
PRJ_<project-name>_SRCThis list defines a set of project source code files (as a space-divided list). It may include C/C++ files and headers and Java files. Each of the files must be specified by its name and absolute filesystem path. The build system construct
$(call mco_project_file, <file1.c> <file2.cpp> ... <fileN.h>)helps with the file location.Example:
PRJ_00-ddl_SRC:=$(call mco_project_file,oidsize.h main.c) $(MCO_SAMPLES_COMMON_DIR)/common.c
Project-dependent flags
The following flags are project-dependent and may or may not be specified depending on the meaning of the project.
PRJ_<project-name>_RUNTIMEEnables or disables the eXtremeDB runtime for the project.
Possible values:
<not set>- do not add the eXtremeDB runtime into the project (good for non-eXtremeDB projects)YES- add the runtime libraries into the projectExample:
PRJ_00-ddl_RUNTIME:=YES
PRJ_<project-name>_STORAGEDefines the type of database storage for the project
Possible values:
TRANSIENT- Pure in-memory database, use themcovtmemcomponentPERSISTENT- Persistent/hybrid database, use themcovtdskcomponentExample:
PRJ_00-ddl_STORAGE:=TRANSIENT
PRJ_<project-name>_MEMDEVDefines the memory device used for the project as the database memory storage
Possible values:
<not set>- no memory driver on the linker linePRIVATE- use the default private memory driver for current platform (defined ininclude/settings.makefile)SHARED- use the default shared memory driver for current platform (defined ininclude/settings.makefile)<other>- use a special memory drive, put the value to the linker line as the memory driverExample:
PRJ_00-ddl_MEMDEV:=PRIVATE
PRJ_<project-name>_STORAGEDEVDefines the persistent storage driver for the project. This works for persistent and hybrid database based projects.
Possible values:
AUTO- use the default persistent storage driver for the current platform (defined ininclude/settings.makefile)<not set>- no storage driver<other>- put the specified value to the linker line as the storage driverExample:
PRJ_02-open-disk_file_STORAGEDEV:=AUTO
PRJ_<project-name>_SYNCDefines the synchronization implementation for the project. In the most cases, AUTO will serve the project well.
Possible values:
AUTO- use the default synchronization implementation for the current platform depending onPRJ_<project_name>_MEMDEVsetting.<not set>- use no synchronization. implementation on the linker line<other>- put the specified value to the linker line as the synchronization implementation libraryExample:
PRJ_00-ddl_SYNC:=AUTO
PRJ_<project-name>_TRANSMGRDefines the transaction manager for the project.
Possible values:
MURSIW- use theMURSIWTM implementation libraryMURSIW_READ- use the Read-optimizedMURSIWTM implementation libraryMVCC- use theMVCCTM implementation libraryEXCLUSIVE- use theExclusiveTM implementation library<not set>- no TM library on the linker lineExample:
PRJ_00-ddl_TRANSMGR:=MURSIW
PRJ_<project-name>_DATABASES
PRJ_<project-name>_SCHEMASThese two flags define the project databases (names) and the schema files. There can be several database names/schemas divided by spaces in the list. The number of items in the lists must match. The schema files must be represented by the file names with absolute path (
$(call mco_project_file,<schema.mco>helps here).Possible values:
PRJ_<project-name>_SCHEMAS:=$(call mco_project_file,<schema1.mco> ... <schemaN.mco>)PRJ_16-uda-udameta_DATABASES:=<database1-name> ... <databaseN-name>Example:
PRJ_16-uda-udameta_SCHEMAS:=$(call mco_project_file, uda1.mco uda2.mco uda3.mco uda4.mco uda5.mco) PRJ_16-uda-udameta_DATABASES:=uda1 uda2 uda3 uda4 uda5
PRJ_<project-name>_F_BACKUPIndicates that the project uses Inline Backup feature.
Possible values:
YES- Enable the Incremental Backup feature (and the libraries) for the project.<not set>- no support for Incremental Backup in the project.Example:
PRJ_18-backup-online_F_BACKUP:=YES
PRJ_<project-name>_F_CLUSTEREnables the Cluster feature for the project.
Possible values:
TCP- enable Cluster support and set TCP as the transportMPI- enable Cluster support and set MPI as the transport<not set>- do not enable the Cluster featureExample:
PRJ_cluster_attach_F_CLUSTER:=TCP
Note: do not forget to put
PRJ_<project-name>_TRANSMGR:=MVCCfor Cluster-enabled projects.
PRJ_<project-name>_F_CPPInstructs the build system to generate the C++ interface for the project's databases (equivalent to setting the
-hppflag formcocomp).Possible values:
YES- enable C++ interface<not set>- no C++ interfaceExample:
PRJ_20-languages-cpp_smartptr_F_CPP:=YES
PRJ_<project-name>_F_CRTDefines whether to use the C Runtime Library CRT wrappers for the project.
Possible values:
<not set>- automatically usemcouwrtif the eXtremeDB runtime is enabled or none otherwiseWRT- usemcouwrt(CRT implementation of utility routines) unconditionallyNRT- usemcounrt(own CRT-independent implementation of utility routines) unconditionallyExample:
PRJ_fh_F_CRT:=YES
PRJ_<project-name>_F_CRYPTEnables cryptography support for the project.
Possible values:
YES- Adds themcocryptaeslibrary to the linkage<not set>- automatically addsmcocryptstubfor FeedHandler-enabled or eXtremeDB-enabled projects, or none otherwiseExample:
PRJ_02-open-security-disk_cipher_F_CRYPT:=YES
PRJ_<project-name>_F_DBCALCEnables the DBCALC feature for the project
Possible values:
YES- adds the DBCALC library to the linkage<not set>- does nothingExample:
PRJ_17-statistics-dbcalc-conv_F_DBCALC:=YES
PRJ_<project-name>_F_FHLIBEnables FeedHandler support for the project
Possible values:
YEs - the FeedHandler feature is enabled<not set>- the FeedHandler feature is not enabledExample:
PRJ_fh_F_FHLIB:=YES
PRJ_<project-name>_F_HAEnables High Availability feature support for the project
Possible values:
TCP- enables High Availability and sets TCP as the transport channel. Adds the default socket library to the linkage.UDP- enables High Availability and sets UDP as the transport channel. Adds the default socket library to the linkage.PIPES- enables High Availability and sets PIPES as the transport channel. Adds the default socket library to the linkage.<not set>- no High Availability support for the projectNote: there can be multiple space-divided values for this setting.
Example:
PRJ_hasimple-master_F_HA:=TCP PRJ_hamultichan-master_F_HA:=TCP UDP
PRJ_<project-name>_F_HVEnables HttpView feature support for the project
Possible values:
YES- enable the HttpView feature support. Automatically adds SQL support if the SQL feature is enabled.<not set>- no support for the HttpView featureExample:
PRJ_22-httpview-sql_F_HV:=YES
PRJ_<project-name>_F_IOTEnables IoT feature support
Possible values:
YES- enable the IoT feature support.<not set>- no support for the IoT featureExample:
PRJ_iot_simple_dev_F_IOT:=YES
PRJ_<project-name>_F_LOGEnable the Transaction Logging feature for the project
Possible values:
YES- enable Transaction Logging feature support<not set>- no support for the Transaction Logging featureExample:
PRJ_tlogbasic_F_LOG:=YES
PRJ_<project-name>_F_NATIVEForce native fields ordering for the
mcocomputility (equivalent to setting the-nosortoption).Possible values:
YES- Do not reorder fields in the database schema structs<not set>- usual behaviorExample:
PRJ_createdb_sniffer_F_NATIVE:=YES
PRJ_<project-name>_F_ODBCEnable ODBC support for the project
Possible values:
YES- enable ODBC support<not set>- no support for ODBCExample:
PRJ_simpleodbc_F_ODBC:=YES
PRJ_<project-name>_F_PERFMONEnable the Performance Monitor feature for the project
Possible values:
YES- enable the Performance Monitor feature support<not set>- no support for the Performance Monitor featureExample:
PRJ_25-perfmon_F_PERFMON:=YES
PRJ_<project-name>_F_RESTEnable REST interface feature support (for Web Services) for the project
Possible values:
YES- enable the REST feature support<not set>- no support for the REST featureExample:
PRJ_24-rest-mt_F_REST:=YES
PRJ_<project-name>_F_SEQUENCESEnable Sequence calculations support for the project
Possible values:
YES- enable the Sequence feature supportRLE- enable support of RLE compression version of the Sequence feature<not set>- no support for the Sequence featureExample:
PRJ_sequences-basic_F_SEQUENCES:=RLE
PRJ_<project-name>_F_SERIEnable serialization for the project
Possible values:
YES- enable serialization support<not set>- no support for serializationExample:
PRJ_18-backup-bse-conv_F_SERI:=YES
PRJ_<project-name>_F_SMARTPTREnable generation of the SmartPtr interface for the C++ interface to the projects database (equivalent to setting the
-smartptroption formcocomp)Possible values:
YES- enable SmartPtr support<not set>- no support for SmartPtrExample:
PRJ_20-languages-cpp_smartptr_F_SMARTPTR:=YES
PRJ_<project-name>_F_SQLEnable the SQL feature support for the project.
Possible values:
LOCAL- support for the local SQL engineREMOTE- support for the RSQL engine + default socket library for the platformREMOTE_STANDALONE- support for the RSQL client engine only + default socket library for the platform<not set>- no SQL feature on the linker lineExample:
PRJ_api-sql-01-c-api-mursimul_F_SQL:=LOCAL PRJ_tpcodbc_F_SQL:=REMOTE PRJ_api-sql-10-rsql-client-standalone_F_SQL:=REMOTE_STANDALONE
Enables UDA database interface feature for the project
Possible values:
YES- enable the UDA support<not set>- no support for UDAExample:
PRJ_16-uda-udaops_F_UDA:=YES
PRJ_<project-name>_F_XMLEnable the XML database serialization feature for the project (equivalent to setting the
-xoption formcocomp)Possible values:
YES- enable the XML feature support<not set>- no support for the XML featureExample:
PRJ_16-uda-udaopen_F_UDA:=YES
Overrides
The following flags override default build system behavior on the project level.
PRJ_<project-name>_DEFINESAdds special defines for the project in the form
<define-name>[=<define-value>]. The build script will add the necessary compiler declaration directives automatically.Example:
PRJ_mcoews_DEFINES:=MCOEWS_BUILD_RUNTIME MCO_HTTP_OVERRIDE_CONFIG MCO_HTTP_CGI MCO_SECURITY_NONE MCO_HTTP_CONNECTION_USER_DATA
PRJ_<project-name>_INCLUDEAdditional include locations for the project as directory paths. The build script will add the necessary compiler include path declaration directives.
Example:
PRJ_mcocomplib_INCLUDE:=$(MCO_ROOT)/host/mcocomp
PRJ_<project-name>_DEBUGForce the project to be linked with the debug version of the eXtremeDB libraries.
Possible values:
YES- set the debug libraries unconditionally<not set>- normal behavior (equjvalent to setting theMCO_DEBUG=oncommand line option for debug libraries)Example:
PRJ_fhdbg_DEBUG:=YES
PRJ_<project-name>_F_USE_DYNAMIC_LIBRARIESForce the project to be linked with the dynamic version of the eXtremeDB libraries.
Possible values:
YES- set the dynamic libraries unconditionally<not set>- normal behaviorExample:
PRJ_fh_F_USE_DYNAMIC_LIBRARIES:=YES
PRJ_<project-name>_ADDITIONAL_LIBRARIESAdd special libraries to the linkage of the project. The script will add all necessary library directives for the compiler.
Examples:
PRJ_mcoluaload_ADDITIONAL_LIBRARIES:=luajit
PRJ_<project-name>_SKIP_AUTO_BUILDExclude this project from the auto-build sequence. The project build procedure needs to be initiated by another project (specify the product of the project as a required file for another project).
Possible values:
YES- exclude this project from the auto-build list<not set>- normal behaviorExamples:
PRJ_openssl_SKIP_AUTO_BUILD :=YES
PRJ_<project-name>_BUILD_SFXThis defines a custom suffix for the products intermediate directory. Good for projects with custom build procedure.
PRJ_<project-name>_RESULT_NAME_BASEOverrides the name of the product of the project. The build script will use this value instead of
<project-name>during product file name generation. The script will add all necessary prefixes and suffixes according to the projects product nature.Example:
PRJ_mcocomplib_RESULT_NAME_BASE:=mcocomp
Custom-build flags
The following flags are good for custom-build projects only.
PRJ_<project-name>_PRODUCTSThe list of the products of the project.
PRJ_<project-name>_PRODUCT_DIRSThe list of directories where the products of the project will be created (if the location is not the default bin directory).
PRJ_<project-name>_BUILD_LOGSThe list of build logs for the project.
PRJ_<project-name>_INTERMEDIATE_DIRSThe list of directories where the intermediate files of the project will be created during the build procedure.
PRJ_<project-name>_MAKEFUNCDefines the name of the custom build procedure that generates the build target for the project.
Make system controls
The following flags are defined to control the make system build process.
MCO_BUILD_ROOTDefines the directory where the script will put all the build activities and intermediate files. It must be an absolute path to the directory. The default is the same directory as
MCO_ROOT. Using this control it is possible to build eXtremeDB binaries out of the source tree.
MCO_PRODUCT_ROOTDefines the directory where the build script will create products of the build process. It must be an absolute path to the directory. The default is
MCO_BUILD_ROOT. Using this control it is possible to separate the final products from the intermediate files and the source code tree.
MCO_QUICK_BUILDValues: on or yes. Disables the detailed dependency tracking mechanism but makes the build process faster overall. When the override is active, the script starts the cascade import not from the
MCO_ROOTbut from the current directory, so the build procedure will cover only the current and all downstream directories.
MCO_BUILD_LOGDefines how to show the build process log. There are three settings:
on,offandfull. The default setting isonand it displays only brief progress information. Theoffsetting makes the build script quiet (see the result code and the build logs for results). Thefullsetting prints all of the output immediately and does not maintain build logs. For theonandoffsettings the build scrip puts all the commands and the output into the build log files located in the projects intermediate directories. Usually the build log is named the same as the project's product name with the ".build-log" extension. Also the build script produces separate build logs for object files naming them as<object-file-name>.o.build-log.
Note that it is highly not recommended to use the
fullsetting for a parallel build. The asynchronous nature of the process makes a mess in the output. It is very tricky to find the actual error message in this build log.
MCO_EXTRA_CHECKSThe
onsetting enables extra checks (equivalent to-Walland-pedanticoptions) for gcc-based builds.
MCO_ENABLE_EVAL_BINARIESThe
yessetting enables producing the evaluation version of eXtremeDB binaries in bin-directories with the ".eval" suffix.
MCO_DISABLEThis control switch allows the user to exclude groups of or specific projects / features out of the build process. The value of this control is a comma-separated or space-separated list of project tags that need to be disabled. Disabling a tag results not only in excluding the specified projects from the build process, but also disabling compilation defines indicating the presence of disabled features.
Example:
MCO_DISABLE:=sequences MCO_DISABLE:=java python lua MCO_DISABLE:=net,fsystem
MCO_ENABLEThis control switch enables projects / features that are normally disabled.
Example:
MCO_ENABLE :=wchar MCO_ENABLE :=rtree
Additional switches
The following switch settings have the effect of setting other build system controls.
SHOW_BUILD_LOG=onUses
MCO_BUILD_LOG=full.
x64=on|offThe build system detects the target databus width automatically (with the target compiler's help). It is necessary to specify
x64=offto make the build script produce 32-bit code.
MCO_SKIP_PERFMON=yesSkips the Performance Monitor (
perfmon) build.
MCO_SKIP_SEQ_LIB=yesDisables sequences support.
MCO_SKIP_LUA_UDF=yesDisables UDF for Lua support.
MCO_SKIP_XSQL_BIN=yesSkips the xSQL build.
JAVA=offSkips Java-related code.
PYTHON=offSkips Python-related code.
LUA=offSkips Lua-related code.
FEEDHANDLER=offSkip FeedHandler code.
Make system overrides
The following switches override the gcc/g++ compiler name for GCC-based toolchains. This makes it possible to use alternative compilers.
MCO_BUILD_GCC_OVERRIDE=<gcc-executable-name>
MCO_BUILD_GXX_OVERRIDE=<g++-executable-name>
MCO_HOST_GCC_OVERRIDE=<gcc-executable-name>
MCO_HOST_GXX_OVERRIDE=<g++-executable-name>
MCO_TARGET_GCC_OVERRIDE=<gcc-executable-name>
MCO_TARGET_GXX_OVERRIDE=<g++-executable-name>Example:
MCO_TARGET_GCC_OVERRIDE=gcc456 MCO_TARGET_GXX_OVERRIDE=g++456
MCO_FORCE_OPENSSLOverrides auto-detection of the OpenSSL package.
Possible values:
MCO_FORCE_OPENSSL=auto- (Default) Try to use an OpenSSL installation pointed to by theMCO_OPENSSL_INCLUDE_PATHenvironment variable if it is set; otherwise try to use the build system's OpenSSL headers if the build architecture is the same as the target and the build system has the necessary headers; finally, use the OpenSSL package from the source tree to build the OpenSSL installation for the target system and use it to build eXtremeDBMCO_FORCE_OPENSSL=envpath- Unconditionally force the use of $(MCO_OPENSSL_INCLUDE_PATH) to look for OpenSSL headers for the targetMCO_FORCE_OPENSSL=buildsys- Unconditionally force the use of the build system's OpenSSL installationMCO_FORCE_OPENSSL=sourcetree- Force building the target-specific OpenSSL package from the source code archive located intarget/sal/net
MCO_FORCE_PYTHONOverrides auto-detection of the Python package.
Possible values:
MCO_FORCE_PYTHON=auto- (Default) try to use the Python installation pointed to by thePYTHONBINenvironment variable if it is set; otherwise try to find the Python installation by the path. Next check if the Python version is sufficient, is runnable, that the architecture matches and it has the necessary header file. Otherwise, build Python from the package in the source tree.MCO_FORCE_PYTHON=envpath- Unconditionally force the use of$(PYTHONBIN)to look for PythonMCO_FORCE_PYTHON=buildsys- Unconditionally force the use of the build system's Python installationMCO_FORCE_PYTHON=sourcetree- Force building the Python package from the source code archive located intarget/python
HOST_COMPILER_FAMILY
TARGET_COMPILER_FAMILYOverrides the auto-detected
host/targetcompiler family. The auto-detection is based on thehost/targetplatform OS.Example:
TARGET_COMPILER_FAMILY=gcc
HOST_ARCH
TARGET_ARCHOverrides the auto-detection of the
host/targethardware architecture. The auto-detection is based on the host/target compilers information.Example:
TARGET_ARCH=aarch64
HOST_DBUS_WIDTH
TARGET_DBUS_WIDTHOverrides auto-detection of the
host/targetdatabus width. The auto-detection is based on thehost/targetcompilers and architecture information.Possible values are
16,32or64.Example:
TARGET_DBUS_WIDTH=32
HOST_FLAGS
TARGET_FLAGSUnconditionally adds arguments to the compiler/linker command line for HOST / TARGET code compilation. (Arguments are added exactly as they appear - no checks are applied.)
Example:
TARGET_FLAGS="--sysroot=/opt/toolchains/arm-unknown-linux/"
Test Suite makefile.test compatibility notes
The build system includes compatibility support for the Test Suite
run.pyscript. Keep in mind that themakefile.testfiles are not good for parallel processing. Do not try to usemake -jfor them.There are two cases of possible usage of the build system from
run.py:Method 1. Run
makefile.testdirectly as a project makefile.Example of the makefile:
MCO_ROOT=$(abspath ../../..) include $(MCO_ROOT)/include/settings.makefile TEST_TAGS = disk in-memory callback threads TEST_COMMENT = Allocation callback test. It checks callback notification about exceded in-mamory or disk database space TEST_TIMEOUT = 300 MCO_ROOT ?= ../../.. PRJ_TYPE = APP PRJ_SHOW_BUILD = YES PRJ_SIDE = TARGET PRJ_SOURCES = main.c PRJ_SCHEMAS = schema.mco PRJ_INTERFACES = PRJ_DBNAMES = allocclbkdb PRJ_STORAGE ?= MEMORY PRJ_MEMDEV ?= CONV PRJ_STORAGEDEV = AUTO PRJ_SYNC = AUTO PRJ_TRANSMGR ?= MURSIW PRJ_DIRECTPTR ?= NO PRJ_HA ?= NONE PRJ_RPC = NONE PRJ_F_CPP = NO PRJ_F_SQL = NO PRJ_F_LOG = NO PRJ_F_DBCALC = NO PRJ_F_UDA = NO PRJ_F_XML = NO PRJ_F_SERI = NO PRJ_F_HV = NO PRJ_F_CLUSTER = NO PRJ_RMFILES = PRJ_TITLE = allocclbk_$(PRJ_SUFFIX) THIS_MAKEFILE := $(lastword $(MAKEFILE_LIST)) # include $(MCO_ROOT)/include/header.mak include $(MCO_ROOT)/include/rules.makefileThe build system detects this kind of
makefile.testfiles by the presence ofPTR_TYPE = APPandTEST_NAME. For this kind ofmakefile.testthe build system creates a virtual project makefile usingPRJ_TITLEas the project name (<project-name>mentioned above) and sets all of the build properties asPRJ_$(PRJ_TITLE)_XXXXwhereXXXXis the property name. Project tags come from theTEST_TAGSvariable. The eXtremeDB runtime is always enabled. The final executable name is set as the value ofPRJ_TITLEbecause the value includesPRJ_SUFFIXalready.PRJ_DIRECTPTRcontrols the inclusion into thePRJ_TARGET_EXECUTABLE_-list. All other build properties are set according to the rules of the old build system.
Method 2. Run the normal build systems makefile from under
makefile.testcontrol.Example of the
makefile.test:TEST_NAME = 08-benchmarks-perf-conv TEST_TAGS = samples fast perf TEST_COMMENT = 08-benchmarks perf sample TEST_TIMEOUT = 300 TEST_STORAGE = MEMORY MCO_ROOT ?= ../../../../.. all: $(MAKE) -C . $(MAKEFLAGS) $(MAKECMDGOALS) PRJ_TITLE=$(TEST_NAME)_$(PRJ_SUFFIX) clean: $(MAKE) -C . $(MAKEFLAGS) $(MAKECMDGOALS)The build system detects this kind of makefile.test by the presence of the
PRJ_TYPEandTEST_NAMEvariables. As themakefile.testactually runs a typical makefile there is no need to create a virtual project. All the build properties come from the makefile and the script cares about thePRJ_STORAGE,PRJ_MEMDEV,PRJ_TRANSMGR,PRJ_DIRECTPTR,PRJ_SUFFIXandTEST_TAGSoverrides only.PRJ_DIRECTPTRcontrols inclusion into thePRJ_TARGET_EXECUTABLE_-lists. Project tags comes fromTEST_TAGS. The final executable namePRJ_<project-name>_RESULT_NAME_BASEis constructed from<project-name>_$(PRJ_SUFFIX). The values of thePRJ_STORAGE,PRJ_MEMDEV,PRJ_TRANSMGRcontrols override normal values of the project build settingsPRJ_<project-name>_STORAGE,PRJ_<project-name>_F_MCOCOMP_FORCE,PRJ_<project-name>_STORAGEDEV,PRJ_<project-name>_MEMDEV,PRJ_<project-name>_TRANSMGSandPRJ_<project-name>_F_SEQUENCESaccording to the rules described above (see section Common project flags above).