debug

https://github.com/MindShow/USBDisplay/blob/main/WinDows/MSDisplay_MultiDev_v1.0.0.18.0.exe
7BE04791DF7CC79FC8427098BF9E3C11206E54D2D613D470E4B4D5855451E816

```c:aaa.c
// check.c(プロダクトコード）
#include    <stdio.h>
#include    "check.h"
#include    "sum.h"
#include    "../test/debug.h"

#ifdef __cplusplus
extern "C" {
#endif

#include    "../test/test.h"

// __DECL__を使用する <S>
DECL_STUB(static, int, check, (int a, int b, int c));
extern int sum(int a, int b);
// __DECL__を使用する <E>

// プロトタイプ宣言
static  int check(int a, int b, int c);

static  int check(int a, int b, int c) {
    int result = 0;
    int sum_ret = 0;
    sum_ret = sum(a, b);
    if (sum_ret == c) {
        result = 1;
    } else {
        result = 0;
    }

    return result;
}

#ifdef __cplusplus
}
#endif
```

```c:sample.c
#ifdef _DEBUG
#define TRACE(s) if (fp_log != NULL) fprintf(fp_log, s);
#else
#define TRACE(s)
#endif

#ifdef _DEBUG
#include "utf8util.h"
#endif
#include "PAC/pacHardware.h"
#include "config/OpcUaIni.h"

#if defined(__QNX__)
#if defined(QNX7_OR_LATER)
        // QNX7.1 64bit pthread_self() return value pthread_t --> 32bit
#define DEBUG_FMT   "%s|%08X* %s"
#else   // QNX7_OR_LATER
        // QNX6.5 32bit pthread_self() return value pthread_t --> 32bit
#define DEBUG_FMT   "%s|%04X* %s"
#endif  // QNX7_OR_LATER
#elif defined(__linux__)
        // Linux 64bit pthread_self() return value pthread_t --> 64bit
#define DEBUG_FMT   "%s|%016lX* %s"
#else   // QNX/linux
#error Linux 32-bit not supported.
#endif  // QNX/linux

namespace
{
static bool enableTrace = false;
static bool printTime = false;
}

void TraceOutput::print(const char* format, ...)
{
    if (enableTrace)
    {
        va_list args;
        va_start(args, format);
        vfprintf(stdout, format, args);
        va_end(args);
    }
}

void TraceOutput::trace(const char* format, ...)
{
    if (enableTrace)
    {
        char buff[4096];
        va_list args;
        va_start(args, format);
        vsnprintf(buff, 4096, format, args);
        va_end(args);
        if (printTime)
        {
#if defined(DEBUG_FMT)
            fprintf(stdout, DEBUG_FMT, UaDateTime::now().toTimeString().toUtf8(), pthread_self(), buff);
#endif // DEBUG_FMT
        }
        else
        {
            fputs(buff, stdout);
        }
    }
}
```gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04) 
```json:launch.json
{
	"version": "0.2.0",
	"configurations": [
	{
		"name": "(gdb) 起動",
		"type": "cppdbg",
		"request": "launch",
		"program": "${workspaceFolder}/build/test/UnitTestExecutor",
		"args": [],
		"stopAtEntry": false,
		"cwd": "${fileDirname}",
		"environment": [],
		"externalConsole": false,
		"MIMode": "gdb",
		"setupCommands": [
			{
				"description": "gdb の再フォーマットを有効にする",
				"text": "-enable-pretty-printing",
				"ignoreFailures": true
			},
			{
				"description":  "逆アセンブリ フレーバーを Intel に設定",
				"text": "-gdb-set disassembly-flavor intel",
				"ignoreFailures": true
			}
		]
	}
	]
	// IntelliSense を使用して利用可能な属性を学べます。
	// 既存の属性の説明をホバーして表示します。
	// 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
	// "version": "0.2.0",
	// "configurations": [
	// 	{
	// 		"type": "lldb",
	// 		"request": "launch",
	// 		"name": "Debug",
	// 		"program": "${workspaceFolder}/build/test/UnitTestExecutor",
	// 		"args": [],
	// 		"cwd": "${workspaceFolder}"
	// 	}
	// ]
}
```
```json:tasks.json
{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: clang-10 アクティブなファイルのビルド",
            "command": "/usr/bin/clang-10",
            "args": [
                "-fcolor-diagnostics",
                "-fansi-escape-codes",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "デバッガーによって生成されたタスク。"
        }
    ],
    "version": "2.0.0"
}
```

# Purpose

gitでブランチ管理した人向けの環境提供。  

## Branches

master ... svn-mirrorとdevelop-xxxの統合ブランチ。  
svn-mirror ... svnと同期しているブランチ  
develop-xxx ... 機能ごとのブランチ。xxxは適当な名前を付けてください。  

## Branches Operation

### svnの取り込み
svn-mirrorは、適当なタイミング(１日一回など)でsvnのコードを反映する。  
masterにsvn-mirrorを適当なタイミングでマージする。  

### 開発用ブランチの作成
develop-xxxを作成して機能追加や個別対応を行う。  
develop-xxxはmasterからブランチする。  
develop-xxxをmasterからブランチする前には、masterにsvn-mirrorをマージする。  

### svnへのコミット
develop-xxxでの開発が完了したら、masterへのマージとsvnへコミットする。  
適宜masterにsvn-mirrorをマージし、svnへのコミットはdevelop-xxxで開発した対象のみとなるようにすること。  

## Directory Structure

```
git-repositoryi-root
  src
    branches
      nextgen ... from svn(*1)
    R_0
      UnifiedAutomation
        1.7.4 ... from svn(*2)
```
Note1:以下よりミラーする  
http://10.6.132.49/svn/NEX/branches/NEX_CPU/Develop/OPCUA/branches/nextgen  

Note2:以下よりミラーする  
http://10.6.132.49/svn/NEX/branches/NEX_CPU/Develop/OPCUA/R_0/UnifiedAutomation/1.7.4  

## How To Put SVN and GIT

svnとgitをローカルの同一フォルダに配置する方法。  

1.gitリポジトリをローカルにチェックアウトする。  
2."Directory Structure"で示したsvnミラー対象を1とは異なるローカルの適当な場所にチェックアウトする。  
3.2でチェックアウトした.svnを"Directory Structure"で示したsvnミラー場所に配置する。  
4.svnをupdateする。  

## Misc

### gitの設定
以下は必須。

```shell
git config [--global] user.name {OpenLDAPのユーザ名}
git config [--global] user.email {emailアドレス}
git config [--global] core.autocrfl false // 改行コード変換しない
```

```cmake
cmake_minimum_required(VERSION 3.5.1)
project(hello)
 
if(MSVC)
    string(REPLACE "/W3" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4 /EHsc")
    set(CMAKE_CXX_FLAGS_DEBUG   "${CMAKE_CXX_FLAGS_DEBUG}   /DBUILD_TYPE=\\\"Debug\\\"")
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /DBUILD_TYPE=\\\"Release\\\"")
else()
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11")
    set(CMAKE_CXX_FLAGS_DEBUG   "${CMAKE_CXX_FLAGS_DEBUG}   -DBUILD_TYPE=\\\"Debug\\\"")
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DBUILD_TYPE=\\\"Release\\\"")
endif()
 
add_executable(hello hello.cpp)
```
https://kamino.hatenablog.com/entry/cmake_tutorial3

5.3. コマンドラインからキャッシュ変数を指定する
CMakeではConfigure時に-Dオプションを付けることでキャッシュ変数の値を上書きすることができます。

先ほど作成したCMakeLists.txtを以下のコマンドでConfigureし直してみましょう。
```
cmake .. -DMY_VARIABLE_B="fugafuga"
```
CMakeではオプションの後のスペースを省略できるので以下の2つは同じ意味を持ちます。
```
-DMY_VARIABLE_B="fugafuga"
-D MY_VARIABLE_B="fugafuga"
```
キャッシュ変数の数が多くなるとコマンドがどんどん長くなるので、スペースは省略することが多いです。

さて、このコマンドでConfigureを実行すると実行結果が以下のように変わっているはずです。
```
-- MY_VARIABLE_A : hogehoge
-- MY_VARIABLE_B : fugafuga
MY_VARIABLE_B contains 'fuga'
-- Configuring done
-- Generating done
```
キャッシュ変数の中身がhogehogeからfugafugaに上書きされ、if文の分岐によりMY_VARIABLE_B contains 'fuga'が表示されています。 ここでもう一度、オプションなしでConfigureを実行してみましょう。

cmake ..
上書きされたキャッシュ変数の値はCMakeCache.txtの中に保存されているので、再びオプションなしでConfigureを実行しても値はfugafugaのままです。 Configureの際にset(MY_VARIABLE_B ${MY_VARIABLE_A} ...)が呼び出されはするものの、このコマンドは作成済みのキャッシュ変数は上書きしません（もちろんCMakeCache.txtを削除してから再度Configureするとhogehogeに戻ります）。

つまりこの状態でGenerateを行えばMY_VARIABLE_BにfugafugaがセットされたものとしてCMakeスクリプトが実行され、プロジェクトファイルが作成されます。 キャッシュ変数の値をうまく利用するようなCMakeLists.txtを書いておけば、ユーザーが後からキャッシュ変数を通してプロジェクトの設定を調整できるようになるというわけです。

https://github.com/MindShow/USBDisplay/blob/main/WinDows/MSDisplay_MultiDev_v1.0.0.18.0.exe
7BE04791DF7CC79FC8427098BF9E3C11206E54D2D613D470E4B4D5855451E816