dev(SF-242): added --version option #1

Open
romanina wants to merge 1 commits from feat-version into master
4 changed files with 133 additions and 12 deletions
Showing only changes of commit 63c4e8119e - Show all commits

View File

@ -40,13 +40,52 @@ if(DEFINED BOARD)
include(${SITARA_DEPOT}/compile/sitara_compile_flags.cmake)
endif()
# <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> nlohman json <EFBFBD> GCC7.1
# Подгружаем внешние репозитории
include(FetchContent)
include(RepositoryPath.cmake)
FetchContent_Declare(
cxxopts
GIT_REPOSITORY ${cxxopts_path}
GIT_TAG master
)
FetchContent_GetProperties(cxxopts)
if(NOT cxxopts_POPULATED)
FetchContent_Populate(cxxopts)
add_subdirectory(${cxxopts_SOURCE_DIR} ${cxxopts_BINARY_DIR})
endif()
# Получаем информацию о последнем Git Tag.
execute_process(
COMMAND ${GIT_EXECUTABLE} describe --tags --abbrev=0
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
OUTPUT_VARIABLE GIT_TAG
OUTPUT_STRIP_TRAILING_WHITESPACE
)
# Получаем информацию о текущем коммите.
execute_process(
COMMAND ${GIT_EXECUTABLE} show-ref --head -s -- "head"
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
OUTPUT_VARIABLE GIT_HEAD
OUTPUT_STRIP_TRAILING_WHITESPACE
)
# Определяем сведения о версии.
set(GIT_VERSION_INFO GIT_TAG="${GIT_TAG}" GIT_HEAD="${GIT_HEAD}")
# убирает предупреждение nlohman json о GCC7.1
add_compile_options(-Wno-psabi)
#<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> undefined reference pthread, <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
#Если не собирается с ошибкой линкера undefined reference pthread, то добавить флаг линкера:
#add_link_options(-lrt)
add_executable(${TARGET_NAME} ./main.cpp ${SRC_FILES})
# Записываем сведения о версии.
target_compile_definitions(${TARGET_NAME} PRIVATE ${GIT_VERSION_INFO})
target_include_directories(${TARGET_NAME} PRIVATE
./
${INC_DIRS}
@ -56,14 +95,23 @@ target_include_directories(${TARGET_NAME} PRIVATE
)
if (CMAKE_BUILD_TYPE STREQUAL Debug)
set(LIB_LIST profinetd osald ${Boost_LIBRARIES})
set(LIB_LIST
profinetd
osald
${Boost_LIBRARIES}
cxxopts)
elseif(CMAKE_BUILD_TYPE STREQUAL Release)
set(LIB_LIST profinet osal ${Boost_LIBRARIES})
set(LIB_LIST
profinet
osal
${Boost_LIBRARIES}
cxxopts)
endif()
# <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> nlohman json <EFBFBD> GCC7.1
# убирает предупреждение nlohman json о GCC7.1
add_compile_options(-Wno-psabi)
set(LIB_ARCH_DIR x86_64)
if(DEFINED BOARD)
@ -82,10 +130,10 @@ endif()
target_link_directories(${TARGET_NAME} PUBLIC ${LINK_PATH})
#<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> undefined reference pthread, <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ${Boost_LIBRARIES} <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> pthread <EFBFBD><EFBFBD><EFBFBD> -lpthread:
#Если не собирается с ошибкой линкера undefined reference pthread, то после ${Boost_LIBRARIES} добавить pthread или -lpthread:
#target_link_libraries (${TARGET_NAME} PUBLIC profinet osal ${Boost_LIBRARIES} pthread)
# <EFBFBD><EFBFBD><EFBFBD> BeagleBoneAI: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GCC8 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> stdc++fs(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <filesystem>)
# Для BeagleBoneAI: версия GCC8 нужно указывать stdc++fs(библиотека <filesystem>)
if (CMAKE_COMPILER_IS_GNUCC AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9)
set(LIB_LIST ${LIB_LIST} stdc++fs)
endif()
@ -98,13 +146,13 @@ install(
)
install(FILES
# <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
# <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> pnet <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> fork <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> exit <EFBFBD>
# <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
# Копирование заглушки скрипта установки параметров сети.
# Если не копировать, то в недрах pnet после fork вызовется exit и
# и вызовутся деструкторы объектов, что может привести к непредвиденным последствиям.
${CMAKE_CURRENT_SOURCE_DIR}/set_network_parameters
#<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#Копирование файла конфигурации
${CMAKE_CURRENT_SOURCE_DIR}/program_configure.json
#<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Profinet
#Копирование тестового файла конфигурации устройства Profinet
${CMAKE_CURRENT_SOURCE_DIR}/profinet_device_configure.json
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/bin
)

10
src/RepositoryPath.cmake Normal file
View File

@ -0,0 +1,10 @@
# Specify the path to dependencies' git repositories
cmake_path(SET cxxopts_path "git@sofdev:External/cxxopts.git")
if (
NOT DEFINED cxxopts_path
)
message(FATAL_ERROR "Path to the dependency git repository is not specified")
endif()

37
src/Version.h Normal file
View File

@ -0,0 +1,37 @@
#ifndef UFC_ASYNCSERIALCONNECTOR_VERSION_H
#define UFC_ASYNCSERIALCONNECTOR_VERSION_H
#include <string>
namespace asc {
/**
* Содержит сведения о текущей версии ПО.
*/
class Version {
public:
/**
* Получить текущую версию.
*/
static std::string GetVersion(){
return !GitTag.empty()
? GitTag + " " + GitHead
: GitHead;
}
private:
/**
* Последний TAG текущей ветки.
*/
static const std::string GitTag;
/**
* Hash текущего коммита.
*/
static const std::string GitHead;
};
}
const std::string asc::Version::GitTag = GIT_TAG;
const std::string asc::Version::GitHead = GIT_HEAD;
#endif // UFC_ASYNCSERIALCONNECTOR_VERSION_H

View File

@ -2,14 +2,40 @@
#include "profinet.hpp"
#include <thread>
#include <iostream>
#include <cxxopts.hpp>
#include "program_config.hpp"
#include "app.hpp"
#include "Version.h"
App app;
int main(int argc, char * argv[])
{
cxxopts::Options options(
"ProfinetConnector",
"Profinet io device driver. Designed for profinet controller interaction via ethernet\n"
);
options.set_width(160);
options.add_options()
("help", "Display this help", cxxopts::value<bool>()->default_value("false"))
("version", "Show git head commit and tag", cxxopts::value<bool>()->default_value("false"));
auto result = options.parse(argc, argv);
if (result["help"].as<bool>()) {
return not(std::cout << options.help() << std::endl);
}
// Выводим информацию о текущей версии.
if (result["version"].as<bool>()) {
std::cout << "version: " << asc::Version::GetVersion() << std::endl;
return 0;
}
//
app.Init("program_configure.json");
app.Run();