Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MinGWでサクラエディタをビルドできるようにメイクファイルを更新する #351

Merged

Conversation

berryzplus
Copy link
Contributor

目的

最近いれた修正の影響で、Makefileを使ったビルドができなくなっています。
とりあえず、ビルドできる状態に戻します。 Issue #349

確認方法

  1. MinGW64のビルド環境を用意する
    自分は pleiades 4.6 Neon の C++ Full 版を使いました。
  2. コマンドプロンプトで https://github.com/sakura-editor/sakura.git をクローンしたフォルダを開く
  3. 1で用意した mingw の bin フォルダを path に指定する
    自分の場合 D:\eclipse4.6 に解凍してるので path=D:\eclipse4.6\eclipse\mingw\bin;%path% でした。
  4. cd sakura_core ←フォルダ移動
  5. mingw32-make githash stdafx sakura_rc.o ←並行ビルドできないものを先に済ませる
  6. mingw32-make -j4 ←マルチスレッド実行を指定してビルド開始。
    -j4の数字は最大プロセス数なので、CPUコアに応じて増減させます。
  7. sakura.exe を起動していたら「全終了」で落としてください。
  8. .\sakura.exe で MinGW 版のEXEが起動します。
    現状「起動できること」以上の確認はできません。そこ以降は今後の課題。

@berryzplus
Copy link
Contributor Author

追記
このMakefileはコンフィグ動作を含まないので、
git がパスに入った状態でもちゃんとビルドできます。

コミットリストに kobake さんのコミットが含まれている理由は、
#306 のコミットをベースに作業したからです。
修正の内容はコミットログに書いていますので気になる方はコミットログ見てください。

@@ -222,7 +222,9 @@ const char* stristr_j( const char* s1, const char* s2 )
// 互換 //
// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- //

#if (defined(_MSC_VER) && _MSC_VER<1400) || defined(__MINGW32__) //VS2005より前なら
#if (defined(_MSC_VER) && _MSC_VER<1400) //VS2005より前なら
|| (defined(__MINGW32__) && defined(MINGW_HAS_SECURE_API) && MINGW_HAS_SECURE_API)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

\ での行継続が必要ですね。
あと、MinGWの判定合ってますか?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

レビューありがとうございます。

\ での行継続が必要ですね。

ビルドが通ったのは _MSC_VER が定義されていなかったからですね。

あと、MinGWの判定合ってますか?

MinGW側の判定はたぶん合ってると思います。
定義するときは -DMINGW_HAS_SECURE_API=1 としますが、
0とされたときに正しく動くようにする意図です。

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sec_api/tchar_s.h などを見ると、#ifdef で判定しています。
そして、MinGW自身がセキュア系関数を持っているはずです。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

デバッグできるようにするために設定をいじっていてMinGWの判定式の誤りに気付きました。

#if (defined(_MSC_VER) && _MSC_VER<1400) \
	|| (defined(__MINGW32__) && (!defined(MINGW_HAS_SECURE_API) || MINGW_HAS_SECURE_API != 1)) //VS2005より前なら

MINGW_HAS_SECURE_APIが未定義または1以外」が正しい条件でした。
すでにマージ済みなので別PRを投げます。

「本来あるべき」を考えると、これは「サポートしないビルド環境」を示す条件なので 「#if ごと削除が妥当」と思っています。./configureautomakeに相当するもの(cmake)が準備できるまでの暫定処置と考えています。

@@ -144,7 +144,8 @@ int my_strnicmp( const char *s1, const char *s2, size_t n );
// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- //

// VS2005以降の安全版文字列関数
#if (defined(_MSC_VER) && _MSC_VER<1400) || defined(__MINGW32__) //VS2005より前なら
#if (defined(_MSC_VER) && _MSC_VER<1400) //VS2005より前なら
|| (defined(__MINGW32__) && defined(MINGW_HAS_SECURE_API) && MINGW_HAS_SECURE_API)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

上と同様。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

上と同様、修正します。

# include <sec_api/tchar_s.h>
# include <sec_api/wchar_s.h>
# include <sec_api/string_s.h>
# include <sec_api/stdio_s.h>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これらのヘッダーファイルは tchar.h などから自動的にインクルードされるものであって、明示的にインクルードするものではないのではないと思います。VCにもあるファイルをインクルードしておけば #ifdef を使わずともVCと同じようにコンパイルできるはずですし。
_mingw.h も普通は windows.h をインクルードしておけばよいと思います。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

自動インクルードされてくれる自身がなかったので明示的に書きました。
外してみてビルド通りそうなら外してしまおうと思います。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#ifdef __MINGW32___ のブロックごと外してビルドできましたので外してしまいました。

kobake and others added 15 commits August 20, 2018 20:33
swprintf_s関数が見つからないという以下エラーの対応

io/CFileLoad.cpp:93:52: error: 'swprintf_s' was not declared in this scope
  swprintf_s(buf, _countof(buf), L"%I64u", megabytes);
…られる記述を訂正する

rvalueの非const参照を宣言してはならないという以下エラーの対応

macro/CMacroFactory.cpp:92:37: error: invalid initialization of non-const reference of type 'std::_List_iterator<CMacroManagerBase* (*)(const wchar_t*)>&' from an rvalue of type 'std::__cxx11::list<CMacroManagerBase* (*)(const wchar_t*)>::iterator {aka std::_List_iterator<CMacroManagerBase* (*)(const wchar_t*)>}'
  auto& c_it = m_mMacroCreators.begin();
sakura-editor#303 CNativeA/CNativeW に対する AppendString のフォーマット書式対応版メソッドを準備

以下2ファイルのコンパイルエラーの対応

mingw32-make mem/CNativeW.o
mingw32-make mem/CNativeA.o
古いMinGWのWindowsSDKに含まれていないCOMのIDを独自に定義している。
GNU 6.2.0には既に取り込まれているので、定義があるとビルドエラーになる。
@berryzplus berryzplus force-pushed the feature/update_mingw_makefile branch from 8b9e422 to 8789964 Compare August 20, 2018 11:44
@berryzplus
Copy link
Contributor Author

レビューをおねがいします。

sprintf_s(cbuf, _countof(cbuf), "AppendStringF error. errno = %d", e);
throw std::exception(cbuf);
DEBUG_TRACE(L"AppendStringF error. errno = %d", e);
throw std::exception();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これは visual studio での動作を変えてしまうのでは?

Copy link
Contributor Author

@berryzplus berryzplus Aug 23, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

目的はビルドできるようにすることなので、コードの目的を変えない範囲で変更しています。
変更前)エラー情報を例外に詰めて投げる・・・catchするコードがないのでそのまま落ちる
変更後)エラー情報をデバッガに出力しエラーを投げる・・・catchするコードがないのでそのまま落ちる

std::exceptionのコンストラクタがconstexprでない文字列を受け付けないのが原因なので、恒久対応としては専用の例外クラスを自作することになると思っています。

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

チケットを作っておいてもらえますか?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#356 作りました。

@m-tmatma
Copy link
Member

mingw32-make clean すると以下のエラーが出ました。

make (e=2): 指定されたファイルが見つかりません。
Makefile:451: recipe for target 'clean' failed
mingw32-make: *** [clean] Error 2

mingw32-make githash を実行した後にもう一度 mingw32-make githash すると以下のエラーが表示されます。
githash.bat は Visual studio で実行した場合やコマンドラインで実行した場合は二回実行しても
以下のエラーが表示されてないので mingw32-make から実行された場合に状況が異なっているのだと思います。

パラメーターの形式が誤っています - "sakura_core\githash.h.tmp"
../sakura_core\githash.h was not updated.

またビルド方法を markdown にまとめてほしいです。

@m-tmatma
Copy link
Member

libwinpthread-1.dll のパスが通っていないと起動できない点を記載する必要があると思います。

また sakura.exe は起動できましたが、テキストの編集画面は出ませんでした。
出ましたか?

@berryzplus
Copy link
Contributor Author

このPRの目的はビルドできるようにすることです。

mingw32-make clean すると以下のエラーが出ました。

ビルドできないことに対する対処なのでcleanには手を入れてません。
ぼくが知る限り、昔からそうです。
今回のPRのスコープ外です・・・簡単に直せないか試してみます。

パラメーターの形式が誤っています - "sakura_core\githash.h.tmp"
../sakura_core\githash.h was not updated.

最後の行しか見ていませんでした。
1回目 was updated と出ますが「パラメータの形式が誤ってます」も出るみたいです。
調査して対応します。

またビルド方法を markdown にまとめてほしいです。

あとでコミット追加します。準備できたら声かけますのでよろしくお願いします。

@berryzplus berryzplus changed the title MinGWでサクラエディタをビルドできるようにメイクファイルを更新する WIP MinGWでサクラエディタをビルドできるようにメイクファイルを更新する Aug 23, 2018
@berryzplus
Copy link
Contributor Author

libwinpthread-1.dll のパスが通っていないと起動できない点を記載する必要があると思います。

このPRのスコープ外と考えていました。
markdownの説明に追記しときます。

また sakura.exe は起動できましたが、テキストの編集画面は出ませんでした。
出ましたか?

出ませんでした。
このMakefileはRelease版しか作れないので、デバッグでの原因調査もまだしていません。
このPRのスコープ外と考えています。
「とりあえずexeができる」が目標到達点です。

@berryzplus
Copy link
Contributor Author

mingw32-make clean すると以下のエラーが出ました。

ビルドできないことに対する対処なのでcleanには手を入れてません。
ぼくが知る限り、昔からそうです。
今回のPRのスコープ外です・・・簡単に直せないか試してみます。

パス区切りがスラッシュになっていることが原因でした。
スラッシュを含むパスを del などのコマンドに渡すにはダブルクォートで囲う必要があります。
元々はMacからクロスコンパイルするためのMakefileのようなんですが、暫定対処としてwindowsでビルド&クリーンができるようにしました。

@berryzplus berryzplus changed the title WIP MinGWでサクラエディタをビルドできるようにメイクファイルを更新する MinGWでサクラエディタをビルドできるようにメイクファイルを更新する Aug 23, 2018
@m-tmatma
Copy link
Member

あとでコミット追加します。準備できたら声かけますのでよろしくお願いします。

別にチケット作ってもいいですし、
#349 の説明に項目足すのでもいいです。

@m-tmatma
Copy link
Member

m-tmatma commented Aug 23, 2018

元々はMacからクロスコンパイルするためのMakefileのようなんですが、暫定対処としてwindowsでビルド&クリーンができるようにしました。

直っているのは確認しましたが、贅沢をいうと
mingw32-make clean した後に mingw32-make clean すると
以下のようなメッセージが出るのも直してほしいです。

.\sakura_core\sakura.exe が見つかりませんでした。

@m-tmatma
Copy link
Member

最後の行しか見ていませんでした。
1回目 was updated と出ますが「パラメータの形式が誤ってます」も出るみたいです。
調査して対応します。

直っているのを確認しました。

@@ -433,7 +433,7 @@ Funccode_enum.h: $(HEADERMAKE) Funccode_x.hsrc
$(HEADERMAKE) -in=../sakura_core/Funccode_x.hsrc -out=../sakura_core/Funccode_enum.h -mode=enum -enum=EFunctionCode

githash:
cmd /c $(CURDIR)/../sakura/githash.bat ../sakura_core
cmd /c $(CURDIR)/../sakura/githash.bat ..\\sakura_core
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

githash.bat の中で / を置換する方法でもいいと思います。

@m-tmatma
Copy link
Member

またビルド方法を markdown にまとめてほしいです。

確認しました。

@berryzplus
Copy link
Contributor Author

mingw32-make clean した後に mingw32-make clean すると
以下のようなメッセージが出るのも直してほしいです。
.\sakura_core\sakura.exe が見つかりませんでした。

対応しました。

delコマンドが出しているメッセージでした。
削除対象のファイル群をまとめてdelに渡していたのを、1ファイルずつ存在確認しながら削除するように書き換えました。ファイル削除の体感速度はあまり変わってないように思います。(変更内容からすると遅くなるはず・・・。)

@m-tmatma
Copy link
Member

対応しました。

確認しました。

これもスコープ外なのかもしれませんが、
mingw32-make clean しても以下ファイルは削除されませんでした。

  • sakura_core\Funccode_define.h
  • sakura_core\Funccode_enum.h
  • sakura_core\githash.h

@berryzplus
Copy link
Contributor Author

これもスコープ外なのかもしれませんが、
mingw32-make clean しても以下ファイルは削除されませんでした。
•sakura_core\Funccode_define.h
•sakura_core\Funccode_enum.h
•sakura_core\githash.h

必要だと思ったので対応しました。
VC++側プロジェクト設定が上記ファイルの削除に未対応なのは別件としたいです。

@m-tmatma
Copy link
Member

必要だと思ったので対応しました。
VC++側プロジェクト設定が上記ファイルの削除に未対応なのは別件としたいです。

確認しました。

@berryzplus berryzplus merged commit f3825cf into sakura-editor:master Aug 25, 2018
@berryzplus berryzplus deleted the feature/update_mingw_makefile branch August 25, 2018 07:19
@m-tmatma m-tmatma added the MinGW MinGW label Aug 25, 2018
@m-tmatma m-tmatma added this to the next release milestone Sep 10, 2018
@ds14050 ds14050 added the MinGW MinGW label Sep 18, 2018
HoppingTappy pushed a commit to HoppingTappy/sakura that referenced this pull request Jun 11, 2019
…ingw_makefile

MinGWでサクラエディタをビルドできるようにメイクファイルを更新する
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
MinGW MinGW
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants