ZYNQのLinuxアプリをVSCodeでビルドする方法

VSCodeを使ってZYNQのLinuxで動くプログラムをビルドし、さらにデバッグまですることができたので、そのやり方を紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/108d14d7-2616-dd67-0113-4be5e3a5efe3.png)

# 用意するもの
* Linuxが動くZYNQのボード ([Cosmo-Z](https://cosmoz.jp/) とか **[Zynqberry](https://www.trenz.jp/aboutzynqberry.html)** とか・・)
* VSCode と C/C++拡張
* LAN接続。sambaでファイル共有すると便利
* ZYNQ上で動作するgdbserver
* XILINX SDK (XSDK)

# VSCodeのインストールとC/C++拡張
まずVSCodeをインストールし、C/C++拡張ｗインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/248b22da-a1e9-4eab-3631-a0b2a5d0c4af.png)
特に説明は不要かと思います。

# XILINX SDKのインストール
ZYNQで動くLinuxに入っているGLIBCのバージョンが2.19とかならXSDK2018.3以前を、2.27とかならXSDK2019.1以降を選びます。
ややこしいのですが、詳しくは 「**[XILINX SDKをアップデートしたらGLIBCのバージョン相違で動かない](http://nahitafu.cocolog-nifty.com/nahitafu/2020/08/post-d9a17a.html)**」 を参照してください。
熱心なXILINXユーザならいろんなバージョンのツールが入っているから大丈夫だと思います。

# プロジェクトのフォルダを作ってVSCodeで開く
VSCodeで作業するためのフォルダを作り、VSCodeでOpen Folderで開きます。
ここでは `D:\naitou\vstest` としておきます。

# C/C++ファイルの設定をする
私自身がVSCodeを使い始めて間もないのでよくわかっていませんが、CTRL+SHIFT+Pでプルダウンが開いたら、C++と打って、`C/C++: Edit Confiturations (UI)`を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/3c63950a-2a88-649e-0aa5-9a132ed106f7.png)

C/C++拡張の設定が開くので、構成名のところにArmLinuxとか適当な名前を付けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/6022c7b2-b2dd-9a7a-6bdb-de1d29dadb20.png)

コンパイラパスには、XSDKのarm-linux-gnueabihf-gcc.exeへのパスを指定します。
私の環境では `D:\Xilinx\SDK\2018.3\gnu\aarch32\nt\gcc-arm-linux-gnueabi\bin\arm-linux-gnueabihf-gcc.exe` です。ターゲットのLinuxのGLIBCのバージョンに合わせてXSDKのバージョンを変えてください。

IntelliSenseモードをlinux-gcc-armにして、インクルードパスには、XSDKのディレクトリの中のincludeパスを指定しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/3bc6af57-6cdb-8c56-d048-11d051fb34b3.png)

`D:/Xilinx/SDK/2018.3/gnu/aarch32/nt/gcc-arm-linux-gnueabi/arm-linux-gnueabihf/libc/usr/include/**`

これで.vscodeフォルダの中にc_cpp_properties.json というファイルが作られているはずです。

```c_cpp_properties.json
{
    "configurations": [
        {
            "name": "ArmLinux",
            "includePath": [
                "${workspaceFolder}/**",
                "D:/Xilinx/SDK/2018.3/gnu/aarch32/nt/gcc-arm-linux-gnueabi/arm-linux-gnueabihf/libc/usr/include/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "windowsSdkVersion": "10.0.19041.0",
            "compilerPath": "D:/Xilinx/SDK/2018.3/gnu/aarch32/nt/gcc-arm-linux-gnueabi/bin/arm-linux-gnueabihf-gcc.exe",
            "cStandard": "c17",
            "cppStandard": "c++17",
            "intelliSenseMode": "linux-gcc-arm"
        }
    ],
    "version": 4
}
```

これはコード補完や、テキストエディタ上でのWarningを出すための設定なので、実際に使われるコンパイラとは違っていてもいいのだと思います。

# タスクの設定
次に、VSCodeに戻って`CTRL+SHIFT+P`を押し`build`と打ちます。候補が出てくるので`Tasks:Configure Default Buld Task`を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/0e482768-5712-2b8f-e72f-fe8a45302e2f.png)

この時点ではcl.exeを使うものが出てくるので、それを選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/7f7688b3-56d0-e81f-1535-2a3177d9eda9.png)
そうしたら、tasks.jsonがcl.exeを使うように出来ているのでいったん全部消して、gccを使うように変更します。

```tasks.json
{
    // tasks.json 形式の詳細についての資料は、
    // https://go.microsoft.com/fwlink/?LinkId=733558 をご覧ください
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "Build by ARM g++",
            "command": "D:/Xilinx/SDK/2018.3/gnu/aarch32/nt/gcc-arm-linux-gnueabi/bin/arm-linux-gnueabihf-g++.exe",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.elf"
            ],
            "options": {
                "cwd": "D:/Xilinx/SDK/2018.3/gnu/aarch32/nt/gcc-arm-linux-gnueabi/bin"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}
```

commandのパスはXSDKをインストールしたフォルダに合わせてください。cwdは${workspaceFolder}でもいいかもしれません。

# 適当なプログラムを書く
ファイルを新規作成して、ビルドしましょう。

```test.cpp
#include <stdio.h>

int main() {
	printf("Hello World, Zynq!\n");
	for(int i = 0 ; i < 100 ; i++)
	{
		printf("%d\n" , i);
	}
	return 0;
}
```

# ビルド
VSCodeでCTRL+SHIFT+Bを押すとtasks.jsonに書かれたタスクのうち、

```
"group": {
    "kind": "build",
    "isDefault": true
}
```

が指定されたタスクが実行されます。今回は"Build by ARM g++"というタスクで、"command"で指定されたg++のプログラムが実行されます。VSCodeの下段にあるTerminalにビルド結果が表示されます。コンパイルエラーもここに表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/8a724af2-49c9-1356-2846-7d7f25cb556a.png)

# 実行
出来上がったプログラム、test.elf ををZYNQのLinuxに転送します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/3f55ae21-d37d-bb44-6d01-e7e425ef5d36.png)

SCPとか意識高いコマンドを使ってもいいですが、私はsambaで共有させておいてWindowsのExplorerでファイルコピーするのが好きです。もしくはZYNQ Linux上にsambaで共有するフォルダを作って、その上にVSCodeにプロジェクトフォルダを作ってもいいかもしれませんね。

そして、Linuxにログインしたら実行してみましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/e9f6a925-5e3c-4a71-8f3f-335a3cf95d3a.png)

# まとめ
c_cpp_properties.json にはファイルの属性などが書かれる。
tasks.json にはビルドするためのコマンドの起動方法が書かれる。

## 感想
はじめてVSCodeでエディタ以上の使い方をしてみようと思ったのですが、無事に動いてよかったです。
これでもうXSDKやVitisのEclipse環境から抜けられるかも！？

↓↓↓↓↓↓↓↓ 続く
**[デバッグ編に続く](https://qiita.com/nahitafu/items/d839680d8ae594a678d2)**
↑↑↑↑↑↑↑↑ 続く