# Tera Term Development

1. Development Environment, Libraries
   1. Compiler, Tools
   2. Libraries
2. Build
   1. Build environment
   2. How to build (Quick Start)
      1. Checkout source code
      2. Build
   3. How to build (Detail)
      1. Checkout source code
      2. Build libaries
      3. Build Tera Term
      4. Build TTSSH
      5. Build TTProxy
      6. Build TTXKanjiMenu
      7. Build TTXSamples
      8. Build TeraTerm Menu
      9. Build CygTerm
      10. Build Cyglaunch
      11. Build HTML help file
3. Note for development
   1. Add entry to TERATERM.INI
   2. Naming rule to add menu ID
   3. What to do when new macro command is added?
   4. Icon
4. How to release Tera Term installation package
   1. From start release until create RC
   2. From create RC until release
   3. Release
   4. About code freeze

## Development Environment

### Compiler, Tools

Compiler and tools used for release in Tera Term Project:

- Visual Studio Community 2022 (latest) (https://visualstudio.microsoft.com/)
- Cygwin gcc (https://www.cygwin.com/)
  For build CygTerm+.

Following tools are needed to build Tera Term:

- Perl
  Any of the following:
  - Strawberry Perl 5.30.1.1 or later (https://strawberryperl.com/)
  - ActivePerl 5.10 or later (https://www.activestate.com/products/perl/)
  For build.
  - Converts character-code and return-code of documents.
  - For get the revision number.
- Subversion
  Any of the following:
  - VisualSVN (https://www.visualsvn.com/downloads/)
  - TortoiseSVN (https://tortoisesvn.net/downloads.html)
  - Subversion for Windows (http://sourceforge.net/projects/win32svn/)
  For checkout source code.
  The command line version of the same version that was used for checkout source code. For get the revision number.
- HTML Help Compiler
  For build HTML help file.
- CMake
  For download files and extract and compression.
- Inno Setup
  - Inno Setup 6.2.2 (https://jrsoftware.org/isinfo.php)
  - Inno Script Studio 2.5.1 (https://www.kymoto.org/products/inno-script-studio)
  For build installer.

### Libraries

- Oniguruma 6.9.8 (https://github.com/kkos/oniguruma/)
  For regular expression. Used by Tera Term Macro.
- SFMT 1.5.1 (http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/index-jp.html)
  For generate random number. Used by Tera Term Macro.
- LibreSSL 3.7.3 (https://www.libressl.org/)
  For encryption. Used by TTSSH.
- zlib 1.3 (https://www.zlib.net/)
  For compress. Used by TTSSH.
- The reference C implementation of Argon2 20190702 (https://github.com/P-H-C/phc-winner-argon2/)
  For read PuTTY private key file format version 3 (PPK3). Used by TTSSH.
- cJSON 1.7.14 (https://github.com/DaveGamble/cJSON/)
  Used by TTXCheckUpdate plugin.

## Build

### Build environment

- Install Visual Studio Community 2022
  - Desktop development with C++
  - C++ v14.30 (17.0) MFC for v143 build tools (x86 & x64)
    HTML Help Compiler (hhc.exe) is installed.
- Install Cygwin
  You can run buildtools\install_cygwin.bat to install Cygwin environment only for CygTerm+ compile.
  Please read this page to use existing Cygwin environment.
- Install Perl
- Install Subversion
- Install CMake
- Install Inno Setup

You can install new tools for Tera Term, but you can also choice using existing tools for build Tera Term.
If installer\release.bat cannot find a installed tool, copy installer\toolinfo_sample.bat as installer\toolinfo.bat, and edit it.
And if necessary, copy buildtools\svnrev\toolinfo_sample.txt as buildtools\svnrev\toolinfo.txt, and edit it.

### How to build (Quick Start)

#### Checkout source code

Checkout source code from OSDN (http://svn.osdn.net/svnroot/ttssh2/trunk/).
Project member have to use svn+ssh://<username>@svn.osdn.net/svnroot/ttssh2/trunk/ or https://svn.osdn.net/svnroot/ttssh2/trunk/.

#### Build

Run installer\release.bat, and select 3.

### How to build (Detail)

#### Checkout source code

Checkout source code from OSDN (http://svn.osdn.net/svnroot/ttssh2/trunk/).
Project member have to use svn+ssh://<username>@svn.osdn.net/svnroot/ttssh2/trunk/ or https://svn.osdn.net/svnroot/ttssh2/trunk/.

#### Build libaries

Launch "x86 Native Tools Command Prompt for VS 2022" batch file from start menu, or set appropriate directory to PATH.
You can run libs\buildall.bat to build all libraries instead of run each batch files. *

- Oniguruma
  1. Extract oniguruma source into libs/oniguruma directory.
  2. Run libs\buildoniguruma6.bat. *
- SFMT
  1. Extract SFMT source into libs/SFMT directory.
  2. Run libs\buildSFMT.bat. *
  3. Modify version information in libs/SFMT/SFMT_version_for_teraterm.h if necessary.
- LibreSSL
  1. Extract LibreSSL source into libs/libressl directory.
  2. Run buildlibressl.bat. *
- Zlib
  1. Extract zlib source into libs/zlib directory.
  2. Run buildzlib.bat. *
- The reference C implementation of Argon2
  1. Extract argon2 source into libs/argon2 directory.
- cJSON
  1. Extract cJSON source into libs/cJSON directory.

#### Build Tera Term

1. Open teraterm\ttermpro.sln with Visual Studio.
   The linefeed code of .sln file must be "CR+LF".
2. Build Tera Term solution.
3. Tera Term execution program files will be generated in teraterm\Debug / teraterm\Release directory if the building is successful.

#### Build TTSSH

common_static.lib must be built beforehand by teraterm\ttermpro.sln.

1. Open ttssh2\ttssh.sln with Visual Studio.
2. Build TTSSH solution.
3. TTSSH DLL module will be generated in ttssh2\ttxssh\Debug / ttssh2\ttxssh\Release directory if the building is successful.

#### Build TTProxy

common_static.lib must be built beforehand by teraterm\ttermpro.sln.

1. Open TTProxy\TTProxy.sln with Visual Studio.
2. Build TTProxy solution.
3. TTProxy DLL module will be generated in TTProxy\Debug / TTProxy\Release directory if the building is successful.

#### Build TTXKanjiMenu

common_static.lib must be built beforehand by teraterm\ttermpro.sln.

1. Open TTXKanjiMenu\ttxkanjimenu.sln with Visual Studio.
2. Build TTXKanjiMenu solution.
3. Ttxkanjimenu DLL module will be generated in TTXKanjiMenu\Debug / TTXKanjiMenu\Release directory if the building is successful.

#### Build TTXSamples

common_static.lib must be built beforehand by teraterm\ttermpro.sln.

1. Open TTXSamples\TTXSamples.sln with Visual Studio.
2. Build TTXSamples solution.
3. DLL modules will be generated in TTXSamples\Debug / TTXSamples\Release directory if the building is successful.

#### Build TeraTerm Menu

common_static.lib must be built beforehand by teraterm\ttermpro.sln.

1. Open ttpmenu\ttpmenu.sln with Visual Studio.
2. Build ttpmenu solution.
3. ttpmenu.exe will be generated in ttpmenu\Debug / ttpmenu\Release directory if the building is successful.

#### Build CygTerm+

1. Launch Cygwin shell and go to cygterm directory.

       # cd cygterm

2. Compile CygTerm+.

       # make

3. cygterm.exe will be generated.

#### Build Cyglaunch

common_static.lib must be built beforehand by teraterm\ttermpro.sln.

1. Open cygwin\cygwin.sln with Visual Studio.
2. Build cygwin solution.
3. cyglaunch.exe will be generated in cygwin\Debug / cygwin\Release directory if the building is successful.

#### Build HTML help file

1. Run doc\makechm.bat.

## Note for development

### Add entry to TERATERM.INI

Entry name
Unfortunately, the confusing entries such as EnableFoo... and DisableBar... are included.
It recommends that the new name like as Baz....

### Naming rule to add menu ID

    The first digit is 5.

    The second digit is:
      Tera Term VT window          0
      Tera Term TEK window         1
      TTSSH                        2
      TTProxy                      3
      TTXKanjiMenu                 4

    The third digit is:
      [File] menu                  1
      [Edit] menu                  2
      [Setup] menu                 3
      [Control] menu               4
      [Window] menu                8
      [Help] menu                  9

Example: adding a TTSSH menu under File menu

    #define ID_SSHSCPMENU       52110

### What to do when new macro command is added?

- Coding
  - get a new number of command internal ID.
    ... teraterm/ttmacro/ttmparse.h
  - add a if statement to below function.
    ... CheckReservedWord@teraterm/ttmacro/ttmparse.c
  - add a caller doing the macro command.
    ... ExecCmnd@teraterm/ttmacro/ttl.c
  - make a function code for the macro command.
- Help topic
  - make the command help file.
    ... doc/LANG/html/macro/command/hogefunc.html
  - add to command index page.
    ... doc/LANG/html/macro/command/index.html
  - add the file to help topic.
    ... doc/LANG/teraterm.hhc
  - get a new number of context ID in help page.
    The value is internal ID + 92000.
    ... teraterm/common/helpid.h
  - make the alias between context ID and calling file.
    Open the .hhp file by using Text Editor, added a html line in [ALIAS] tag.
    ... doc/LANG/teraterm.hhp

### Icon

Icon file includes 4bit 32px and 16px images, 32bit 256px, 48px, 32px and 16px images.
Each icon files include following kind images.

T (Tera Term)

icon file | icon name | 4bit 32px | 4bit 16px | 32bit 256px | 32bit 48px | 32bit 32px | 32bit 16px
--- | --- | --- | --- | --- | --- | --- | ---
teraterm\common\teraterm.ico | TTERM (Default) | BMP | BMP | PNG | BMP | BMP | BMP
teraterm\common\teraterm_classic.ico | TTERM_CLASSIC | BMP | BMP | - | - | - | -
teraterm\common\teraterm_3d.ico | TTERM_3D | BMP | BMP | PNG | BMP | BMP | BMP
teraterm\common\teraterm_flat.ico | TTERM_FLAT | BMP | BMP | PNG | BMP | BMP | BMP

VT (VT Window)

icon file | icon name | 4bit 32px | 4bit 16px | 32bit 256px | 32bit 48px | 32bit 32px | 32bit 16px
--- | --- | --- | --- | --- | --- | --- | ---
teraterm\common\vt.ico | VT (Default) | BMP | BMP | PNG | BMP | BMP | BMP
teraterm\common\vt_classic.ico | VT_CLASSIC | BMP | BMP | - | - | - | -
teraterm\common\vt_3d.ico | VT_3D | BMP | BMP | PNG | BMP | BMP | BMP
teraterm\common\vt_flat.ico | VT_FLAT | BMP | BMP | PNG | BMP | BMP | BMP

TEK (TEK Windows)

icon file | icon name | 4bit 32px | 4bit 16px | 32bit 256px | 32bit 48px | 32bit 32px | 32bit 16px
--- | --- | --- | --- | --- | --- | --- | ---
teraterm\common\tek.ico | TEK | BMP | BMP | - | - | - | -

M (Macro)

icon file | icon name | 4bit 32px | 4bit 16px | 32bit 256px | 32bit 48px | 32bit 32px | 32bit 16px
--- | --- | --- | --- | --- | --- | --- | ---
teraterm\ttpmacro\ttmacro.ico | - | BMP | BMP | PNG | BMP | BMP | BMP
teraterm\ttpmacro\ttmacro_3d.ico | - | BMP | BMP | PNG | BMP | BMP | BMP
teraterm\ttpmacro\ttmacro_flat.ico | - | BMP | BMP | PNG | BMP | BMP | BMP

MF (Macro File)

icon file | icon name | 4bit 32px | 4bit 16px | 32bit 256px | 32bit 48px | 32bit 32px | 32bit 16px
--- | --- | --- | --- | --- | --- | --- | ---
teraterm\ttpmacro\ttmacrof.ico | - | BMP | BMP | PNG | BMP | BMP | BMP

keycode

icon file | icon name | 4bit 32px | 4bit 16px | 32bit 256px | 32bit 48px | 32bit 32px | 32bit 16px
--- | --- | --- | --- | --- | --- | --- | ---
teraterm\keycode\keycode.ico | - | BMP | BMP | - | BMP | - | -

TTSSH

icon file | icon name | 4bit 32px | 4bit 16px | 32bit 256px | 32bit 48px | 32bit 32px | 32bit 16px
--- | --- | --- | --- | --- | --- | --- | ---
teraterm\ttpmacro\ttsecure.ico | flat2 (Default) | BMP | BMP | PNG | BMP | BMP | BMP
teraterm\ttpmacro\ttsecure_classic.ico | classic | BMP | BMP | - | - | - | -
teraterm\ttpmacro\ttsecure_yellow.ico | yellow | BMP | BMP | PNG | BMP | BMP | BMP
teraterm\ttpmacro\ttsecure_green.ico | green | BMP | BMP | PNG | BMP | BMP | BMP
teraterm\ttpmacro\ttsecure_flat.ico | flat | BMP | BMP | PNG | BMP | BMP | BMP

TeraTerm Menu

icon file | icon name | 4bit 32px | 4bit 16px | 32bit 256px | 32bit 48px | 32bit 32px | 32bit 16px
--- | --- | --- | --- | --- | --- | --- | ---
ttpmenu\teraterm.ico | - | BMP | BMP | - | BMP | BMP | BMP

Cygterm+

icon file | icon name | 4bit 32px | 4bit 16px | 32bit 256px | 32bit 48px | 32bit 32px | 32bit 16px
--- | --- | --- | --- | --- | --- | --- | ---
cygwin\cygterm\cygterm.ico | CYGTERM | BMP | BMP | - | BMP | BMP | BMP

The store order of image files in icon file is "bit depth ASC", "pixel size DESC."
Otherwise, when a program load an icon image without specifying pixel size for get maximum size image, API returns first image.

Icon file include 4-bit images.
Windows NT 4.0 supports only 4-bit icon. And notification area icon on Windows 2000 supports only 4-bit icon.
4-bit color palette is followings:

| #000000 | (0,0,0)
| #800000 | (128,0,0)
| #ff0000 | (255,0,0)
| #ff00ff | (255,0,255)
| #008080 | (0,128,128)
| #008000 | (0,128,0)
| #00ff00 | (0,255,0)
| #00ffff | (0,255,255)
| #000080 | (0,0,128)
| #800080 | (128,0,128)
| #0000ff | (0,0,255)
| #c0c0c0 | (192,192,192)
| #808080 | (128,128,128)
| #808000 | (128,128,0)
| #ffff00 | (255,255,0)
| #ffffff | 255,255,255

Source file of each icon images are followings:

source file | bit | T | VT | Macro | SSH | Cygwin
--- | --- | --- | --- | --- | --- | ---
teraterm\common\flat_icon_16.psd | 4bit | v | v | v | v | v
32bit | v | v | v | v | v
teraterm\common\flat_icon_32.psd | 4bit | v | v | v | v | v
32bit | v | v | v | v | v
teraterm\common\flat_icon_48.psd | 32bit | v | v | v | v | v
teraterm\common\flat_icon_256.psd | 32bit | v | v | v | v | -

source file | bit | Keycode
--- | --- | ---
teraterm\common\keycode_48.psd | 4bit | v

source file | bit | T | VT | Macro | Macro File | SSH | Cygwin
--- | --- | --- | --- | --- | --- | --- | ---
teraterm\common\flat2_icon_16.psd | 4bit | v | v | v | v | v | v
32bit | v | v | v | v | v | v
teraterm\common\flat2_icon_32.psd | 4bit | v | v | v | v | v | v
32bit | v | v | v | v | v | v
teraterm\common\flat2_icon_48.psd | 32bit | v | v | v | v | v | v
teraterm\common\flat2_icon_256.psd | 32bit | v | v | v | v | v | -

## How to release Tera Term installation package

To release Tera Term installation package is shown in the following step:

### From start release until create RC

1. Confirm ticket and branches.
   - Confirm in project team.
     - Organize / decide whether to include bug fix / feature in this release or defer.
   - Merge branches
     - Verify trunk / 4-stable and working branches.
   - Close tickets.
2. Confirm tools, libraries, import sources.
   - Visual Studio (https://visualstudio.microsoft.com/)
   - Inno Setup (https://jrsoftware.org/isdl.php)
   - Oniguruma (https://github.com/kkos/oniguruma/)
   - SFMT (http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/index-jp.html)
   - LibreSSL (https://www.libressl.org/)
   - zlib (http://www.zlib.net/)
   - The reference C implementation of Argon2 (https://github.com/P-H-C/phc-winner-argon2/)
   - cJSON (https://github.com/DaveGamble/cJSON/)
   - Unicode (https://www.unicode.org/versions/latest/)

### From create RC until release

1. Confirm documents.
2. Increment the version while RC release process.

   The binary is released for test in this timing. Prevent that old and new binary have same version number.

   - teraterm\common\tt-version.h
     set TT_VERSION_SUBSTR to "RC".

           #define TT_VERSION_MAJOR             5
           #define TT_VERSION_MINOR             0
         - #define TT_VERSION_SUBSTR            "dev"
         + #define TT_VERSION_SUBSTR            "RC"

     TT_VERSION_MINOR is already incremented yet. It is incremented immediately after previous release.
   - ttssh2\ttxssh\ttxssh-version.h
   - Onttpmenu\ttpmenu.rc // only modifying
   - TTProxy\TTProxy.rc // only modifying
   - TTXKanjiMenu\ttxkanjimenu.rc // only modifying
   - installer\teraterm.iss
     Change to "RC" and enable create archive.

         - #define AppVer "5.0-dev"
         + #define AppVer "5.0-RC"

           [PreCompile]
           Name: makechm.bat
         - Name: build.bat
         - ;Name: build.bat; Parameters: rebuild
         + ;Name: build.bat
         + Name: build.bat; Parameters: rebuild

           [PostCompile]
         - ;Name: makearchive.bat; Parameters: release
         + Name: makearchive.bat; Parameters: release

   By way of exception, CygTerm+ always upgrades not regarding Tera Term release process when the patch is committed.
   The release date is the day committed by a developer.
   Because user can get gcc compiler for free.

3. Increment the year of last publication of copyright notice if it is first release in this year.
   - teraterm\keycode\keycode-version.rc // VERSIONINFO
   - teraterm\teraterm\tt-version.rc // VERSIONINFO
   - teraterm\ttpcmn\ttpcmn-version.rc // VERSIONINFO
   - teraterm\ttpdlg\ttpdlg.rc // dialog
   - teraterm\ttpmacro\ttm-version.rc // VERSIONINFO
   - teraterm\ttptek\ttptek-version.rc // VERSIONINFO
   - ttssh2\ttxssh\ttxssh.rc // dialog
   - ttssh2\ttxssh\ttxssh-version.rc // VERSIONINFO
   - ttpmenu\ttpmenu.rc // dialog, VERSIONINFO
   - TTProxy\TTProxy.rc // dialog, VERSIONINFO(en), VERSIONINFO(ja)
   - TTXKanjiMenu\ttxkanjimenu.rc // VERSIONINFO
   - installer\teraterm.iss
   - installer\release\license.txt // Tera Term, TTSSH, Cygterm+, TTProxy, TeraTerm Menu, TTX KanjiMenu
   - doc\en\html\index.html
   - doc\en\html\about\copyright.html // Tera Term, TTSSH, Cygterm+, TTProxy, TeraTerm Menu, TTX KanjiMenu
   - doc\en\html\macro\index.html
   - doc\ja\html\index.html
   - doc\ja\html\about\copyright.html // Tera Term, TTSSH, Cygterm+, TTProxy, TeraTerm Menu, TTX KanjiMenu
   - doc\ja\html\macro\index.html
4. Commit this state.
5. Create installer.
   When use installer\release.bat
     Run installer\release.bat to create installer and zip.
     File name is constructed from buildtool\svnrev\sourcetree_info.bat. It is written by buildtools\svnrev\svnrev.bat from teraterm\common\tt-version.h.
     - Run installer\release.bat.
       Create installer in installer\iscc.bat called installer\release.bat.
     - A installer and zipped portable version is generated in installer\Output folder.
   When use Inno Script Studio
     It is easier to use installer\release.bat when create an RC,release.
     Debugging installer is easy to use Inno Script Studio. File name of installer is constructed from definition of installer\teraterm.iss. File name of portable version is constructed from buildtool\svnrev\sourcetree_info.bat.
     - Open installer\teraterm.iss with Inno Script Studio, and create installer by "Project"-"Compile."
     - A installer and portable version is generated in installer\Output folder.
     - Compress portable version with zip.
6. Test run installer, run and connect in all supported OS.
7. Add to OSDN Release
   - Add new release (e.g. "4.106 RC") to "Tera Term RC" Package.
   - Add installer and portable zip file to new release.
8. Announce RC release.
   - ttssh2-users mailing list
   - Twitter (https://twitter.com/Tera_Term)
9. Get feedbacks.

   If changed source code, redo "Confirm documents" and "Test run and connect in all supported OS."

### Release

1. Confirm documents. (same as above)
2. Remove "RC" string.
   - teraterm\common\tt-version.h

           #define TT_VERSION_MAJOR             5
           #define TT_VERSION_MINOR             0
         - #define TT_VERSION_SUBSTR            "RC"
         + #undef TT_VERSION_SUBSTR

   - installer\teraterm.iss

         - #define AppVer "5.0-RC"
         + #define AppVer "5.0"

3. Modify release date.
   - html/about/hisotry.html
4. Create installer.
   Use installer\release.bat
     Run installer\release.bat to create installer and zip.
     - run installer\release.bat.
     - Installer and zip are output to installer\Output folder.
   Use Inno Script Studio
     - Open installer\teraterm.iss with Inno Script Studio, and create installer by "Project"-"Compile."
     - A installer and zipped portable version is generated in installer\Output folder.
5. Commit this state.
6. Create SVN tag.
   The naming rule is `teraterm-version' (e.g. teraterm-5_0).

       svn copy -m "Release 5.0" \
           svn+ssh://svn.osdn.net/svnroot/ttssh2/trunk \
           svn+ssh://svn.osdn.net/svnroot/ttssh2/tags/teraterm-5_0

7. Re-checkout from svn tag.

   All source code is same as development branch. Only SVN revision is different.

8. Create installer.
   Use installer\release.bat
     - run installer\release.bat.
     - A installer and zipped portable version is generated in installer\Output folder.
   Use Inno Script Studio
     - Open installer\teraterm.iss with Inno Script Studio, and create installer by "Project"-"Compile."
     - A installer and portable version is generated in installer\Output folder.
     - Compress portable version with zip.
9. Update OSDN project site.
   - add new release (e.g. "4.106") to "Tera Term" Package.
   - Add installer and portable zip file to new release.
   - Submit news.
10. Update OSDN project home page (https://ttssh2.osdn.jp).

    How to update project home page (in Japanese).

11. Announce release.
    - ttssh2-users mailing list
    - Twitter (https://twitter.com/Tera_Term)
      - Pin announce tweet.
12. Revert teraterm.iss in development branch.
    - teraterm/common/tt-version.h
      Increment TT_VERSION_MINOR and set SUBSTR to "dev".

            #define TT_VERSION_MAJOR             5
          - #define TT_VERSION_MINOR             0
          - #undef TT_VERSION_SUBSTR
          + #define TT_VERSION_MINOR             1
          + #define TT_VERSION_SUBSTR            "dev"

    - installer\teraterm.iss
      Set AppVer to [next version]-dev.

          - #define AppVer "5.0"
          + #define AppVer "5.1-dev"

            [PreCompile]
            Name: makechm.bat
          - ;Name: build.bat
          - Name: build.bat; Parameters: rebuild
          + Name: build.bat
          + ;Name: build.bat; Parameters: rebuild

            [PostCompile]
          - Name: makearchive.bat; Parameters: release
          + ;Name: makearchive.bat; Parameters: release

13. Update Chocolatey.

### About code freeze.

After code freeze, only critical bug fix is able to committed.
Code freeze start with RC commit in development branch, and end with revert teraterm.iss commit in development branch.