Skip to content

Instantly share code, notes, and snippets.

@dev001hajipro
Last active October 18, 2018 18:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dev001hajipro/9a3b56b002e41cd6ca0ae2f46f98a5c9 to your computer and use it in GitHub Desktop.
Save dev001hajipro/9a3b56b002e41cd6ca0ae2f46f98a5c9 to your computer and use it in GitHub Desktop.
Windows10_Racket_Install_tips (tls1.2 support)
#include <stdio.h>
#include <gtk/gtk.h>
// http://www.nslabs.jp/pango.rhtml
// gcc -Wall main.c -o main `pkg-config --cflags --libs gtk+-3.0`
static int on_destroy(GtkWidget* w, GdkEvent* e, void* d) {
gtk_main_quit();
return 0;
}
int main(int argc, char *argv[]) {
const char *str = "<span size='40000'><u>日本語</u> "
"<span font_family='Microsoft Sans Serif'>&#x0E19;&#x0E49;&#x0E33;</span></span>";
char *text = NULL;
PangoAttrList *attrs = NULL;
GError *error = NULL;
gtk_init(&argc, &argv);
if (!pango_parse_markup(str, -1, 0, &attrs, &text, NULL, &error)) {
printf("error:%s\n", error->message);
return 1;
}
GtkWidget* label = gtk_label_new(text);
gtk_label_set_attributes(GTK_LABEL(label), attrs);
GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_container_add(GTK_CONTAINER(window), label);
gtk_container_set_border_width(GTK_CONTAINER(window), 30);
gtk_widget_show_all(window);
g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(on_destroy), NULL);
gtk_main();
return 0;
}
// gcc -o hello.exe hello.c `pkg-config --cflags --libs gtk+-3.0`
#include <gtk/gtk.h>
int main(int argc, char *argv[]) {
gtk_init(&argc, &argv);
GtkWidget *dialog = gtk_message_dialog_new(
NULL,
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_OTHER,
GTK_BUTTONS_OK,
"Hello GTK!");
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
return 0;
}
#lang racket
; DrRacketのtext%自体が日本語入力をサポートしていない。
(require racket/gui
framework)
(define (main)
(define f
(new frame%
[label "editor"]
[width 200]
[height 200]))
(define c (new editor-canvas% [parent f]))
(define t (new text%))
(send c set-editor t)
(send f show #t))
(main)

https://github.com/racket/gui/blob/001c57b86c624ad367354d6bf168f55f82e79c20/gui-lib/mred/private/editor.rkt

gi-libの親はguiパッケージ

guiパッケージをraco pkg clone

rack pkg install git://github.com/racket/gui/?path=guiとしたら、Windows10ではディレクトリーが作成されず、 また、guiパッケージがconflictしているとエラーが発生しました。その後以下の方法でビルドが進みました。

update <dir> <pkg-name>コマンドの意味

raco pkg update <dir> <pkg-name>

guiパッケージは、Racket本体をビルドしたときにmain-distributionとして標準で依存関係となります。 main-distributionにはDrRacketなどもあります。

githubからguiパッケージのソースコードをcloneする場合は、標準でインストール済み(依存関係済み)の状態から、 新たにcloneするソースコードに向きを変える必要があります。そのため、raco pkg installではなく raco pkg updateになります。

また、Windows10の場合、以下のように、ソースコードを指定すると、https:ディレクトリーを作成しようとしてエラーが発生します。

raco pkg update --clone git://github.com/racket/gui/?path=gui

指定のディレクトリーにcloneするためには--cloneの引数に<dir>を追加します。

raco pkg update --clone gui git://github.com/racket/gui/?path=gui

これでもWindow10ではうまくいきません。代案として、<dir> <pkg-name>で行うとうまく来ます。 このは、https://pkgs.racket-lang.org/package/guiに登録されている 名称です。

よって、最終的に以下のように、clone先のディレクトリーをguiにして、pkg-nameがguiのものをアップデートするという コマンドを実行します。これでひとまずビルドが走り始めました。(一時間待機中...)

raco pkg update --clone gui gui

racketのビルド

Tutorial: Contributing to Racket には、 main-distributionのビルド方法も書かれています。DrRacketIDEなどをビルドする時の参考になります。

環境

  • Windows10 64bit
  • Build Tools for Visual Studio

この例ではC:\workspace_racketで作業します。

> git clone https://github.com/racket/racket.git
> nmake win32-in-place

SSLでエラーが出る場合

ライブラリーが不足しているので https://github.com/racket/libs から racket-win32-x86_64-3(最新)を入手。

racket/racket/lib
    libeay32.dll
    libiconv-2.dll
    longdouble.dll
    ssleay32.dll

Makefile修正

racket/Makefileのwin32-baseタスクの先頭行をコメントアウト このタスクは、WindowsでMakeするときに実行されて、上記ライブラリーが削除されます。

win32-base:
    #$(MAKE) win32-remove-setup-dlls <<< この行をコメントアウトした
    IF NOT EXIST build\config cmd /c mkdir build\config
    cmd /c echo #hash((links-search-files . ())) > build\config\config.rktd
    cmd /c racket\src\worksp\build-at racket\src\worksp ..\..\..\build\config $(JOB_OPTIONS) $(PLT_SETUP_OPTIONS)

何故コメントアウトするか

racketをビルド後、racket自身がracoコマンドでランタイムに必要な各種標準ライブラリーをネットワークから取得します。 この時racketの今ビルドされたライブラリーでgithubにHTTPS接続しますが、上記ライブラリーがないとtls1.2が使えません。 現在githubは、tls1.2より前のバージョンのHTTPS接続禁止しているため、エラーが発生します。

drracketのclone

通常のgit cloneではなく、raco pkg install --cloneを使います。

mkdir extra-pkgs
cd extra-pkgs
raco pkg install --clone https://github.com/racket/drracket
raco pkg show
> raco pkg show
Installation-wide:
 Package                 Checksum           Source
 drracket                d8dab5865c3560...  clone...=drracket
 main-distribution       a94ec086a48e7d...  catalog...ibution
 main-distribution-test  c1a62206635d76...  catalog...on-test
 [238 auto-installed packages not shown]
User-specific for installation "development":
 [none]

環境変数path

公式のRacketをインストールしている場合やそちらにパスを通している場合、現在ビルドしたracketやracoコマンドを 使うためにパスをC:\workspace_racket\racket\racket;などに変更します。

ビルド

 raco setup drracket

racoコマンドのメモ

racket\racket

 -G racket/etc コンフィグの指定
 -X racket/collects メインのcollectsディレクトリー指定
 -N raco run-fileの設定
 -l- `-l --`と同じ意味
 これでracoコマンドの呼び出しになる
 raco pkg install
		--no-setup この後 raco setupを実行しない
		--pkgs 指定のみインストールを行う行う
		--skip-installed インストール済みなら<pkg-source>をスキップ
		--scope installation OSのすべてのユーザー向けインストール
		--deps search-auto 問い合わせずに依存関係を探す
		main-distribution main-distribution-test
 
 
 
 
 ■racoコマンドのヘルプ表示
 racket\racket -G racket/etc -X racket/collects -N raco -l- raco pkg install --help

Native LibraryとDLL

Windows 64bit版のnative libraryは、https://github.com/racket/libsでpre-buildで公開されています。 Racketは、最終的にはこれらnative libraryを呼び出して描画などを行います。

draw-win32-x86_64

https://github.com/racket/libs/tree/master/draw-win32-x86_64 https://github.com/racket/libs/blob/master/draw-win32-x86_64/racket/draw/info.rkt

(define copy-foreign-libs (quote ("libjpeg-8.dll" "libcairo-2.dll" "libpango-1.0-0.dll" "libexpat-1.dll" "libpng14-14.dll" "zlib1.dll" "libfreetype-6.dll" "libintl-8.dll" "libfontconfig-1.dll" "libglib-2.0-0.dll" "libgobject-2.0-0.dll" "libgmodule-2.0-0.dll" "libgthread-2.0-0.dll" "libpangocairo-1.0-0.dll" "libpangowin32-1.0-0.dll" "libpangoft2-1.0-0.dll")))

myssink.dllとは?

db-win32-x86_64/db/

sqlite3.dll

gui

atkライブラリは、GTKのライブラリーでATK - Accessibility Toolkit https://github.com/racket/libs/tree/master/gui-win32-x86_64/racket/gui

libatk-1.0-0.dll

https://www.gtk.org/api/2.6/atk/index.html

GTK+のインストールでpangoも依存でインストール

https://www.gtk.org/download/windows.php

GTK+インストール

MSYS32でインストールすればWindowsでも使えます。 https://www.gtk.org/download/windows.php

GTK+と各種インストールをしたらpangocairoもインストールされました。

$ pkg-config --cflags pangocairo
-mms-bitfields -IC:/msys64/mingw64/include/pango-1.0 -IC:/msys64/mingw64/include/fribidi -IC:/msys64/mingw64/include/cairo -IC:/msys64/mingw64/include -IC:/msys64/mingw64/lib/libffi-3.2.1/include -IC:/msys64/mingw64/include/pixman-1 -IC:/msys64/mingw64/include -IC:/msys64/mingw64/include/freetype2 -IC:/msys64/mingw64/include -IC:/msys64/mingw64/include/harfbuzz -IC:/msys64/mingw64/include/glib-2.0 -IC:/msys64/mingw64/lib/glib-2.0/include -IC:/msys64/mingw64/include -IC:/msys64/mingw64/include/libpng16 -IC:/msys64/mingw64/include

text% クラスは、gui-libで実装されている

https://github.com/racket/gui/tree/master/gui-lib https://pkgs.racket-lang.org/package/gui-lib

main-distributionなので、DrRacketと同様にracoからcloneできるはず。

参考資料

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment