Нахуй всё отсюда =))
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,2 +1,2 @@
|
||||
build/
|
||||
build*/
|
||||
*.log
|
||||
|
||||
@@ -1,4 +1,14 @@
|
||||
cmake_minimum_required(VERSION 3.10)
|
||||
|
||||
project(test_app)
|
||||
set(CMAKE_CXX_STANDART 17)
|
||||
add_executable(test_app main.cpp)
|
||||
|
||||
set(EXEC_NAME "${CMAKE_PROJECT_NAME}")
|
||||
|
||||
set(CMAKE_CXX_STANDART 11)
|
||||
add_executable(${EXEC_NAME})
|
||||
|
||||
file(GLOB_RECURSE SOURCES CONFIGURE_DEPENDS "src/*.cpp")
|
||||
|
||||
target_sources(${EXEC_NAME} PRIVATE
|
||||
${SOURCES}
|
||||
)
|
||||
|
||||
194
build-x86.sh
Executable file
194
build-x86.sh
Executable file
@@ -0,0 +1,194 @@
|
||||
#!/bin/bash
|
||||
set -e # Прерывать выполнение при ошибках
|
||||
|
||||
# Цвета для вывода
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Конфигурация
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
BUILD_DIR="build-x86"
|
||||
TOOLCHAIN_FILE="toolchain-x86.cmake"
|
||||
JOBS=$(nproc)
|
||||
|
||||
# Функции для вывода
|
||||
print_info() {
|
||||
echo -e "${BLUE}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
print_success() {
|
||||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||
}
|
||||
|
||||
print_warning() {
|
||||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||
}
|
||||
|
||||
print_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
# Проверка наличия toolchain файла
|
||||
check_toolchain() {
|
||||
if [ ! -f "$SCRIPT_DIR/$TOOLCHAIN_FILE" ]; then
|
||||
print_error "Файл $TOOLCHAIN_FILE не найден в $SCRIPT_DIR"
|
||||
exit 1
|
||||
fi
|
||||
print_info "Найден toolchain файл: $TOOLCHAIN_FILE"
|
||||
}
|
||||
|
||||
# Создание директории сборки
|
||||
setup_build_dir() {
|
||||
print_info "Настройка директории сборки: $BUILD_DIR"
|
||||
|
||||
if [ -d "$SCRIPT_DIR/$BUILD_DIR" ]; then
|
||||
print_warning "Директория сборки уже существует"
|
||||
read -p "Очистить существующую сборку? [y/N]: " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
rm -rf "$SCRIPT_DIR/$BUILD_DIR"
|
||||
print_info "Директория сборки очищена"
|
||||
fi
|
||||
fi
|
||||
|
||||
mkdir -p "$SCRIPT_DIR/$BUILD_DIR"
|
||||
print_success "Директория сборки готова"
|
||||
}
|
||||
|
||||
# Конфигурация CMake
|
||||
configure_cmake() {
|
||||
print_info "Конфигурация CMake для x86..."
|
||||
|
||||
cd "$SCRIPT_DIR/$BUILD_DIR"
|
||||
|
||||
# Определяем тип сборки (Debug по умолчанию для отладки)
|
||||
local build_type="${BUILD_TYPE:-Debug}"
|
||||
print_info "Тип сборки: $build_type"
|
||||
|
||||
cmake \
|
||||
-DCMAKE_BUILD_TYPE="$build_type" \
|
||||
-DCMAKE_VERBOSE_MAKEFILE=ON \
|
||||
..
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "CMake конфигурация завершена успешно"
|
||||
else
|
||||
print_error "Ошибка конфигурации CMake"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Сборка проекта
|
||||
build_project() {
|
||||
print_info "Сборка проекта (используется $JOBS потоков)..."
|
||||
|
||||
cd "$SCRIPT_DIR/$BUILD_DIR"
|
||||
|
||||
make -j$JOBS
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Сборка завершена успешно"
|
||||
else
|
||||
print_error "Ошибка сборки"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Проверка результата сборки
|
||||
check_build_result() {
|
||||
local binary_path="$SCRIPT_DIR/$BUILD_DIR/test_app"
|
||||
|
||||
if [ -f "$binary_path" ]; then
|
||||
print_success "Исполняемый файл создан: $binary_path"
|
||||
|
||||
# Проверяем архитектуру
|
||||
local file_info=$(file "$binary_path")
|
||||
print_info "Информация о файле: $file_info"
|
||||
|
||||
if echo "$file_info" | grep -q "x86-64\|x86_64"; then
|
||||
print_success "Подтверждена x86 архитектура"
|
||||
else
|
||||
print_warning "Архитектура может быть неправильной"
|
||||
fi
|
||||
|
||||
# Показываем размер файла
|
||||
local file_size=$(du -h "$binary_path" | cut -f1)
|
||||
print_info "Размер исполняемого файла: $file_size"
|
||||
|
||||
else
|
||||
print_error "Исполняемый файл не найден: $binary_path"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Главная функция
|
||||
main() {
|
||||
print_info "=== Кросс-компиляция test_app для x86 ==="
|
||||
|
||||
# Переходим в директорию скрипта
|
||||
cd "$SCRIPT_DIR"
|
||||
|
||||
# Проверки
|
||||
|
||||
# Сборка
|
||||
setup_build_dir
|
||||
configure_cmake
|
||||
build_project
|
||||
check_build_result
|
||||
|
||||
print_success "=== Кросс-компиляция завершена успешно! ==="
|
||||
print_info "Исполняемый файл: $SCRIPT_DIR/$BUILD_DIR/test_app"
|
||||
print_info "Для запуска на x86 устройстве скопируйте файл и запустите его"
|
||||
}
|
||||
|
||||
# Обработка аргументов командной строки
|
||||
case "${1:-}" in
|
||||
"clean")
|
||||
print_info "Очистка директории сборки x86..."
|
||||
rm -rf "$SCRIPT_DIR/$BUILD_DIR"
|
||||
print_success "Директория сборки очищена"
|
||||
exit 0
|
||||
;;
|
||||
"debug")
|
||||
export BUILD_TYPE="Debug"
|
||||
print_info "Режим Debug сборки (с отладочными символами)"
|
||||
main
|
||||
;;
|
||||
"release")
|
||||
export BUILD_TYPE="Release"
|
||||
print_info "Режим Release сборки (оптимизированная)"
|
||||
main
|
||||
;;
|
||||
"help"|"-h"|"--help")
|
||||
echo "Использование: $0 [команда]"
|
||||
echo ""
|
||||
echo "Команды:"
|
||||
echo " (нет) - Выполнить Debug сборку (по умолчанию)"
|
||||
echo " debug - Выполнить Debug сборку (с отладочными символами)"
|
||||
echo " release - Выполнить Release сборку (оптимизированная)"
|
||||
echo " clean - Очистить директорию сборки"
|
||||
echo " help - Показать эту справку"
|
||||
echo ""
|
||||
echo "Примеры:"
|
||||
echo " $0 # Debug сборка"
|
||||
echo " $0 debug # Debug сборка (явно)"
|
||||
echo " $0 release # Release сборка"
|
||||
echo " $0 clean # Очистка"
|
||||
echo ""
|
||||
echo "Переменные окружения:"
|
||||
echo " BUILD_TYPE # Debug, Release, RelWithDebInfo, MinSizeRel"
|
||||
exit 0
|
||||
;;
|
||||
"")
|
||||
export BUILD_TYPE="${BUILD_TYPE:-Debug}"
|
||||
main
|
||||
;;
|
||||
*)
|
||||
print_error "Неизвестная команда: $1"
|
||||
print_info "Используйте '$0 help' для справки"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
17
main.cpp
17
main.cpp
@@ -1,17 +0,0 @@
|
||||
#include <iostream>
|
||||
#include "src/logger.cpp"
|
||||
|
||||
int main() {
|
||||
LoggerClass logger;
|
||||
logger.appName = "Test";
|
||||
logger.pathToLogFiles = "/home/jam/local-gitea/CPlusPlus/logging/";
|
||||
logger.logLevel=0;
|
||||
|
||||
logger.debug("YA SMOG STROKU PEREDAT'");
|
||||
logger.info("YA SMOG STROKU PEREDAT'");
|
||||
logger.warn("YA SMOG STROKU PEREDAT'");
|
||||
logger.error("YA SMOG STROKU PEREDAT'");
|
||||
logger.critical("YA SMOG STROKU PEREDAT'");
|
||||
|
||||
return 0;
|
||||
}
|
||||
102
src/logger.cpp
102
src/logger.cpp
@@ -1,102 +0,0 @@
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <time.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
enum LogLevels {
|
||||
DEBUG,
|
||||
INFO,
|
||||
WARN,
|
||||
ERROR,
|
||||
CRITICAL
|
||||
};
|
||||
|
||||
class LoggerClass {
|
||||
public:
|
||||
std::string appName;
|
||||
std::string pathToLogFiles = "/var/log/" + appName;
|
||||
int logLevel;
|
||||
|
||||
void debug(const std::string& message) {
|
||||
action(LogLevels::DEBUG, message);
|
||||
}
|
||||
|
||||
void info(const std::string& message) {
|
||||
action(LogLevels::INFO, message);
|
||||
}
|
||||
|
||||
void warn(const std::string& message) {
|
||||
action(LogLevels::WARN, message);
|
||||
}
|
||||
|
||||
void error(const std::string& message) {
|
||||
action(LogLevels::ERROR, message);
|
||||
}
|
||||
|
||||
void critical(const std::string& message) {
|
||||
action(CRITICAL, message);
|
||||
}
|
||||
|
||||
private:
|
||||
std::string filepath = "";
|
||||
bool openLogFileFailed = false;
|
||||
|
||||
void action(int logLevel, const std::string message) {
|
||||
std::string line;
|
||||
time_t nowTime = time(NULL);
|
||||
struct tm *now = localtime(&nowTime);
|
||||
char str[20];
|
||||
strftime(str, sizeof(str), "%T", now);
|
||||
std::string logLevelStr;
|
||||
|
||||
switch (logLevel) {
|
||||
case DEBUG: logLevelStr = std::string("DEBUG"); break;
|
||||
case INFO: logLevelStr = std::string("INFO"); break;
|
||||
case WARN: logLevelStr = std::string("WARN"); break;
|
||||
case ERROR: logLevelStr = std::string("ERROR"); break;
|
||||
case CRITICAL: logLevelStr = std::string("CRITICAL"); break;
|
||||
default: logLevelStr = std::string("UNKNOWN"); break;
|
||||
};
|
||||
line = appName + " - " + std::string(str) + " - [" + logLevelStr + "] " + message + "\n";
|
||||
if (logLevel > 2) {
|
||||
print(line);
|
||||
}
|
||||
else {
|
||||
printErr(line);
|
||||
}
|
||||
addToFile(line);
|
||||
}
|
||||
|
||||
void print(const std::string& message) {
|
||||
std::cout << message;
|
||||
}
|
||||
void printErr(const std::string& message) {
|
||||
std::cerr << message;
|
||||
}
|
||||
|
||||
void addToFile(const std::string& message) {
|
||||
if (filepath == "") {
|
||||
filepath = pathToLogFiles + "/" + appName + " " + getDateString() + ".log";
|
||||
}
|
||||
|
||||
if (!openLogFileFailed) {
|
||||
ofstream logFile;
|
||||
logFile.open(filepath, std::ios_base::app);
|
||||
if (logFile.is_open()) {
|
||||
logFile << message;
|
||||
}
|
||||
else { openLogFileFailed = true; }
|
||||
logFile.close();
|
||||
}
|
||||
}
|
||||
|
||||
const std::string getDateString() {
|
||||
time_t nowTime = time(NULL);
|
||||
struct tm *now = localtime(&nowTime);
|
||||
char str[12];
|
||||
strftime(str, sizeof(str), "%Y-%m-%e", now);
|
||||
return std::string(str);
|
||||
}
|
||||
|
||||
};
|
||||
5
src/main.cpp
Normal file
5
src/main.cpp
Normal file
@@ -0,0 +1,5 @@
|
||||
#include <iostream>
|
||||
|
||||
int main() {
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user