markdown demo

This isn't the Bin, don't treat it like one.
Randoms and Funnies are permitted, but no flaming.
Post Reply
User avatar
Posts: 229
Joined: Tue Mar 27, 2018 2:35 pm

markdown demo

Post by ZachBacon »

Advertisement :)

  • pica - high quality and fast image
    resize in browser.
  • babelfish - developer friendly
    i18n with plurals support and easy syntax.

You will like those projects!

h1 Heading 8-)

h2 Heading

h3 Heading

h4 Heading

h5 Heading
h6 Heading

Horizontal Rules

Typographic replacements

Enable typographer option to see result.

(c) (C) (r) (R) (tm) (TM) (p) (P) +-

test.. test... test..... test?..... test!....

!!!!!! ???? ,, -- ---

"Smartypants, double quotes" and 'single quotes'


This is bold text

This is bold text

This is italic text

This is italic text



Blockquotes can also be nested... using additional greater-than signs right next to each other...

...or with spaces between arrows.



  • Create a list by starting a line with +, -, or *
  • Sub-lists are made by indenting 2 spaces:
    • Marker character change forces new list start:
    • Ac tristique libero volutpat at
    • Facilisis in pretium nisl aliquet
    • Nulla volutpat aliquam velit
  • Very easy!


  1. Lorem ipsum dolor sit amet
  2. Consectetur adipiscing elit
  3. Integer molestie lorem at massa
  1. You can use sequential numbers...
  2. ...or keep all the numbers as 1.

Start numbering with offset:

  1. foo
  2. bar


Inline code

Indented code

Code: Select all

// Some comments
line 1 of code
line 2 of code
line 3 of code

Block code "fences"

Code: Select all

Sample text here...

Syntax highlighting

Code: Select all

var foo = function (bar) {
  return bar++;



datapath to data files to supply the data that will be passed into templates.
engineengine to be used for processing templates. Handlebars is the default.
extextension to be used for dest files.

Right aligned columns

datapath to data files to supply the data that will be passed into templates.
engineengine to be used for processing templates. Handlebars is the default.
extextension to be used for dest files.


link text

link with title

Autoconverted link (enable linkify to see)



Like links, Images also have a footnote style syntax


With a reference later in the document defining the URL location:


The killer feature of markdown-it is very effective support of
syntax plugins.


Classic markup: :wink: :crush: :cry: :tear: :laughing: :yum:

Shortcuts (emoticons): :-) :-( 8-) ;)

see how to change output with twemoji.

Subscript / Superscript

  • 19th
  • H2O


++Inserted text++


==Marked text==


Footnote 1 link[first].

Footnote 2 link[second].

Inline footnote^[Text of inline footnote] definition.

Duplicated footnote reference[second].

[first]: Footnote can have markup

Code: Select all

and multiple paragraphs.

[second]: Footnote text.

Definition lists

Term 1

: Definition 1
with lazy continuation.

Term 2 with inline markup

: Definition 2

Code: Select all

    { some code, part of Definition 2 }

Third paragraph of definition 2.

Compact style:

Term 1
~ Definition 1

Term 2
~ Definition 2a
~ Definition 2b


This is HTML abbreviation example.

It converts "HTML", but keep intact partial entries like "xxxHTMLyyy" and so on.

*[HTML]: Hyper Text Markup Language

Custom containers

::: warning
here be dragons

This post serves as an example of markdown and was borrowed from

User avatar
Posts: 229
Joined: Tue Mar 27, 2018 2:35 pm

Re: markdown demo

Post by ZachBacon »

<!-- START doctoc generated TOC please keep comment here to allow auto update -->

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

Image Image Image


Visual Boy Advance - M

Game Boy Advance Emulator

Windows and Mac builds are in the releases tab.

Nightly builds are here.

Your distribution may have packages available as well, search for
visualboyadvance-m or vbam.

It is also generally very easy to build from source, see below.

If you are using the windows binary release and you need localization, unzip
the to the same directory as the executable.

If you are having issues, try resetting the config file first, go to Help ->
Factory Reset


The basic formula to build vba-m is:

Code: Select all

cd ~ && mkdir src && cd src
git clone
cd visualboyadvance-m

# ./installdeps will give you build instructions, which will be similar to:

mkdir build && cd build
cmake .. -G Ninja

./installdeps is supported on MSys2, Linux (Debian/Ubuntu, Fedora, Arch,
Solus, OpenSUSE, Gentoo and RHEL/CentOS) and Mac OS X (homebrew, macports or

Building a Libretro core

Clone this repo and then,

Code: Select all

cd src/libretro
make -j`nproc`

Copy to your RetroArch cores directory.

Visual Studio Support

For visual studio, dependency management is handled automatically with vcpkg,
From the Visual Studio GUI, just clone the repository with git and build with
the cmake configurations provided.

If the GUI does not detect cmake, go to File -> Open -> CMake and open the

If you are using 2017, make sure you have all the latest updates, some issues
with cmake projects in the GUI have been fixed.

You can also build from the developer command prompt or powershell with the
environment loaded.

Using your own user-wide installation of vcpkg is supported, just make sure the
environment variable VCPKG_ROOT is set.

To build in the visual studio command prompt, use something like this:

Code: Select all

mkdir build
cd build
cmake .. -DVCPKG_TARGET_TRIPLET=x64-windows-static -DCMAKE_BUILD_TYPE=Debug -G Ninja


If your OS is not supported, you will need the following:

And the following development libraries:

  • zlib (required)
  • mesa (if using X11 or any OpenGL otherwise)
  • ffmpeg (optional, at least version 4.0.4, for game recording)
  • gettext and gettext-tools (optional, with ENABLE_NLS)
  • SDL2 (required)
  • SFML (optional, for link)
  • OpenAL or openal-soft (optional, a sound interface)
  • wxWidgets (required for GUI, 2.8 and non-stl builds are no longer supported)

On Linux and similar, you also need the version of GTK your wxWidgets is linked
to (usually 2 or 3) and the xorg development libraries.

Support for more OSes/distributions for ./installdeps is planned.

Cross compiling for 32 bit on a 64 bit host

./installdeps m32 will set things up to build a 32 bit binary.

This is supported on Fedora, Arch, Solus and MSYS2.

Cross Compiling for Win32

./installdeps takes one optional parameter for cross-compiling target, which
may be win32 which is an alias for mingw-w64-i686 to target 32 bit Windows,
or mingw-gw64-x86_64 for 64 bit Windows targets.

The target is implicit on MSys2 depending on which MINGW shell you started (the
value of $MSYSTEM.)

On Debian/Ubuntu this uses the MXE apt repository and works quite well.

On Fedora it can build using the Fedora MinGW packages, albeit with wx 2.8, no
OpenGL support, and no Link support for lack of SFML.

On Arch it currently doesn't work at all because the AUR stuff is completely
broken, I will at some point redo the arch stuff to use MXE as well.

CMake Options

The CMake code tries to guess reasonable defaults for options, but you can
override them, for example:

Code: Select all

cmake .. -DENABLE_LINK=NO -G Ninja

Of particular interest is making Release or Debug builds, the default
mode is Release, to make a Debug build use something like:

Code: Select all

cmake .. -DCMAKE_BUILD_TYPE=Debug -G Ninja

Here is the complete list:

CMake OptionWhat it DoesDefaults
ENABLE_WXBuild the wxWidgets portON
ENABLE_DEBUGGEREnable the debuggerON
ENABLE_NLSEnable translationsON
ENABLE_ASMEnable the following two ASM optionsON for 32 bit builds
ENABLE_ASM_SCALERSEnable x86 ASM graphic filtersON for 32 bit builds
ENABLE_MMXEnable MMXON for 32 bit builds
ENABLE_LINKEnable GBA linking functionality (requires SFML)AUTO
ENABLE_FFMPEGEnable ffmpeg A/V recordingAUTO
ENABLE_ONLINEUPDATESEnable online update checksON
ENABLE_LTOCompile with Link Time Optimization (gcc and clang only)ON for release build
ENABLE_GBA_LOGGINGEnable extended GBA loggingON
ENABLE_DIRECT3DDirect3D rendering for wxWidgets (Windows, NOT IMPLEMENTED!!!)ON
ENABLE_XAUDIO2Enable xaudio2 sound output for wxWidgets (Windows only)ON
ENABLE_OPENALEnable OpenAL for the wxWidgets portAUTO
ENABLE_SSPEnable gcc stack protector support (gcc only)OFF
ENABLE_ASANEnable libasan sanitizers (by default address, only in debug mode)OFF
UPSTREAM_RELEASEDo some release tasks, like codesigning, making zip and gpg sigs.OFF
VBAM_STATICTry link all libs statically (the following are set to ON if ON)OFF
SDL2_STATICTry to link static SDL2 librariesOFF
SFML_STATIC_LIBRARIESTry to link static SFML librariesOFF
FFMPEG_STATICTry to link static ffmpeg librariesOFF
SSP_STATICTry to link static gcc stack protector library (gcc only)OFF except Win32
OPENAL_STATICTry to link static OpenAL librariesOFF
SSP_STATICLink gcc stack protecter libssp statically (gcc, with ENABLE_SSP)OFF

Note for distro packagers, we use the CMake module
to configure installation directories.

MSys2 Notes

To run the resulting binary, you can simply type:

Code: Select all


in the shell where you built it.

If you built with -DCMAKE_BUILD_TYPE=Debug, you will get a console app and
will see debug messages, even in mintty.

If you want to start the binary from e.g. a shortcut or Explorer, you will need
to put c:\msys64\mingw32\bin for 32 bit builds and c:\msys64\mingw64\bin
for 64 bit builds in your PATH (to edit system PATH, go to Control Panel ->
System -> Advanced system settings -> Environment Variables.)

If you want to package the binary, you will need to include the MinGW DLLs it
depends on, they can install to the same directory as the binary.

Our own builds are static.

Debug Messages

We have an override for wxLogDebug() to make it work even in non-debug builds
of wx and on windows, even in mintty.

It works like printf(), e.g.:

Code: Select all

int foo = 42;
wxLogDebug(wxT("the value of foo = %d"), foo);

From the core etc. the usual:

Code: Select all

fprintf(stderr, "...", ...);

will work fine.

You need a debug build for this to work or to even have a console on Windows.
Pass -DCMAKE_BUILD_TYPE=Debug to cmake.

Reporting Crash Bugs

If the emulator crashes and you wish to report the bug, a backtrace made with
debug symbols would be immensely helpful.

To generate one (on Linux and MSYS2) first build in debug mode by invoking
cmake as:

Code: Select all

cmake .. -DCMAKE_BUILD_TYPE=Debug

After you've reproduced the crash, you need the core dump file, you may need to
do something such as:

Code: Select all

ulimit -c unlimited

in your shell to enable coredump files.


explains how to retrieve core dump on Fedora Linux (and possibly other

Once you have the core dump file, open it with gdb, for example:

Code: Select all

gdb -c core ./visualboyadvance-m

In the gdb shell, to print the backtrace, type:

Code: Select all


This may be a bit of a hassle, but it helps us out immensely.


See the Developer Manual.

Image Image

User avatar
Posts: 229
Joined: Tue Mar 27, 2018 2:35 pm

Re: markdown demo

Post by ZachBacon »

Some of the shortcomings of this markdown mod is that it doesn't support doctoc and syntax highlighting, might need to see about adding certain markdown features as we see fit. But overall... Not terrible and it does the job fairly well.

Image Image

User avatar
Posts: 229
Joined: Tue Mar 27, 2018 2:35 pm

Re: markdown demo

Post by ZachBacon »

### Solar System Exploration, 1950s – 1960s
  • [x] Checked
  • [ ] Unchecked

Image Image

User avatar
Posts: 229
Joined: Tue Mar 27, 2018 2:35 pm

Re: markdown demo

Post by ZachBacon »

  • @mentions, #refs, links, formatting, and <del>tags</del> supported
  • list syntax required (any unordered or ordered list supported)
  • this is a complete item
  • this is an incomplete item
First HeaderSecond Header
Content from cell 1Content from cell 2
Content in the first columnContent in the second column

Image Image

User avatar
Posts: 229
Joined: Tue Mar 27, 2018 2:35 pm

Re: markdown demo

Post by ZachBacon »

<!-- START doctoc generated TOC please keep comment here to allow auto update -->
Table of Contents generated with DocToc

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

visualboyadvance-m Developer Manual

Here we will keep notes about our development process, policies and environment
setup guides.

Issues Policies

Processing New Issues

Follow the following steps to process newly submitted issues:

  • Edit the user's post to remove unused template sections etc.. Rephrase the
    issue title if it needs to be clarified.

  • Label the issue as a question, bug or enhancement. This label can be changed
    later upon clarification if necessary.

  • Add any other relevant labels, for example for the code subsystem.

  • If it is strongly related to a work by a developer that you know of, assign
    them to the issue. If this is not the case, they can be unassigned.

  • Ask the user for clarification of any details if needed.

Resolving Issues

  • An issue is resolved by closing it in github. A commit that fixes the issue
    should have the following line near the end of the body of the commit message:

    Code: Select all

    - Fix #999.
    This will automatically close the issue and assign the closing commit in the
    github metadata when it is merged to master. The issue can be reopened if
  • A commit that is work towards resolving an issue, should have the issue number
    preceded by a pound sign either at the end of a commit message title, if it is
    of primary relevance to the issue, or the body otherwise.

Pull Request and Commit Policies

Commit Message

Follow these guidelines always: ... sages.html

the description of your work should be in the commit message NOT the pull
request description

Make sure your git history is clean and logical, edit when necessary with
rebase -i.

Collaboration on a Branch

To update when multiple people are working on a git branch, keep a couple of
things in mind:

  • Always push -f unless you're adding a commit on top. And it's almost always
    better to edit the history than to add more commits. Never add commits fixing
    previous commits, only improving or adding to them.

  • To update when someone else (very rudely you might say) did a push -f, pull
    will USUALLY work. Verify the log, and if necessary do this

Code: Select all

git status # should be clean, with your work having been already pushed
git fetch --all --prune
git reset --hard origin/<branch-name>

While actively working on a branch, keep it rebased on top of master.

Commits from Maintainers

Maintainers have the power to commit directly to master. This power must be
used responsibly, something I fail to do myself often, and will try to improve

Make your most earnest attempt to follow these general guidelines to keep our
history clean:

  • Things that are a straight fix or improvement that does not require discussion
    can be committed directly, keeping the following guidelines in mind.

  • Bigger new features, code refactors and changes in architecture should go
    through the PR process.

  • Push code changes to a branch first, so they can run through the CI.
    Differences in what different compilers allow is a problem that comes up
    VERY frequently. As well as incompatibilities between different
    configurations for both the C++ code and any supporting code.

Strings, Character Sets and Translations

Pulling Updated Translations

Once in a while it is necessary to pull new and updated translations from

For this you need the transifex client, available for Windows as well from
chocolatey as transifex-client.

To pull translations run:

Code: Select all

tx pull -af

then check git status and if any message catalogs were updated, commit the
result as:

Code: Select all

git commit -a --signoff -S -m'Transifex pull.'
git push

Translations Message Catalog

Strings that need to be translated by our wonderful translators on transifex
(thank you guys very much) need to be enclosed in _("..."), for example:

Code: Select all

wxLogError(_("error: something very wrong"));

The next time you run cmake after adding a string to be translated, the .pot
message catalog source will be regenerated, and you will see a loud message
telling you to push to transifex.

Strings in the XRC XML GUI definition files are automatically added to the
message catalog as well.

If you are working on a branch or a PR, don't push to transifex until it has
been merged to master.

Once it is, push it with:

Code: Select all

tx push -s

Interaction with non-wxWidgets Code

Use our UTF8(...) function to force any wxString to UTF-8 for use by other
libraries, screen output or OS APIs. For example:

Code: Select all

fprintf(STDERR, "Error: %s\n", UTF8(err_msg));

There is one exception to this, when using wxString::Printf() and such, you
can't pass another wxString to the %s format directly, use something like

Code: Select all

wxString err;
err.Printf("Cannot read file: %s", fname.wc_str());

this uses the wchar_t UTF-16 representation on Windows and does nothing

For calling Windows APIs with strings, use the wide char W variants and the
wc_str() method as well.

Windows Native Development Environment Setup

Install the chocolatey package manager:

  • Press Win+X and open Windows PowerShell (administrator).

  • Run this command:

Code: Select all

Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString(''))

Close the administrator PowerShell window and open it again.

Install some chocolatey packages:

Code: Select all

choco install -y visualstudio2019community visualstudio2019-workload-nativedesktop ag dejavufonts git gpg4win hackfont microsoft-windows-terminal powershell-preview vim-tux zip unzip notepadplusplus openssh diffutils neovim

Launch the terminal and choose Settings from the tab drop-down, this will open
the settings json in visual studio.

Change the powershell (and not the "windows powershell") profile like so:

Code: Select all

    "name": "PowerShell",
    "source": "Windows.Terminal.PowershellCore",
    // If you want a background image, set the path here:
    //"backgroundImage": "file://c:/users/rkitover/Pictures/wallpapers/wallhaven-01ge81.jpg",
    "backgroundImageOpacity": 0.32,
    "backgroundImageStretchMode": "uniformToFill",
    "fontFace": "Hack",
    "fontSize": 10,
    "colorScheme": "Tango Dark",
    "cursorShape": "filledBox"

Make sure it is set as the default profile.

You can use tab shortcuts to get a sort of tmux for powershell, using the same
bindings as kitty, add this to the "keybindings" section:

Code: Select all

    "command" : "newTab",
    "keys" :
    "command" : "nextTab",
    "keys" :
    "command" : "prevTab",
    "keys" :

Now add some useful things to your powershell profile:


Code: Select all

notepad++ $profile

(or vim.)

Here's mine, most importantly the Visual Studio environment setup.

If you use my posh-git prompt, you'll need the git version of posh-git:

Code: Select all

mkdir ~/source/repos
cd ~/source/repos
git clone

Alternately install "poshgit" from chocolatey.

Code: Select all

chcp 65001 > $null

set-executionpolicy -scope currentuser remotesigned

set-culture en-US

ri env:TERM
$env:EDITOR = 'c:/tools/neovim/neovim/bin/nvim.exe'
set-alias -name vim -val /tools/neovim/neovim/bin/nvim

function megs {
    gci $args | select mode, lastwritetime, @{name="MegaBytes"; expression = { [math]::round($_.length / 1MB, 2) }}, name

function cmconf {

function pgrep {
    get-ciminstance win32_process -filter "name like '%$($args[0])%' OR commandline like '%$($args[0])%'" | select processid, name, commandline

function pkill {
    pgrep $args | %{ stop-process $_.processid }

function taskslog {
    get-winevent 'Microsoft-Windows-TaskScheduler/Operational'

set-alias -name notepad -val '/program files/notepad++/notepad++'
set-alias -name which   -val get-command
set-alias -name grep    -val ag

# For vimdiff etc., install diffutils from choco.
if (test-path alias:diff) { remove-item -force alias:diff }

# Load VS env only once.
if (-not $env:VSCMD_VER) {
    pushd '/program files (x86)/microsoft visual studio/2019/community/vc/auxiliary/build'
    cmd /c 'vcvars64.bat & set' | where { $_ -match '=' } | %{
        $var,$val = $_.split('=')
        set-item -force "env:$var" -value $val

# Chocolatey profile
$chocolatey_profile = "$env:chocolateyinstall\helpers\chocolateyprofile.psm1"

if (test-path $chocolatey_profile) { import-module $chocolatey_profile }

import-module ~/source/repos/posh-git/src/posh-git.psd1

function global:PromptWriteErrorInfo() {
    if ($global:gitpromptvalues.dollarquestion) {
    else {

$gitpromptsettings.defaultpromptabbreviatehomedirectory      = $true

$gitpromptsettings.defaultpromptprefix.text                  = '$(PromptWriteErrorInfo) '

$gitpromptsettings.defaultpromptwritestatusfirst             = $false
$gitpromptsettings.defaultpromptbeforesuffix.text            = "`n$env:USERNAME@$env:COMPUTERNAME "
$gitpromptsettings.defaultpromptbeforesuffix.foregroundcolor = 0x87CEFA
$gitpromptsettings.defaultpromptsuffix.foregroundcolor       = 0xDC143C

import-module psreadline

if (-not (test-path ~/.ps_history)) {
    new-item -itemtype file ~/.ps_history

register-engineevent powershell.exiting -action { get-history | export-clixml ~/.ps_history } | out-null

import-clixml ~/.ps_history | add-history *> $null

set-psreadlineoption     -editmode emacs
set-psreadlinekeyhandler -key tab       -function tabcompletenext
set-psreadlinekeyhandler -key uparrow   -function historysearchbackward
set-psreadlinekeyhandler -key downarrow -function historysearchforward

To set notepad++ as the git commit editor, run this command:

Code: Select all

git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession"

To configure truecolor support for vim, add this to your ~/.vimrc:

Code: Select all

if !has('gui-running')
  set bg=dark
  set termguicolors

To use 256 color support instead, use this:

Code: Select all

if !has('gui-running')
  set bg=dark
  set t_Co=256

I also recommend adding this to spellcheck commit messages:

Code: Select all

au BufRead COMMIT_EDITMSG setlocal spell

The most important thing that should be in your ~/.vimrc is of course:

Code: Select all

filetype plugin indent on

To use powershell as the vim internal shell instead of cmd, put this into ~/.vimrc:

Code: Select all

if (has('win32') || has('gui_win32')) && executable('pwsh')
    set shell=pwsh
    set shellcmdflag=\ -ExecutionPolicy\ RemoteSigned\ -NoProfile\ -Nologo\ -NonInteractive\ -Command

To use gvim instead of console vim, you could try this $profile set up:

Code: Select all

$env:EDITOR = 'C:/Program\ Files/Vim/vim82/gvim.exe --servername main --remote-tab-silent'

function vim {
    & 'C:/Program Files/Vim/vim82/gvim.exe' --servername main --remote-tab-silent $args

Along with the code to save/restore window position from: ... d_position

I also use an autocommand to keep the window vertically maximized despite tab
bar changes:

Code: Select all

if has('gui_running')
  au BufEnter * set lines=999

If you don't know how to use vim and want to learn, run vimtutor, it takes
about half an hour.

To set up gpg:

I don't use a passphrase on my key, because gpg-agent constantly causes me
grief, if you want to remove yours see: ... h_GPG.html

Configure git to use gpg4win:

Code: Select all

git config --global gpg.program "c:/Program Files (x86)/GnuPG/bin/gpg.exe"

Tell git to always sign commits:

Code: Select all

git config --global commit.gpgsign true

To set up ssh into your powershell environment, which allows doing builds
remotely etc., edit the registry as described here to set powershell-preview as
the default shell: ... faultShell

Follow this guide to set up the server: ... 32-OpenSSH

PowerShell Notes

PowerShell is very different from traditional UNIX shells, I am very new to it
myself, but I will pass on some tips here.

First, read this guide:

You can use ag to both search and as a substitute for grep.

For example:

Code: Select all

alias | ag sort

The above $profile aliases grep to ag.

Powershell itself provides a nice way to do simple grep/sed operations:

Code: Select all

alias | where { $_ -match '^se' } | select Name, ResolvedCommand
get-process | where { $_ -notmatch 'svchost' }
cmd /c date /T | %{ $_ -replace '.*(\d\d)/(\d\d)/(\d\d\d\d).*','$3-$1-$2' }

For ls -ltr use:

Code: Select all

gci | sort lastwritetime

You can use the -Recurse flag for Get-ChildItem (ls, gci) as a
substitute for find, e.g.:

Code: Select all

gci -rec *.xrc

Now combine this with the awesome powershell object pipeline to e.g. delete all
vim undo files:

Code: Select all

gci -rec .*un~ | ri

You will notice that cmdlets like Remove-Item (rm, ri), Copy-Item
(cp, cpi) etc. do not take multiple space separated items, you must
separate them by commas, eg.:

Code: Select all

1..4 | %{ni foo$_, bar$_}
mkdir tmpdir
cpi foo*, bar* tmpdir
ri foo*, bar*
ri -rec tmpdir

Comma separated items is the list syntax on powershell.

The equivalent of rm -rf to delete a directory is:

Code: Select all

ri -rec -for dir

The best replacement for sudo is to set up the openssh server with the shell
in the registry pointing to powershell-preview, commands run over ssh are
elevated. For example:

Code: Select all

ssh localhost choco upgrade -y all

It should not take you very long to learn enough basic usage for your dev
workflow. There is a lot of good info on powershell out there on blogs and
stackoverflow/superuser etc..

Release Process


The variable VBAM_NO_PAUSE, if set, will cause cmake to not pause before gpg
signing operations, you want to set this if you've disabled your gpg passphrase
to not require interaction during release builds.

gpg set up with your key is helpful for the release process on all environments
where a binary is built, but you can also make the detached signature files
yourself at the end of the process.

For codesigning windows binaries, put your certificate into

On Mac the 'Developer ID Application' certificate stored in your login keychain
is used, keychain unlock will prompt you for your login keychain password, to
avoid that set the LOGIN_KEYCHAIN_PASSWORD environment variable to your

Release Commit and Tag

Once you are sure you're ready to release, and you are in a git clone on master
with a clean working tree, use the cmake script to make the release commit and

Code: Select all

mkdir build && cd build

then push the release:

Code: Select all

git push
git push --tags

If you don't want to push the release, to back out the change do:

Code: Select all


64-bit Windows Binary

For this you will preferably need the powershell environment setup described
earlier, however you can use a regular Visual Studio 64 bit native developer
command prompt as well.

Code: Select all

mkdir build
cd build

Collect the following files for the release:


32-bit Windows Binary

For this the optimal environment is a linux distribution with the mingw
toolchain, I use fedora.

You can set up a shell on a fedora distribution with docker as described here: ... fa0ae243fd

If using fedora, the cross script will install all necessary dependencies, if
not install the base toolchain (mingw gcc, binutils, winpthreads) using the
preferred method for your distribution, you can also use mxe for this.

Code: Select all

sh tools/win/linux-cross-builder -32

You can also use msys2 on Windows, this is not recommended:

Code: Select all

sh tools/win/msys2-builder -32

To set up msys2, see this guide: ... db16064454

Collect the following files from ~/vbam-build-mingw32/project if using linux,
or ~/vbam-build-msys2-x86_64/project if using msys2:


64-bit Mac Binary

Install the latest Xcode for your OS.

You will need bash and (optionally) gpg from homebrew (which you will also need
to install):

Code: Select all

brew install bash gnupg

You will need a codesigning certificate from Apple, which you will be able to
generate once you join their developer program. This is the certificate of the
type 'Developer ID Application' stored in your login keychain. keychain
will prompt you for your login keychain password, to avoid that set the
LOGIN_KEYCHAIN_PASSWORD environment variable to your password.

Code: Select all

/usr/local/bin/bash tools/osx/builder -64

Collect the following files from ~/vbam-build-mac-64bit/project:


Final steps

Go to the github releases tab, and make a release for the tag you pushed

Put any notes to users and distro maintainers into the description as well as
the entries from generated earlier from git by the release
commit script.

Upload all files collected during the earlier builds, the complete list is:


Update the winsparkle appcast.xml by running this cmake command:

Code: Select all


follow the instructions to push the change to the web data repo.

Announce the release on reddit r/emulation and the forum.

Image Image

Post Reply