2019年1月31日木曜日

Renesas V850 GCC を 64bit Linux でビルドする

Renesas V850 64bit Linux版gccコンパイラ - Qiitaの追試をしようと思ったのだけど、前回の差分を見るに、特にコード修正しなくても対応できそうなので試した。

結果、コード修正なしでも athrill のサンプルがビルドできるものが出来上がった。

環境

  • OS: Windows 10 Pro
  • docker: Docker version 18.09.1, build 4c52b90
  • 使ったコンテナ: debian:buster-slim

ubuntu:bionic, ubuntu:xenial でも同じ手順でビルドできるはず。

コンテナ起動

docker run -it --rm -v "$(pwd)\athrill:/athrill" debian:buster-slim

動作確認用に athrill のディレクトリをマウントしておく。

V850 ツールチェインビルド環境をととのえる

apt-get update
apt-get -y upgrade
apt-get install -y build-essential libgmp-dev libmpfr-dev libmpc-dev texinfo wget

必要なソースコードのダウンロードと展開

mkdir /toolchain
cd /toolchain
wget https://gcc-renesas.com/downloads/d.php?f=v850/binutils/14.01/binutils-2.24_v850_v14.01.tar.bz2 -O binutils-2.24_v850_v14.01.tar.bz2
tar xfv binutils-2.24_v850_v14.01.tar.bz2
mv binutils-2.24 /binutils
wget https://gcc-renesas.com/downloads/d.php?f=v850/gcc/14.01/gcc-4.9.2_v850_v14.01.tar.bz2 -O gcc-4.9.2_v850_v14.01.tar.bz2
tar xfv gcc-4.9.2_v850_v14.01.tar.bz2
mv gcc-4.9.2 /gcc
wget https://gcc-renesas.com/downloads/d.php?f=v850/newlib/14.01/newlib-2.1.0_v850_v14.01.tar.bz2 -O newlib-2.1.0_v850_v14.01.tar.bz2
tar xfv newlib-2.1.0_v850_v14.01.tar.bz2
mv newlib-2.1.0 /newlib

最初は展開した場所を指定して configure したが、 make に失敗するのでルートに配置しなおすことにした。

binutils のビルド

mkdir -p /build/binutils
cd /build/binutils
../../binutils/configure --target=v850-elf --prefix=/usr/local --enable-soft-float
make CFLAGS="-Wno-cast-function-type -Wno-implicit-fallthrough -Wno-shift-negative-value -Wno-unused-value -Wno-pointer-compare"
make install

gcc のビルド

mkdir -p /build/gcc
cd /build/gcc
../../gcc/configure --target=v850-elf --prefix=/usr/local --enable-languages=c,c++ --disable-nls --disable-multilib --disable-libssp --with-newlib --with-headers=/newlib/newlib/libc/include
# xenial なら make のみで OK.
make CXXFLAGS="-std=c++03"
make install

c++11 から invalid になった構文(?)が使われているらしく、デフォルト設定だとビルドできないため、 -std=c++03 を指定。

newlib のビルド

mkdir -p /build/newlib
cd /build/newlib
../../newlib/configure --target=v850-elf --prefix=/usr/local
make
make install

動作確認

cd /athrill/sample/barmetal/step2
make clean all
../../../bin/linux/athrill -c1 -m memory.txt -d device_config.txt -t 500 test_main.elf

OK.

あとは docker のマルチステージビルドでバイナリだけコピーすればいい感じになるのではないでしょうか? これは後でやる。

参考資料

更新履歴

日付 更新内容
2019/1/29 新規作成
2019/3/11 gcc のビルド時、『s/--with-header/--with-headers/ で target-libstdc++-v3 のビルドエラーは解消できる』という指摘を反映

2019年1月28日月曜日

Azure Container Registry を使う

前回に引き続き、 Azure Container Registry を使ってみる。

クイックスタートをなぞりつつ、そこに書かれていない情報確認コマンドや削除コマンドを試した感じ。

前提

  • Azure のアカウント取得は済み
  • Azure CLI 導入済み(microsoft/azure-cli を使用)

Azule CLI 用のコンテナ起動

Azure Container Registry に push したりするためには、 docker コマンドが必要なので、 docker 実行可能な設定でコンテナを起動し、 docker をインストールする。

Azure CLI 用のコンテナ起動

docker run -it --rm -v "/var/run/docker.sock:/var/run/docker.sock" microsoft/azure-cli

docke インストール

apk update
apk add docker

Azure へのログイン

az login

https://microsoft.com/devicelogin に接続し、 az login が出力した code をテキストフィールドに入力する。

リソースグループの作成

az group create --name FirstContainerRegistry --location japaneast

コンテナレジストリ作成

az acr create --resource-group FirstContainerRegistry --name Mikoto2000sFirstContainerRegistry --sku Basic

作成したコンテナレジストリへログイン

az acr login --name Mikoto2000sFirstContainerRegistry

コンテナレジストリの FQDN を取得

イメージを push するためには コンテナレジストリの FQDN が必要なのでそれをメモする。

az acr list --resource-group FirstContainerRegistry --query "[].{acrLoginServer:loginServer}" --output table

AcrLoginServer の値をメモ。

今回は mikoto2000sfirstcontainerregistry.azurecr.io であることが確認できた。

Azure Container Registry にプッシュするためのイメージを用意

docker pull microsoft/aci-helloworld

Azure Container Registry にプッシュ

Azure Container Registry にプッシュするためにタグ名を付けなおして push。

docker tag microsoft/aci-helloworld mikoto2000sfirstcontainerregistry.azurecr.io/aci-helloworld
docker push mikoto2000sfirstcontainerregistry.azurecr.io/aci-helloworld

プッシュ結果の確認

az acr repository list --name Mikoto2000sFirstContainerRegistry --output table

Resultaci-helloworld があるのが確認できる。

イメージのタグ確認

az acr repository show-tags --name Mikoto2000sFirstContainerRegistry --repository aci-helloworld --output table

Resultlatest があるのが確認できる。

push したイメージを使ってコンテナインスタンスを立ち上げる

本来であれば「サービスプリンシパル」というものを作ってアクセス制御をするものらしいが、 チュートリアルではルートユーザー的なものでログインして作ってしまうようだ。

ルートユーザー的なものの情報取得

まず、レジストリ管理者になる。

az acr update --name Mikoto2000sFirstContainerRegistry --admin-enabled true

レジストリ管理者のパスワードの確認。

az acr credential show --name Mikoto2000sFirstContainerRegistry --query "passwords[0].value"

パスワードが表示されるのでメモ。

コンテナデプロイ

コンテナインスタンスをデプロイする。

ユーザー名は Azure Container Registry 名、パスワードは先ほど取得した文字列とする。

az container create --resource-group FirstContainerRegistry --registry-username Mikoto2000sFirstContainerRegistry --registry-password <直前で表示されたパスワード> --name acr-instance --image mikoto2000sfirstcontainerregistry.azurecr.io/aci-helloworld --cpu 1 --memory 1 --dns-name-label aci-instance --ports 80

コンテナインスタンス情報を取得

az container show --resource-group FirstContainerRegistry --name acr-instance --query ipAddress.fqdn

FQDN が表示される。

コンテナインスタンスの動作確認

Web ブラウザで、先ほど表示された FQDN に接続する。

Welcome to Azure Container Instances! と表示されていれば OK.

コンテナインスタンス確認

az container list --resource-group FirstContainerRegistry --out table

今作ったコンテナインスタンスの情報が表示される。

コンテナインスタンスの削除

az container delete --resource-group FirstContainerRegistry --name acr-instance

ふたたび az container list ... をすると、コンテナインスタンスが消えているのが確認できる。

Azure Container Registry の確認

az acr list --resource-group FirstContainerRegistry --out table

作った Container Registry が表示される。

Container Registry の削除

az acr delete  --resource-group FirstContainerRegistry --name Mikoto2000sFirstContainerRegistry

ふたたび az acr list ... をすると、コンテナレジストリが消えているのが確認できる。

リソースグループの確認

az group list --out table

作成したリソースグループが確認できる。

リソースグループの削除

az group delete --name FirstContainerRegistry

ふたたび az group list ... すると、リソースグループが消えていることがわかる。

本格的に使うには、レジストリのアクセス制御について勉強する必要がありますね。

以上。

2019年1月27日日曜日

Azure Container Instances を使う

Azure Container Instances を使ってみる。

クイックスタートをなぞっただけ。

前提

  • Azure のアカウント取得は済み

Azure CLI の取得

Docker コンテナが用意されているのでそれを利用する。

docker pull microsoft/azure-cli

ログイン

az login

https://microsoft.com/devicelogin に接続し、 az login が出力した code をテキストフィールドに入力する。

リソースグループの作成

az group create --name FirstInstances --location japaneast
  • --name: リソースグループ名
  • --location: リソースグループが所属するロケーション

コンテナ起動

az container create --resource-group FirstInstances --name my-first-instance --image microsoft/aci-helloworld --dns-name-label first-instance --ports 80
  • --resource-group: リソースグループ名
  • --name: azure 内で表示されるコンテナ名
  • --image: デプロイするイメージ
  • --dns-name-label: コンテナのホスト名(FQDN が、<ここで指定した名前>.<location>.azurecontainer.io みたいになる)
  • --ports: 公開するポート

コンテナの状態確認

az container show --resource-group FirstInstances --name my-first-instance --query "{FQDN:ipAddress.fqdn,ProvisioningState:provisioningState}" --out table
  • コマンド
    • --resource-group: リソースグループ名
    • --name: コンテナ名
    • --query: 何を出力するかの指定
    • --out: 出力形式
  • 結果
    • FQDN: デプロイしたコンテナの FQDN
    • ProvisioningState: コンテナデプロイ処理結果

動作確認

ブラウザで FQDN に接続する。

Welcome to Azure Container Instances! と表示されれば OK.

コンテナログ取得

az container logs --resource-group FirstInstances --name my-first-instance

コンテナ削除

az container delete --resource-group FirstInstances --name my-first-instance

削除確認

az container list --resource-group FirstInstances --out table

リソースグループの削除

az group delete --name FirstInstances

以上。

2019年1月26日土曜日

TOPPERS cfg の 64 bit ビルドに挑戦した記録(その4 最適化なしのスタティックリンクバイナリを作った)

前回、セグフォのデバッグで絶望してあきらめたわけですが、 最適化なしなら正常動作するので、それでスタティックリンクバイナリを作りたい。

環境

  • OS: Windows 10 Pro
  • 使用する docker image: ubuntu:bionic

コンテナ起動

ダウンロードした cfg のディレクトリと、動作確認用に athrillのディレクトリをマウントして ubuntu:bionic コンテナを起動。

デバッグの可能性を考えてデバッグ用オプションもつけておく。

docker run -it --rm --cap-add=SYS_PTRACE --security-opt="seccomp=unconfined" -v "$(pwd)\cfg:/cfg" -v "$(pwd)\athrill:/athrill" ubuntu:bionic

必要なパッケージのダウンロード

いつものやつ。

apt-get update
apt-get -y upgrade
apt-get install -y g++ make libboost-dev libboost-regex-dev libboost-system-dev libboost-filesystem-dev libboost-program-options-dev libxerces-c-dev

ビルド

スタティックビルドをしたいので、Makefile.configOPTION-static を設定。

cd /cfg
./configure --with-libraries=/usr/lib/x86_64-linux-gnu --with-xml
sed -i -e 's/OPTIONS=/OPTIONS=-static/' Makefile.config
make

おや失敗だ。ビルドログ抜粋は以下。

...(略)
(.text._ZN12_GLOBAL__N_14pool4freeEPv.constprop.2+0x1d): undefined reference to `pthread_mutex_lock'
collect2: error: ld returned 1 exit status
...(略)
Makefile:45: recipe for target 'cfg' failed
make[1]: *** [cfg] Error 1
make[1]: Leaving directory '/cfg/cfg'
Makefile:35: recipe for target 'cfg' failed
make: *** [cfg] Error 2

pthred のリファレンスが無い? -static 付けただけでこういうことになるものなんですかね? とりあえず、 cfg のリンクをしているところに -lpthread を追加してリビルド。

sed -i -e "45,45 s/$/ -lpthread/" cfg/Makefile
make

ビルドログ。

...(略)
/usr/lib/x86_64-linux-gnu/libxerces-c.a(CurlNetAccessor.o): In function `xercesc_3_2::CurlNetAccessor::~CurlNetAccessor()':
(.text+0xca): undefined reference to `curl_global_cleanup'
...(略)
collect2: error: ld returned 1 exit status
Makefile:45: recipe for target 'cfg' failed
make[1]: *** [cfg] Error 1
make[1]: Leaving directory '/cfg/cfg'
Makefile:35: recipe for target 'cfg' failed
make: *** [cfg] Error 2

curl ?なんでそんなものが必要なんだと思ったら、 xerces-clibcurl を要求しているのか...。

元の cfg で要求していないということは、 xerces-c のビルドオプションで curl 有無を変更できるのではないかと思って調べたら、その通りだったっぽい。

ということで xerces-c のソースをダウンロードして、 curl がいらないビルドオプションでビルドする。

Xerces の入手とビルド

Build Instructions を見ながら、「ネットワーク無効」「共有ライブラリ無効」の configure オプションを設定

apt-get install -y wget
mkdir /xerces
cd /xerces
wget http://ftp.meisei-u.ac.jp/mirror/apache/dist//xerces/c/3/sources/xerces-c-3.2.2.tar.bz2
tar xfv xerces-c-3.2.2.tar.bz2
mkdir build
cd build
../xerces-c-3.2.2/configure --prefix=/opt/local/xerces-c --disable-network --disable-shared
make
make install

cfg ビルド再挑戦

  1. apt でインストールした libxerces-c-dev を削除
  2. Makefile.config 修正
  3. make やりなおし
cd /cfg
apt-get remove -y libxerces-c-dev
sed -i -e 's/XERCES_DIR=\/usr\/include/XERCES_DIR=\/opt\/local\/xerces-c\/include/g' Makefile.config
sed -i -e 's/LIBXERCES_DIR=\/usr\/lib\/x86_64-linux-gnu/LIBXERCES_DIR=\/opt\/local\/xerces-c\/lib/g' Makefile.config
make

はい、エラー。ビルドログはこれ。

...(略)
/usr/lib/x86_64-linux-gnu/libicuuc.a(putil.ao): In function `uprv_dl_open_60':
(.text+0x1ce2): undefined reference to `dlopen'
...(略)

-ldl も必要? 追加して再チャレンジ。

sed -i -e "45,45 s/$/ -ldl/" cfg/Makefile
make

ビルドログ抜粋。

/usr/lib/x86_64-linux-gnu/libicuuc.a(putil.ao): In function `uprv_dl_open_60':
(.text+0x1ce2): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking

ワーニングがでつつもビルド自体は成功。

「そもそも dlopen 自体が動的リンクするための関数なので、このバイナリを作った glibc が無いと上手く共有ライブラリを読み込めないですよ」という感じ?

とりあえず、この環境と、 debian/buster-slim あたりで試してみる。

# スタティックリンク確認
file /cfg/cfg/cfg
# 共有ライブラリを参照していないことを確認
ldd /cfg/cfg/cfg

# バイナリをコピーして pass2 を動かしてみる
cp /cfg/cfg/cfg /athrill/sample/os/atk2-sc1_1.4.2/cfg/cfg/cfg
cd /athrill/sample/os/atk2-sc1_1.4.2/OBJ/
../cfg/cfg/cfg  --pass 2 --kernel atk2 -I. -I../include -I../arch -I.. -I../target/v850esfk3_gcc -I..//arch/v850esfk3_gcc -I..//arch/gcc -T ../target/v850esfk3_gcc/target.tf --api-table ../kernel/kernel.csv --cfg1-def-table ../kernel/kernel_def.csv --ini-file ../kernel/kernel.ini  --cfg1-def-table ..//arch/v850esfk3_gcc/prc_def.csv sample1.arxml ..//arch/v850esfk3_gcc/uart.arxml ../target/v850esfk3_gcc/target_hw_counter.arxml

この環境では OK.

ログは省略するが、 debian:buster-slim でもワンバイナリで問題なく動いた。

本日はここまで。

この記事を書いている間に、 cfg のソースが GitHub に公開されていることに気づいたので、ソース修正 PR 出してみようか。

xerces-c のミラーもあるし、 submodule 使ってソース取り込んだうえで、それ含めたビルドスクリプト作るというのもよさそうだ。

2019年1月24日木曜日

Renesas V850 64bit Linux版gccコンパイラの、本家との差分をとった

Renesas V850 64bit Linux版gccコンパイラ - Qiitaに、以下の記述があったので、公開されている変更後ソースコード本家のソースコードの差分をとってみた。

というわけで,ルネサスさんのサイトの binutilsを使用する方が良いと判断しました.
最初からそうすればよかったのですが,ルネサスさんのサイトのbinutilsはビルドエラーが発生するので,GNUサイトから取得していたという経緯があります.

いずれにせよ,発生したコンパイルエラーは,それほど難しいものではないので,強引に修正しビルドを通しました.本 binutilsを使用することで,bcond 問題も -msoft-float 問題も無事解決できました!

差分は以下の通り。

diff --git a/binutils/objcopy.c b/binutils/objcopy.c
index 14f6b96..e4ee7e6 100644
--- a/binutils/objcopy.c
+++ b/binutils/objcopy.c
@@ -1890,7 +1890,8 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
        /* Umm, not sure what to do in this case.  */
        debuglink_vma = 0x1000;
 
-         bfd_set_section_vma (obfd, gnu_debuglink_section, debuglink_vma);
+         int tmp = bfd_set_section_vma (obfd, gnu_debuglink_section, debuglink_vma);
+              if (tmp == FALSE) return 0;
        }
    }
     }
diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c
index 3377261..6d74846 100644
--- a/gas/config/obj-elf.c
+++ b/gas/config/obj-elf.c
@@ -1937,7 +1937,8 @@ obj_elf_init_stab_section (segT seg)
 
   /* Force the section to align to a longword boundary.  Without this,
      UnixWare ar crashes.  */
-  bfd_set_section_alignment (stdoutput, seg, 2);
+  int tmp = bfd_set_section_alignment (stdoutput, seg, 2);
+  if (tmp == FALSE) return;
 
   /* Make space for this first symbol.  */
   p = frag_more (12);
diff --git a/gas/config/tc-v850.c b/gas/config/tc-v850.c
index 8ac805b..5c4a029 100644
--- a/gas/config/tc-v850.c
+++ b/gas/config/tc-v850.c
@@ -238,7 +238,8 @@ do_v850_seg (int i, subsegT sub)
       bfd_set_section_flags (stdoutput, seg->s, seg->flags);
       if ((seg->flags & SEC_LOAD) == 0)
    seg_info (seg->s)->bss = 1;
-      bfd_set_section_alignment (stdoutput, seg->s, 2); 
+      int tmp = bfd_set_section_alignment (stdoutput, seg->s, 2); 
+      if (tmp == TRUE) return;
     }
 }
 
@@ -3747,7 +3748,8 @@ v850_md_end (void)
 
   note_sec = subseg_new (V850_NOTE_SECNAME, 0);
   bfd_set_section_flags (stdoutput, note_sec, SEC_HAS_CONTENTS | SEC_READONLY | SEC_MERGE);
-  bfd_set_section_alignment (stdoutput, note_sec, 2);
+  int tmp = bfd_set_section_alignment (stdoutput, note_sec, 2);
+  if (tmp == FALSE) return;
 
   /* Provide default values for all of the notes.  */
   for (id = V850_NOTE_ALIGNMENT; id <= NUM_V850_NOTES; id++)
diff --git a/gas/subsegs.c b/gas/subsegs.c
index 69f837b..2b90858 100644
--- a/gas/subsegs.c
+++ b/gas/subsegs.c
@@ -67,7 +67,8 @@ subseg_change (register segT seg, register int subseg)
     {
       seginfo = (segment_info_type *) xcalloc (1, sizeof (*seginfo));
       seginfo->bfd_section = seg;
-      bfd_set_section_userdata (stdoutput, seg, seginfo);
+      int tmp = bfd_set_section_userdata (stdoutput, seg, seginfo);
+      if (tmp == TRUE) return;
     }
 }
  
@@ -169,7 +170,8 @@ subseg_get (const char *segname, int force_new)
       secptr->output_section = secptr;
       seginfo = (segment_info_type *) xcalloc (1, sizeof (*seginfo));
       seginfo->bfd_section = secptr;
-      bfd_set_section_userdata (stdoutput, secptr, seginfo);
+      int tmp = bfd_set_section_userdata (stdoutput, secptr, seginfo);
+      if (tmp == TRUE) return secptr;
     }
   return secptr;
 }
diff --git a/gas/write.c b/gas/write.c
index 745abe6..f2887c3 100644
--- a/gas/write.c
+++ b/gas/write.c
@@ -362,8 +362,10 @@ record_alignment (/* Segment to which alignment pertains.  */
   if (seg == absolute_section)
     return;
 
-  if ((unsigned int) align > bfd_get_section_alignment (stdoutput, seg))
-    bfd_set_section_alignment (stdoutput, seg, align);
+  if ((unsigned int) align > bfd_get_section_alignment (stdoutput, seg)) {
+    int tmp = bfd_set_section_alignment (stdoutput, seg, align);
+    if (tmp == TRUE) return;
+  }
 }
 
 int
diff --git a/ld/ldlang.c b/ld/ldlang.c
index ba7f493..f12f258 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -4831,10 +4831,12 @@ lang_size_sections_1
               " section %s\n"), os->name);
 
        input = os->children.head->input_section.section;
-       bfd_set_section_vma (os->bfd_section->owner,
+       int tmp = bfd_set_section_vma (os->bfd_section->owner,
                     os->bfd_section,
                     bfd_section_vma (input->owner, input));
-       os->bfd_section->size = input->size;
+       if (tmp == TRUE) {
+           os->bfd_section->size = input->size;
+       }
        break;
          }
 
@@ -4916,9 +4918,10 @@ lang_size_sections_1
                 os->name, (unsigned long) (newdot - savedot));
          }
 
-       bfd_set_section_vma (0, os->bfd_section, newdot);
-
-       os->bfd_section->output_offset = 0;
+       int tmp = bfd_set_section_vma (0, os->bfd_section, newdot);
+       if (tmp == TRUE) {
+           os->bfd_section->output_offset = 0;
+       }
          }
 
        lang_size_sections_1 (&os->children.head, os,
diff --git a/opcodes/v850-dis.c b/opcodes/v850-dis.c
index 9433274..91cf998 100644
--- a/opcodes/v850-dis.c
+++ b/opcodes/v850-dis.c
@@ -434,7 +434,20 @@ disassemble (bfd_vma memaddr,
          info->fprintf_func (info->stream, "ep");
          break;
        case V850_OPERAND_SRG:
+#if 1
+{
+         if (value <= 31) {
+           info->fprintf_func (info->stream, "%s", v850_sreg_names[value]);
+         }
+         else {
+           char buf[128];
+           sprintf(buf, "unknown(%ld)", value);
+           info->fprintf_func (info->stream, "%s", buf);
+         }
+}
+#else
          info->fprintf_func (info->stream, "%s", v850_sreg_names[value]);
+#endif
          break;
        case V850E_OPERAND_REG_LIST:
          {

この修正が何を意味するのかは全く確認していないが、 その辺はおいおい見ていきましょう。

以上。

2019年1月21日月曜日

TOPPERS cfg の 64 bit ビルドに挑戦した記録(その3 セグフォを直したかった...)

最適化を有効にするとセグフォが出るのでそれを直したかったが失敗した。

gdb を使えば、セグフォした場所がわかるらしいのでやってみた。

docker で gdb を使う場合、セキュリティが低下するらしいので、今回は kanetugu2015/athrill_asp3 は使わずに、 ubuntu イメージを使って一からコンテナを作り直して作業を行った。

とりあえず、何をしたかを記録する。

docker コンテナの準備

今回作業するコンテナをダウンロード。

docker pull ubuntu:bionic

必要なファイルをマウントしつつ、コンテナを起動。

前回作った OBJ ディレクトリ内の成果物を丸ごと今回使う OBJ ディレクトリにコピーしたうえで、コンテナを実行する。

docker run -it --rm -v "$(pwd)\athrill:/athrill" -v "$(pwd)\cfg:/cfg" --cap-add=SYS_PTRACE --security-opt="seccomp=unconfined" ubuntu:bionic

前々回と同様に、 cfg ビルド環境を整える。 あと、 gdb も入れる。

apt-get update
apt-get upgrade
apt-get install -y gdb g++ make libboost-dev libboost-regex-dev libboost-system-dev libboost-filesystem-dev libboost-program-options-dev libxerces-c-dev

cfg のビルド

このコンテナで使うための cfg ビルドを行う。

最適化を有効にして、デバッグ情報付きビルドを行う。

cd /cfg
./configure --with-libraries=/usr/lib/x86_64-linux-gnu --with-xml
sed -i -e 's/OPTIMIZE = -O0/OPTIMIZE = -O2/' Makefile
sed -i -e 's/OPTIONS=/OPTIONS=-g3/' Makefile.config
make

cfg 実行

cp /cfg/cfg/cfg /athrill/sample/os/atk2-sc1_1.4.2/cfg/cfg/cfg
cd /athrill/sample/os/atk2-sc1_1.4.2/OBJ/
../cfg/cfg/cfg --pass 2 --kernel atk2 -I. -I../include -I../arch -I..  -I../target/v850esfk3_gcc -I..//arch/v850esfk3_gcc -I..//arch/gcc -T ../target/v850esfk3_gcc/target.tf --api-table ../kernel/kernel.csv --cfg1-def-table ../kernel/kernel_def.csv --ini-file ../kernel/kernel.ini  --cfg1-def-table ..//arch/v850esfk3_gcc/prc_def.csv sample1.arxml ..//arch/v850esfk3_gcc/uart.arxml ../target/v850esfk3_gcc/target_hw_counter.arxml

セグフォが出ることを確認できた。

gdb によるセグフォ箇所の特定

説明が難しいので、丸ごとログを載せることで済ます。 (気になる人は頑張って読み解いてください)

root@09f28b89344c:/athrill/sample/os/atk2-sc1_1.4.2/OBJ# gdb ../cfg/cfg/cfg
GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ../cfg/cfg/cfg...done.
(gdb) run --pass 2 --kernel atk2 -I. -I../include -I../arch -I..  -I../target/v850esfk3_gcc -I..//arch/v85
0esfk3_gcc -I..//arch/gcc -T ../target/v850esfk3_gcc/target.tf --api-table ../kernel/kernel.csv --cfg1-def
-table ../kernel/kernel_def.csv --ini-file ../kernel/kernel.ini  --cfg1-def-table ..//arch/v850esfk3_gcc/p
rc_def.csv sample1.arxml ..//arch/v850esfk3_gcc/uart.arxml ../target/v850esfk3_gcc/target_hw_counter.arxml
Starting program: /athrill/sample/os/atk2-sc1_1.4.2/cfg/cfg/cfg --pass 2 --kernel atk2 -I. -I../include -I
../arch -I..  -I../target/v850esfk3_gcc -I..//arch/v850esfk3_gcc -I..//arch/gcc -T ../target/v850esfk3_gcc
/target.tf --api-table ../kernel/kernel.csv --cfg1-def-table ../kernel/kernel_def.csv --ini-file ../kernel
/kernel.ini  --cfg1-def-table ..//arch/v850esfk3_gcc/prc_def.csv sample1.arxml ..//arch/v850esfk3_gcc/uart
.arxml ../target/v850esfk3_gcc/target_hw_counter.arxml
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
{ "EXEC kernel.tf"(),  }
{ "ASSOCIATE TASK"(),  }
{ "ASSOCIATE ISR"(),  }
{ "ASSOCIATE ALARM"(),  }
{ "ASSOCIATE SCHTBL"(),  }
{ "ISR CHECK"(),  }
{ "RESOURCE CHECK"(),  }
{ "TASK CHECK"(),  }
{ "EVENT CHECK"(),  }

{ "COUNTER CHECK"(),  }
{ "ALARM CHECK"(),  }
{ "SCHEDULETABLE CHECK"(),  }

{ "OUTPUT FILES"(),  }


Program received signal SIGSEGV, Segmentation fault.
boost::checked_delete<boost::spirit::classic::impl::object_with_id_base_supply<unsigned long> > (x=0x1)
    at /usr/include/boost/core/checked_delete.hpp:34
34          delete x;
(gdb) backtrace
#0  boost::checked_delete<boost::spirit::classic::impl::object_with_id_base_supply<unsigned long> > (
    x=0x1) at /usr/include/boost/core/checked_delete.hpp:34
#1  boost::detail::sp_counted_impl_p<boost::spirit::classic::impl::object_with_id_base_supply<unsigned lon
g> >::dispose (this=0x555555e2eac0) at /usr/include/boost/smart_ptr/detail/sp_counted_impl.hpp:92
#2  0x00005555555a2bea in boost::detail::sp_counted_base::release (this=0x555555e2eac0)
    at /usr/include/boost/smart_ptr/detail/sp_counted_base_std_atomic.hpp:110
#3  0x00007ffff61cc041 in __run_exit_handlers (status=0, listp=0x7ffff6574718 <__exit_funcs>,
    run_list_atexit=run_list_atexit@entry=true, run_dtors=run_dtors@entry=true) at exit.c:108
#4  0x00007ffff61cc13a in __GI_exit (status=<optimized out>) at exit.c:139
#5  0x00007ffff61aab9e in __libc_start_main (main=0x555555585ef0 <main(int, char**)>, argc=25,
    argv=0x7fffffffe498, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>,
    stack_end=0x7fffffffe488) at ../csu/libc-start.c:344
#6  0x000055555558737a in _start ()
(gdb)

... __run_exit_handlers とか boost::detail::sp_counted_base::release とか見えますね...。

どこかで作ったインスタンスのポインタがぶっ壊れて、プログラム終了時点(?)でセグフォとなって襲い掛かってきた感じ?

ちょっと追いかけられる気がしないですね。とりあえずあきらめる感じで。

以上、うーん残念。

athrill のミニマム docker image を作成する

docker image は、 kanetsugu2015/athrill_asp3 があるが、 athrill 本体以外もいろいろ入っていてでかい。

Dockerfile も公開されていないので、自分でミニマムな環境を作っていく。

環境

  • OS: Windows 10 Pro
  • docker: Docker version 18.09.1, build 4c52b90

必要な作業の確認

手作業での環境構築

ベースは debian:buster-slim で行きます。

docker pull debian:buster-slim
docker run -it --rm debian:buster-slim

以降は docker container 内での作業。

apt-get update
apt-get -y upgrade

# athrill のダウンロード・ビルドに使うパッケージたち
apt-get install make gcc git

# ソースのクローン
git clone https://github.com/tmori/athrill.git /athrill

# make
cd /athrill/trunk/src/build/target/linux_v850e2m/
make
cd /athrill/trunk/src/build/target/linux_v850esfk3/
make
cd /athrill/trunk/src/remote/remote_cui_client/
make -f Makefile.linux

動作確認

cd /athrill/sample/os/asp3/OBJ/
../../../../bin/linux/athrill2 -c1 -i -m memory.txt -d device_config.txt asp
...(略)

OK.

必要なファイル群の確認

athrill, athrill2, athrill_remote に必要なライブラリを特定する。

# ldd athrill
        linux-vdso.so.1 (0x00007ffc3871c000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f602747c000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f60272bb000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f602d43e000)
# ldd athrill2
        linux-vdso.so.1 (0x00007ffcb0fb4000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f0a84231000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0a84070000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f0a8997f000)
# ldd athrill_remote
        linux-vdso.so.1 (0x00007ffe5dfaf000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc57d2f2000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc57d131000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fc57d31e000)

この辺をコピーすればよいはず。 ...と思ったが、debian:buster-slim にはすべてそろっていた。

Dockerfile の作成

じゃぁ先ほどの手順を Dockerfile に落とし込んでいきます。

# ビルド環境を構築してビルド
FROM debian:buster-slim as build-env

LABEL maintainer "mikoto2000 <mikoto2000@gmail.com>"
LABEL version="d7db0e00cc67932a8385c56bebbfcf07a9f87b75"
LABEL description "athrill: d7db0e00cc67932a8385c56bebbfcf07a9f87b75"

RUN apt-get update && apt-get -y install \
    make \
    gcc \
    git \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

RUN git clone https://github.com/tmori/athrill.git /athrill \
    && cd /athrill \
    && git checkout d7db0e00cc67932a8385c56bebbfcf07a9f87b75 \
    && cd /athrill/trunk/src/build/target/linux_v850e2m/ \
    && make \
    && cd /athrill/trunk/src/build/target/linux_v850esfk3/ \
    && make \
    && cd /athrill/trunk/src/remote/remote_cui_client/ \
    && make -f Makefile.linux

# 実行環境を構築してビルド環境からバイナリをコピー
FROM debian:buster-slim

LABEL maintainer "mikoto2000 <mikoto2000@gmail.com>"
LABEL version="d7db0e00cc67932a8385c56bebbfcf07a9f87b75"
LABEL description "athrill: d7db0e00cc67932a8385c56bebbfcf07a9f87b75"

# build-env から必要なファイルをコピー
COPY --from=build-env \
    /athrill/bin/linux/athrill \
    /usr/local/bin
COPY --from=build-env \
    /athrill/bin/linux/athrill2 \
    /usr/local/bin
COPY --from=build-env \
    /athrill/bin/linux/athrill_remote \
    /usr/local/bin

ビルドします。

cd /PATH/TO/Dockerfile
docker build -t mikoto2000/athrill:20190121 .

しばらく待っているとイメージが出来上がるはず。

動作確認

cd /PATh/TO/athrill/sample/os/asp3/OBJ
docker run -it --rm -v "$(pwd):/asp3" --workdir "/asp3" mikoto2000/athrill:20190121 athrill -i -m memory.txt -d device_config.txt asp
...(略)

動いた、OK.

サイズ比較

> docker images
REPOSITORY                       TAG                 IMAGE ID            CREATED             SIZE
mikoto2000/athrill               20190121            fbdac9b0c9ef        8 minutes ago       71.5MB
kanetugu2015/athrill_asp3        ver4.0              e3faeec7fa1a        5 weeks ago         1.59GB

うん、いい感じじゃないでしょうか?

2019年1月19日土曜日

TOPPERS cfg の 64 bit ビルドに挑戦した記録(その2 ワーニングを消す)

前回からの続き。

順番的には、

  1. ワーニングをなくす
  2. 最適化を有効にしてもセグフォが起こらないようにする

という感じで進めれば良さそうですかね?

やっていきます。

ワーニングの確認

発生するワーニングは次の通り。

# make clean all
...(略)
In file included from component.cpp:52:0:
../../toppers/itronx/factory.hpp:81:12: warning: 'template<class> class std::auto_ptr' is deprecated [-Wdeprecated-declarations]
       std::auto_ptr< cfg1_out > create_cfg1_out( std::string const& filename ) const
            ^~~~~~~~
In file included from /usr/include/c++/7/memory:80:0,
                 from /usr/include/boost/config/no_tr1/memory.hpp:21,
                 from /usr/include/boost/smart_ptr/shared_ptr.hpp:23,
                 from /usr/include/boost/shared_ptr.hpp:17,
                 from ../../toppers/workaround.hpp:67,
                 from ../../toppers/macro_processor.hpp:53,
                 from component.cpp:45:
/usr/include/c++/7/bits/unique_ptr.h:51:28: note: declared here
   template<typename> class auto_ptr;
                            ^~~~~~~~
...(略)
factory.cpp: In function 'void toppers::oil::{anonymous}::set_object_vars(const cfg_obj_map&, toppers::macro_processor&)':
factory.cpp:164:60: warning: format '%llx' expects argument of type 'long long unsigned int*', but argument 3 has type 'uint64_t* {aka long unsigned int*}' [-Wformat=]
                 sscanf(value_str.c_str() , "0x%llx" , &temp);
                                                       ~~~~~^
...(略)
factory.cpp: At global scope:

...多いなぁ。

ぱっと見は、 auto_ptrsscanf のワーニングだけっぽい。

scanf のワーニング対応

%llxlong long unsigned int のためのプレースホルダだけど、 Linux 64bit の uint64_tlong unsigned int だから怒られているようだ。

ということは、 Linux 64bit の場合には %lx とするのが正解っぽい。

該当箇所確認

$ find ./ -type f \( -name "*.cpp" -or -name "*.hpp" \) -print0 | xargs -0 grep "llx"
./toppers/oil/factory.cpp:                sscanf(value_str.c_str() , "0x%llx" , &temp);
./toppers/oil/factory.cpp:                sscanf(value_str.c_str() , "0X%llx" , &temp);
./toppers/oil/factory.cpp:                sscanf(value_str.c_str() , "0x%llx" , &temp);
./toppers/oil/factory.cpp:                sscanf(value_str.c_str() , "0X%llx" , &temp);
./toppers/oil/oil_object.cpp:                                   (void)sscanf(obj->get_value().c_str() , "0x%llx" , &value);
./toppers/oil/oil_object.cpp:                                   (void)sscanf(obj->get_value().c_str() , "0X%llx" , &value);
./toppers/oil/oil_object.cpp:                                   (void)sscanf(obj->get_value().c_str() , "0x%llx" , &value);
./toppers/oil/oil_object.cpp:                                   (void)sscanf(obj->get_value().c_str() , "0X%llx" , &value);
./toppers/oil/oil_object.hpp:              return "%llx";
./toppers/oil/oil_object.hpp:              return "%llx";

./toppers/oil/factory.cpp./toppers/oil/oil_object.cppsed で置換するだけで良さそう。

sed -i -e 's/llx/lx/g' ./toppers/oil/factory.cpp
sed -i -e 's/llx/lx/g' ./toppers/oil/oil_object.cpp

scanf のワーニング対応版のビルド

cd /cfg
make clean all
cp /cfg/cfg/cfg /athrill/sample/os/atk2-sc1_1.4.2/cfg/cfg/
cd /athrill/sample/os/atk2-sc1_1.4.2/OBJ
make clean all

ビルドは成功したしコードジェネレートも通った。 diff でもコード差分は出なかったので多分大丈夫。

auto_ptr のワーニング対応

auto_ptr は非推奨となり、 unique_ptr に置き換えなければいけないようだ。

それでは置換しますか。

find ./ -type f \( -name "*.cpp" -or -name "*.hpp" \) -print0 | xargs -0 sed -i -e 's/std::auto_ptr/std::unique_ptr/g'

auto_ptr のワーニング対応版のビルド

エラーになった。

cfg3.cpp:234:55: error: no matching function for call to 'boost::shared_ptr<toppers::oil::checker>::shared
_ptr(std::unique_ptr<toppers::oil::checker>&)'
     std::tr1::shared_ptr< typename Factory::checker > chk( p_checker );
                                                       ^~~
In file included from /usr/include/boost/shared_ptr.hpp:17:0,
                 from /usr/include/boost/format/alt_sstream.hpp:21,
                 from /usr/include/boost/format/internals.hpp:23,
                 from /usr/include/boost/format.hpp:38,
                 from ../toppers/diagnostics.hpp:47,
                 from cfg3.cpp:39:
/usr/include/boost/smart_ptr/shared_ptr.hpp:673:5: note: candidate: template<class Y> boost::shared_ptr<T>
::shared_ptr(boost::shared_ptr<Y>&&, boost::shared_ptr<T>::element_type*)
     shared_ptr( shared_ptr<Y> && r, element_type * p ) BOOST_SP_NOEXCEPT : px( p ), pn()
     ^~~~~~~~~~

「型があってないよ、 boost::shared_ptr じゃないの?」って言われているっぽい。該当箇所を確認。

    std::unique_ptr< typename Factory::checker > p_checker( factory.create_checker() );
    std::tr1::shared_ptr< typename Factory::checker > chk( p_checker );

ここだけじゃよくわからないですね...。とりあえず言われた通り boost::shared_ptr に変えるか。

いや、他の定義は std::tr1::shared_ptr を使っているから、それに合わせるのが良さそう。

ということで該当箇所を std::tr1::shared_ptr に修正。

auto_ptr のワーニング対応版のビルド再挑戦

cd /cfg
make clean all
cp /cfg/cfg/cfg /athrill/sample/os/atk2-sc1_1.4.2/cfg/cfg/
cd /athrill/sample/os/atk2-sc1_1.4.2/OBJ
make clean all

OK.

これでワーニングもエラーも出なくなった。

これで最適化有効にしたらどうだろうと思って試したけどセグフォしました。

今回はここまで。

TOPPERS cfg の 64 bit ビルドに挑戦(多分その1になる)

とりあえず、 atk2-sc1 のバイナリ作成に成功する cfg バイナリの作成に成功したので作業記録を残す。

環境

  • OS: Windows 10 Pro
  • 使用する docker image: kanetugu2015/athrill_asp3:ver4.0

※ cfg のビルド自体は ubuntu イメージでもできるはず。あとで確認しなきゃ...。

必要なファイルのダウンロードと展開

TOPPERSプロジェクトの cfg ダウンロードページ から、 1.9.6 をダウンロードして展開する。

文字コード、改行コード変換

テキストファイルが EUC, CRLF となっているので、 UTF-8, LF に変換する。

find ./ -type d -name ".git" -prune -or -type f -print0 | xargs -0 nkf -w -Lu --overwrite

ビルド環境を作成

docker を使ってビルド環境を作っていく。

docker run -it --rm -v "$(pwd):/cfg" kanetugu2015/athrill_asp3:ver4.0

docker コンテナ内の作業。

apt-get update
apt-get -y upgrade
apt-get install -y g++ make libboost-dev libboost-regex-dev libboost-system-dev libboost-filesystem-dev libboost-program-options-dev libxerces-c-dev

インストールされるライブラリのバージョンが cfg リリース時点のものと違いますね。 とりあえずこのままやっちゃいましょう。

ビルド

cd /cfg
./configure --with-libraries=/usr/lib/x86_64-linux-gnu --with-xml
make

はい。

g++ -O2  -DHAS_CFG_XML=1  -I/usr/include -I..  -c -o builtin_function.o builtin_function.cpp
In file included from ../toppers/macro_processor.hpp:55,
                 from builtin_function.cpp:46:
../toppers/text.hpp: In member function 'void toppers::basic_text<Container, CharT, Traits, Allocator>::init(const toppers::basic_text<Container, CharT, Traits, Allocator>::const_iterator&, const toppers::basic_te
xt<Container, CharT, Traits, Allocator>::const_iterator&)':
../toppers/text.hpp:731:25: error: 'next' is not a member of 'boost'
       std::copy( boost::next( first ).get_row(), last.get_row(), std::back_inserter( container_ ) );
                         ^~~~
../toppers/text.hpp:731:25: note: suggested alternative: 'get'
       std::copy( boost::next( first ).get_row(), last.get_row(), std::back_inserter( container_ ) );
                         ^~~~
                         get
...(略)

boost::next は、配置場所が変わったのでマイグレーションが必要らしいですね。

置換していきましょう。

boost::next 対応

使っているファイルの確認。

$ find ./ -type f -name "*.cpp" -or -name "*.hpp" -print0 | xargs -0 grep "boost/utility.hpp"
./cfg/cfg.hpp:#include <boost/utility.hpp>
./toppers/cpp.hpp:#include <boost/utility.hpp>
./toppers/csv.hpp:#include <boost/utility.hpp>
./toppers/text.hpp:#include <boost/utility.hpp>

この 4 つだけみたいですね、それじゃぁ置換します。

$ find ./ -type f -name "*.cpp" -or -name "*.hpp" -print0 | xargs -0 sed -i -e 's/boost\/utility.hpp/boost\/next_prior.hpp/'

ビルド再挑戦

make

はい。ワーニング出てますが、ビルド自体は成功しているっぽいので動作確認しましょうか。

動作確認

$ cp /cfg/cfg/cfg /athrill/sample/os/atk2-sc1_1.4.2/cfg/cfg/
$ cd /athrill/sample/os/atk2-sc1_1.4.2/OBJ
$ make
...(略)
{ "EXEC kernel.tf"(),  }
{ "ASSOCIATE TASK"(),  }
{ "ASSOCIATE ISR"(),  }
{ "ASSOCIATE ALARM"(),  }
{ "ASSOCIATE SCHTBL"(),  }
{ "ISR CHECK"(),  }
{ "RESOURCE CHECK"(),  }
{ "TASK CHECK"(),  }
{ "EVENT CHECK"(),  }

{ "COUNTER CHECK"(),  }
{ "ALARM CHECK"(),  }
{ "SCHEDULETABLE CHECK"(),  }

{ "OUTPUT FILES"(),  }

Makefile:340: recipe for target 'Os_Lcfg.timestamp' failed
make: *** [Os_Lcfg.timestamp] Segmentation fault

oh...。セグフォか...。ワーニング消していかなきゃダメですかね?

とりあえず、最適化外してみる。

最適化を外す

sed -i -e 's/OPTIMIZE = -O2/OPTIMIZE = -O0/' Makefile

最適化なしでのビルド

cd /cfg
make clean all

最適化なしでの実行

$ cp /cfg/cfg/cfg /athrill/sample/os/atk2-sc1_1.4.2/cfg/cfg/
$ cd /athrill/sample/os/atk2-sc1_1.4.2/OBJ
$ make clean all
...(略)
v850-elf-objcopy -O srec -S atk2-sc1 atk2-sc1.srec
../cfg/cfg/cfg --pass 3 --kernel atk2 -I. -I../include -I../arch -I..  -I../target/v850esfk3_gcc -I..//arc
h/v850esfk3_gcc -I..//arch/gcc \
                        --rom-image atk2-sc1.srec --symbol-table atk2-sc1.syms \
                        -T ../target/v850esfk3_gcc/target_check.tf --api-table ../kernel/kernel.csv --cfg1
-def-table ../kernel/kernel_def.csv --ini-file ../kernel/kernel.ini  --cfg1-def-table ..//arch/v850esfk3_g
cc/prc_def.csv sample1.arxml ..//arch/v850esfk3_gcc/uart.arxml ../target/v850esfk3_gcc/target_hw_counter.a
rxml
v850-elf-objdump -d atk2-sc1 > atk2-sc1.dump

ふむ、成功しました。

手順は省略するけど athrill での実行もできました。

とりあえず今回はここまで。

最適化かけたときだけ落ちるって...、これどういうアプローチしていこうかしら?

2019年1月16日水曜日

XML エディタ機能だけの Eclipse IDE 環境を構築する

前提

  • スキーマ対応の XML エディタを使いたい
  • 無料で使えるスキーマ対応の XML エディタが少ない。見つけた中では次の 2 つ
  • 機能的にはどちらも必要十分だが、Eclipse のほうが他開発ツールとの連携に便利そうなのでそっちをつかってみる
  • まずはできるだけ軽い状態で XML ファイルをエディットしたいので、 XML エディタ機能だけの Eclipse IDE 環境を構築する

環境

  • OS: Windows 10 Pro
  • 今回使う Eclipse: eclipse-platform-4.10

Eclipse Platform のダウンロード・配置

  1. https://www.eclipse.org/ にアクセス
  2. Download -> Download Packages -> Other builds -> 4.10 -> eclipse-platform-4.10-win32-x86_64.zip -> Download と選択していく
  3. zip ファイル内の eclipse ディレクトリを任意の場所に配置する

これで、開発ツール類が何も入っていない Eclipse IDE 環境の準備ができた。

Eclipse に Eclipse XML Editors and Tools をインストール

  1. eclipse.exe を起動
  2. 適当に、仮のワークスペースを設定
  3. メニューの Help -> Install New Software...
  4. Available Software ダイアログが開く
    1. Work with: 2018-12 - http://download.eclipse.org/releases/2018-12
    2. type filter text: XML Editor
    3. Programming Languages/Eclipse XML Editors and Tools にチェック
    4. Next > 押下
  5. Install Details を確認して Next > 押下
  6. ライセンスを確認して I accept the terms of the license agreement を選択、 Finish 押下
  7. バックグラウンドでインストールが進む
  8. インストールが完了すると、Software Updates ダイアログが表示されるので Restart Now を押下

これで、 XML ツールのみがインストールされた Eclipse IDE 環境ができた。

以上。

2019年1月3日木曜日

docker-compose で Upsource を試す - 起動からJavaプロジェクト作成まで

使いこなすには至っていないけれど、起動から Java プロジェクト作成と Code Intelligence の有効化までやったので手順をメモ。

レビュー機能とかには今回触れません。

環境

  • OS: Windows 10 Pro
  • docker: Docker version 18.09.0, build 4d60db4
  • docker-compose: docker-compose version 1.23.2, build 1110ad01
  • 使用イメージ

事前準備

docker-compose ファイルを作る

version: '3'
services:
    upsource:
        image: jetbrains/upsource:2018.2.1141
        volumes:
            - upsource-data:/opt/upsource/data
            - upsource-conf:/opt/upsource/conf
            - upsource-logs:/opt/upsource/logs
            - upsource-backup:/opt/upsource/backups
        ports:
            - "8080:8080"
volumes:
    upsource-data:
        external: true
    upsource-conf:
        external: true
    upsource-logs:
        external: true
    upsource-backup:
        external: true

ボリュームを作る

docker volume create upsource-data
docker volume create upsource-conf
docker volume create upsource-logs
docker volume create upsource-backup

リポジトリを用意する

とりあえず、自分の GitHub の Java プロジェクトを食わせてみる。

mikoto2000/artags

これ、 DOM から SAX に変更したいんですよね...。

起動から初期設定まで

起動

docker-compose up -d

初回ログイン

http://localhost:8080 にアクセスすると、図1 の画面になる。

図1 初回ログイン画

ログインボタンの直上の Show token location inside Docker container を押下して、 トークンファイルの場所を表示する。

そしたら docker-compose exec で立ち上げたコンテナに接続し、ファイルの内容を表示する。

docker-compose exec upsource cat /PATH/TO/wizard_token.txt

ファイルの内容を Token テキストフィールドに張り付けて Log in ボタンを押す。

初期設定

初期設定が終わると、図2 の画面になるので、 Set up のリンクを押す。

図2 初回起動画面

Confirm Settings

図3 の画面で Upsource サーバー設定を行う。

図3 Confirm Settings
  • (protocol): HTTP
  • Base URL: http://localhost:8080
  • Application Listen Port: 8080
  • Advanced Setting: Docker の Volume 設定を変更していた場合はそれに合わせて変更する
  • Send usage statistics anonymously: とりあえず使うだけなので OFF に

で、 Next ボタン押下。

Configure Hub Service

図4 で Hub Service のための設定を行う。

図4 Configure Hub Service
  • Hub service: Use Built-In Hub
  • Create Admin Login: admin
  • Create Admin Password: password
  • Repeat Password: password
  • Enable login as guest: OFF

で、 Next ボタン押下。

Confirm License

図5 でライセンスの設定を行う。

図5 Confirm License

お試しなのですべてデフォルトで OK, Finish ボタン押下。

図6, 7 のようにチクタク頑張ってくれるので待つ。

図6 設定中画面その1
図7 設定中画面その2

ユーザー作成

設定が完了したら図8のようなログイン画面になるので、 初期設定で作った admin ユーザーでログインし、ユーザー作成・ロールの追加を行う。 (図8, 9, 10, 11, 12, 13, 14, 15, 16, 17)

図8 ログイン画面
図9 ログイン後、ウェルカム画面
図10 管理画面アイコンを押下
図11 Users を選択
図12 New user... ボタンを押下
図13 Create user を押下
図14 ユーザー情報を入力して Create ボタン押下

今回入力するユーザー情報:

  • Full Name: Ohyuki Mikoto
  • Email: mikoto2000@gmail.com
  • Password: password
  • Confirm: password
  • Force changing password: チェックを入れる
図15 ロール画面へ

基本的にデフォルトで OK, 変更したいところがあれば修正する感じで。

図16 Grant role... ボタン押下
図17 Global な System Admin のロールを追加

今回入力するロール情報:

  • Role: System Admin
  • In project: Global

ロールとパーミッションの詳細は以下のページを参照。

作成したユーザーでプロジェクトを作成

admin ログアウト → mikoto2000 でログイン → artags プロジェクト作成 とやっていく。

今回は、 GitHub プロジェクトを参照する形でプロジェクトを作成する。 (図18, 19, 20, 21, 22, 23)

http://localhost:8080/ に接続しなおす。

図18 admin ログアウト
図19 作ったユーザーでログイン
図20 初回ログイン時のパスワード変更
図21 GitHup を利用したプロジェクト作成のためのリンクを押下
図22 必要情報を記述して Create project ボタン押下

今回入力したプロジェクト情報:

  • Repository URL: https://github.com/mikoto2000/artags
  • Authentication method: Anonymous

GitHub のリポジトリと密に連携したい場合には SSH key とか Token とか作っていろいろできるみたい。

図23 プロジェクト作成され、初期化が開始される

プロジェクトの Code Intelligence を有効にする

Code Intelligence を有効にすると、コードチェックして警告してくれるので、それをやっていく。 (図24, 25, 26, 27)

図24 Upsource のトップページから管理画面へ移動
図25 Edit project 押下
図26 Code Intelligence タブを押下
図27 Enable code intelligence にチェックを入れ、必要な設定を行う
  • Enable code intelligence: チェック
  • Run code inspections: チェック
  • Inspection profile: (空欄)
  • Convert project model: Detect automatically
  • Project root directory: (空欄)
  • JavaScript support: Off
  • PHP support: Off
  • Python support Off

Code Intelligence についての詳細は次のページ参照のこと。

Code Intelligence の結果確認

解析が終わると、図28 のように警告などが表示されるようになる。

図28 code intelligence 結果

以上。

参考資料