HSPコンパイラモジュール hspcompiler.hsp

/*
HSPコンパイラモジュール
Copyright(C) SekiSekki
Version:1.0.0
HSPスクリプトエディタを使わずにHSPのコンパイル・実行・実行ファイル生成を行うことができます。

※ライセンス表示
	  当ソースコードのライセンス表示は以下のとおりです。
	  ライセンスは3条項BSDライセンスに相当します。
	  (凡例: #著作権表示 *本条件 +免責条項)
	-----------------------------------------------------------------------
	# Copyright (c) 2020,SekiSekki
	  All rights reserved.

	  ソースコード形式かバイナリ形式か、変更するかしないかを問わず、
	  以下の条件を満たす場合に限り、再頒布および使用が許可されます。

	* ソースコードを再頒布する場合、上記の著作権表示、本条件一覧、
	  および下記免責条項を含めること。

	* バイナリ形式で再頒布する場合、頒布物に付属のドキュメント等の資料に、
	  上記の著作権表示、本条件一覧、および下記免責条項を含めること。

	* 書面による特別の許可なしに、本ソフトウェアから派生した製品の宣伝または
	  販売促進に、SekiSekki(SekiSekki.net)の名前またはコントリビューターの名前を
	  使用してはならない。

	+ 本ソフトウェアは、著作権者およびコントリビューターによって「現状のまま」
	  提供されており、明示黙示を問わず、商業的な使用可能性、および特定の目的に対する
	  適合性に関する暗黙の保証も含め、またそれに限定されない、いかなる保証もありません。
	  著作権者もコントリビューターも、事由のいかんを問わず、 損害発生の原因いかんを
	  問わず、かつ責任の根拠が契約であるか厳格責任であるか(過失その他の)不法行為で
	  あるかを問わず、仮にそのような損害が発生する可能性を知らされていたとしても、
	  本ソフトウェアの使用によって発生した(代替品または代用サービスの調達、
	  使用の喪失、データの喪失、利益の喪失、業務の中断も含め、またそれに限定されない)
	  直接損害、間接損害、偶発的な損害、特別損害、懲罰的損害、または結果損害について、
	  一切責任を負わないものとします。
	-----------------------------------------------------------------------
*/

/*-------HDL 説明事項------------
%dll
hspcompile
HSPコンパイラモジュール
HSPスクリプトエディタを使わずにHSPのコンパイル・実行・実行ファイル生成を行うモジュールです。

%port
Win

%author
Copyright(C) SekiSekki

%url
https://sekisekki.net/

%note
当モジュールをcommonフォルダにコピーして、#include でインクルードすることで使用可能。
commonフォルダ内にこのファイルが存在するとき、HSP Docs Libraryに自動的に命令が登録されます。
実行ファイルのあるディレクトリにHSPCMP.dllを設置する必要があります。
%group
外部拡張モジュール
*/

/*///////////////////////////////////////////

%index
hspcompile(sample)
HSPコンパイラモジュール(概要とサンプルスクリプト)

%inst
概要
HSPコンパイラモジュールモジュール

%sample
;サンプルスクリプト

#include "hspcomplier.hsp"
//SAMPLE

souecepath="C:\\hsp351\\sample\\demo\\demo.hsp"
RuntimePath="C:\\hsp351"

hspcompile_SetRuntimeDirectory RuntimePath
mes "ランタイムパスの設定:"+stat

hspcompile souecepath,0,1//コンパイル+実行(デバッグウインドウ付)
mes "デバッグウインドウありでコンパイル実行:"+stat
mes "メッセージの取得\n"+hspcompile_GetConsoleMessage()//コンパイラからのメッセージを呼び出す

hspcompile souecepath,1//実行ファイル作成
mes "実行ファイルの作成:"+stat
mes "メッセージの取得\n"+hspcompile_GetConsoleMessage()//コンパイラからのメッセージを呼び出す

%href
hspcompile_SetRuntimeDirectory
hspcompile
hspcompile_GetConsoleMessage
%-------------------*/
#module
#include "hspcmp.as"
*init
	initf=1
	sdim mesbuf,$10000
	sdim rtname,256
	
	runtimedir=""+dir_exe+"\\"     ;ランタイムフォルダ名
	debugexename=""+dir_exe+"\\hsp3.exe";デバッグ実行ファイル名
	objname="start.ax" ; オブジェクトファイル名
	CommonDirName=""//"common\\" ;コモンファイルディレクトリ名
	packfilename="packfile";パックファイル名
	hsptmpname="hsptmp";一時ファイル名
	objtmpname="obj";一時ファイル名
	return
#deffunc hspcompile_SetRuntimeDirectory str p1
/*---------HDL 説明事項----------
%index
hspcompile_SetRuntimeDirectory
実行ファイル自動生成で使用するhsprtのあるディレクトリの指定

%inst
実行ファイル自動生成で使用するhsprtのあるディレクトリを指定します。
commonディレクトリの設定がされていない場合は同じフォルダにcommonディレクトリがあるものとして、commonディレクトリの登録を行います。

%prm
str P1
P1:hsprtのあるディレクトリ名
)

val:戻り値
 int:0 正常終了
%href
%-------------------*/
	if initf=0:gosub *init
	runtimedir=p1
	if (peek(runtimedir,strlen(runtimedir)-1)='\\'|peek(runtimedir,strlen(runtimedir)-1)='/'){}else{
		runtimedir+="\\"
	}
	if CommonDirName="":hspcompile_SetCommonDirectory runtimedir+"\\common\\"//commonディレクトリの自動追加
	return 0
#deffunc hspcompile_SetCommonDirectory str p1
/*---------HDL 説明事項----------
%index
hspcompile_SetCommonDirectory
commonディレクトリの指定

%inst
コンパイル時にインクルードするcommonディレクトリを指定します。

%prm
str P1
P1:commonディレクトリ名
)

val:戻り値
 int:0 正常終了
%href
%-------------------*/
	if initf=0:gosub *init
	CommonDirName=p1
	if (peek(CommonDirName,strlen(CommonDirName)-1)='\\'|peek(CommonDirName,strlen(CommonDirName)-1)='/'){}else{
		CommonDirName+="\\"
	}
	return 0
#deffunc hspcompile_SetDebugExeName str p1
/*---------HDL 説明事項----------
%index
hspcompile_SetDebugExeName
デバッグ実行時に使用するHSP実行ファイル名指定

%inst
デバッグ実行時に使用するHSP実行ファイル名を指定します。

%prm
str P1
P1:HSP実行ファイル名
)

val:戻り値
 int:0 正常終了
%href
%-------------------*/
;デバッグ実行時に使用するHSP実行ファイル名を指定します。
;P1 HSPデバッグ実行ファイル名
	if initf=0:gosub *init
	debugexename=p1
	return
#deffunc hspcompile_SetCommandLine str p1
/*---------HDL 説明事項----------
%index
hspcompile_SetCommandLine
デバッグ実行時に使用するコマンドラインの指定

%inst
デバッグ実行時に使用するコマンドラインを指定します。

%prm
str P1
P1:コマンドラインテキスト
)

val:戻り値
 int:0 正常終了
%href
%-------------------*/
	CommandLine=p1
	return
#deffunc hspcompile str p1,int p2,int p3,int p4
/*---------HDL 説明事項----------
%index
hspcompile
HSPのコンパイル、実行ファイル自動作成を行う

%inst
HSPのコンパイル、実行ファイル自動作成を行います。
この命令を実行する前に、hspcompile_SetRuntimeDirectoryで
実行ファイル自動生成で使用するhsprtのあるディレクトリを指定する必要があります。
コンパイル+実行のときは"hsp3.exe"が実行ファイルと同じディレクトリに存在する必要があります。
実行ファイル自動作成のときは"hsprt"がカレントディレクトリと同じディレクトリに存在する必要があります。

%prm
str P1,int P2,int P3,int P4
 P1:ソースファイル名
 P2:動作モード
  0 デバッグ
  1 実行ファイルの自動生成
  2 コンパイルのみ
 P3: (P2がデバッグのときのみ適用されます)
  1 デバッグウインドウの表示
 P4:0 一時ファイルを削除する
   1 一時ファイルを削除しない
 val:戻り値
 int:0 正常終了
 int:-1 実行に失敗
 int:-2 コンパイルに失敗
%href
%-------------------*/
	if initf=0:gosub *init
	st=-3
	fname=p1 ; スクリプトファイル名
	hsc_ini fname
	hsc_objname objname
	hsc_compath CommonDirName
	if p2=0|p2=2{
		hsc_comp 1,0,p3 ; デバッグコンパイル
	}else{
		hsc_comp 0,4,0 ; リリースコンパイル
	}
	res=stat
	if res!=0 {//コンパイルに失敗
		hsc_getmes mesbuf
		return -2
	}
	hsc3_getruntime rtname, objname ; ランタイム名を取得
	if p2=0{
		cmdexe = "\""+debugexename+"\" "+objname+" "+CommandLine
		hsc3_run cmdexe ; ランタイムを実行する
		hsc_getmes mesbuf
		st=0
	}else:if p2=2{
		hsc_getmes mesbuf
		st=0
	}else{
		hsc3_make runtimedir,1
		hsc_getmes mesbuf
		if instr (mesbuf,0,"Make custom execute file")!=-1{
			st=0
		}else{
			st=-1
		}
	}
	//一時ファイルの削除
	if p4=0{
		exist packfilename
		if strsize>=0:delete packfilename
		exist objname
		if strsize>=0:delete objname
		exist hsptmpname
		if strsize>=0:delete hsptmpname
		exist objtmpname
		if strsize>=0:delete objtmpname
	}
	return st
#defcfunc hspcompile_GetConsoleMessage
/*---------HDL 説明事項----------
%index
hspcompile_GetConsoleMessage
コンソールメッセージの取得

%inst
コンソールメッセージを取得します。
コンパイルエラーの原因と発生箇所等を取得することができます。

%prm
()
val:戻り値
 str:メッセージ

%href
%-------------------*/
	return mesbuf
#global