Skip to content

MindConnect Library – Building MCL

This section will guide you to build MCL as a dynamic library from source code using CMake in Linux environment and also show you how to import and use MCL inside an example agent application. Although the steps are described for Linux environment, they are expected to be informative enough for other environments as well.

Helper scripts build_helper_linux.sh and build_helper_win64.bat are distributed with the source code which can be used as reference to setup your host environment and build MCL in Linux and Windows respectively.

Default implementations for replaceable modules (i.e. http client, crypto, memory and file utility) will be used. If you intend to use alternative implementation for any of the replaceable modules see Replacing MCL Modules.

Both the core component and the connectivity extension will be built. See MCL Build Options to select components to build.

These are the steps of the build process in order:

Building OpenSSL

Download OpenSSL package openssl-1.1.1c.tar.gz and in your download directory run the following commands where <OpenSSL_Install_Directory> refers to the directory you want to install OpenSSL:

1
2
3
4
$ tar -xvzf openssl-1.1.1c.tar.gz
$ cd openssl-1.1.1c
$ ./config --prefix=<OpenSSL_Install_Directory> -Wl,-rpath=<OpenSSL_Install_Directory>/lib shared -fPIC
$ sudo make install

Now, there must be a folder <OpenSSL_Install_Directory>/include/openssl and shared objects <OpenSSL_Install_Directory>/lib/libcrypto.so and <OpenSSL_Install_Directory>/lib/libssl.so.

Building Libcurl

Download libcurl package curl-7.65.3.tar.gz and in your download directory run the following commands where <libcurl_Install_Directory> refers to the directory you want to install libcurl:

1
2
3
4
$ tar -xvzf curl-7.65.3.tar.gz
$ cd curl-7.65.3
$ LDFLAGS="-Wl,-R<OpenSSL_Install_Directory>/lib" ./configure --enable-http --with-ssl=<OpenSSL_Install_Directory> --prefix=<libcurl_Install_Directory> --without-libssh2 --disable-ftp --disable-tftp --disable-file --disable-ldap --disable-rtsp --disable-dict --disable-telnet --disable-pop3 --disable-imap --disable-smb --disable-scp --disable-sftp --disable-smtp --disable-gopher --disable-manual
$ sudo make install

Now, there must be a folder <libcurl_Install_Directory>/include/curl and shared object <libcurl_Install_Directory>/lib/libcurl.so.

Building MCL

After the dependencies of MCL are built, to build MCL, run the following commands where

<MCL_Source_Directory> refers to the directory of MCL source code (i.e. directory in which README.md, top level CMakeLists.txt and subfolders for each component exist),
<MCL_Build_Directory> refers to the intermediate directory used during build process,
<MCL_Install_Directory> refers to the directory in which build artifacts are located.

1
2
3
4
$ mkdir -p <MCL_Build_Directory>
$ cd <MCL_Build_Directory>
$ cmake -DCMAKE_PREFIX_PATH="<OpenSSL_Install_Directory>;<libcurl_Install_Directory>" -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX:PATH=<MCL_Install_Directory> -DMCL_STATICLIB=OFF -DMCL_LOG_LEVEL=MCL_LOG_LEVEL_NONE <MCL_Source_Directory>
$ cmake --build . --clean-first --target install

Now, there must be folders <MCL_Install_Directory>/include/mcl_core and <MCL_Install_Directory>/include/mcl_connectivity containing MCL headers and there must be shared objects <MCL_Install_Directory>/lib/libmcl_core.so and <MCL_Install_Directory>/lib/_libmcl_connectivity.so.

MCL Build Options

You can build MCL with different configurations with the options listed in the table below:

Variable Default Value Description
MCL_STATICLIB OFF If set to ON, MCL components are built as static library.
MCL_DOC OFF If set to ON, MCL reference documentation is also built.
MCL_TEST OFF If set to ON and if ruby is found in path MCL is built with tests.
MCL_CONNECTIVITY ON If set to ON, MCL Connectivity component will also be built.
MCL_CRYPTO "openssl" See "Replacing MCL Modules" section.
MCL_HTTP_CLIENT "curl" See "Replacing MCL Modules" section.
MCL_FILE_UTIL "standard" See "Replacing MCL Modules" section.
MCL_MEMORY "standard" See "Replacing MCL Modules" section.
MCL_LOG_LEVEL MCL_LOG_LEVEL_INFO MCL logging level. See MCL Logging section.

MCL Logging

MCL logging level can be configured when building MCL by setting MCL_LOG_LEVEL option to one of the values listed in the table below:

MCL Logging Level Description
MCL_LOG_LEVEL_VERBOSE Extensive details of operation are logged together with MCL_LOG_LEVEL_DEBUG level logs.
MCL_LOG_LEVEL_DEBUG Diagnostically helpful information are logged together with MCL_LOG_LEVEL_INFO level logs.
MCL_LOG_LEVEL_INFO Information for the stages of operation are logged together with MCL_LOG_LEVEL_WARN level logs.
MCL_LOG_LEVEL_WARN Warnings are logged together with MCL_LOG_LEVEL_ERROR level logs.
MCL_LOG_LEVEL_ERROR Operational errors are logged together with MCL_LOG_LEVEL_FATAL level logs.
MCL_LOG_LEVEL_FATAL Only fatal errors are logged.
MCL_LOG_LEVEL_NONE Nothing is logged.

Scope of logging can be reduced in agent application code from the level set at build time but can not be extended. See reference documentation for details.

Building Custom Agent Application

MCL source code is distributed with several example agent applications. See Examples for details. To build an example agent application, you can copy the source code of one of the examples to a directory, referred as <Custom_Agent_Project_Directory>, and create a CMakeLists.txt file in that directory with the content below:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
CMAKE_MINIMUM_REQUIRED(VERSION 3.10 FATAL_ERROR)

# You can change the project name.
PROJECT(CustomAgentApplication LANGUAGES C)

SET(CMAKE_C_STANDARD 99)
SET(CMAKE_C_STANDARD_REQUIRED ON)

FILE(GLOB SOURCES *.c)
LIST(APPEND AGENT_SOURCES ${SOURCES})

# You must type in the directory that MCL is installed.
SET(MCL_INSTALL_DIR "<MCL_Install_Directory>")

SET(MCL_CORE ${MCL_INSTALL_DIR}/lib/libmcl_core.so)
SET(MCL_CONNECTIVITY ${MCL_INSTALL_DIR}/lib/libmcl_connectivity.so)
SET(MCL_INCLUDE_DIRECTORY ${MCL_INSTALL_DIR}/include/)

SET(AGENT_OUTPUT_DIR ${CMAKE_BINARY_DIR}/build)
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${AGENT_OUTPUT_DIR})
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${AGENT_OUTPUT_DIR})
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${AGENT_OUTPUT_DIR})

# You can change the name of the executable, it does not have to be the same as the project name.
ADD_EXECUTABLE(${PROJECT_NAME} ${AGENT_SOURCES})

TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME} PUBLIC ${MCL_INCLUDE_DIRECTORY})
TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${MCL_CORE} ${MCL_CONNECTIVITY})

Now, you can compile your agent application by running the following commands where <Custom_Agent_Build_Directory> refers to the build directory for your project:

1
2
3
4
$ mkdir -p <Custom_Agent_Build_Directory>
$ cd <Custom_Agent_Build_Directory>
$ cmake <Custom_Agent_Project_Directory>
$ cmake --build . --clean-first

You will find agent application executable named CustomAgentApplication in <Custom_Agent_Build_Directory>.

Any questions left?

Ask the community


Except where otherwise noted, content on this site is licensed under the MindSphere Development License Agreement.