Windows上のEmacsで一発でコンパイルする
前回書いたプログラムをもうちょっとまともに動くようにした。
以下のElispで、Emacsでファイルを開きながら、一発でコンパイル出来る。
makefileを作るほどでもない場合に利用出来る。
(defun is-directory(e) (car (directory-files "." 1 (format ".*%s" e)))) (defun mk-dir(e) (shell-command-to-string (format "mkdir %s" e))) (defvar bcc32-compile-files) (defvar bcc32-output-dir) (defvar bcc32-DxLib-dir) ;;初期値 (setq bcc32-DxLib-dir "C:\\borland\\directx\\DxLib_BCC\\bcc") (setq bcc32-compile-files "main") (setq bcc32-output-dir "debug") (setq bcc32-result-name "result") (defun bcc32() (interactive) (let* ( (file-names (read-string "function's files: " bcc32-compile-files)) (output-dir (read-string "output-dir: " bcc32-output-dir)) (result (read-string "result name: " bcc32-result-name)) (result-name (format "%s.exe" result)) (exe-name (format "%s\\%s.exe" output-dir (car (split-string file-names)))) (command-string (format "bcc32 -W -3 -O1 -w- -AT -pc -H- -k -b -v -y -n%s -I%s %s" output-dir bcc32-DxLib-dir file-names)) ) (if (not (is-directory output-dir)) (mk-dir output-dir)) (message "%s\n%s" command-string (shell-command-to-string command-string)) (shell-command-to-string (format "rename %s %s" exe-name result-name)) ; logs (setq bcc32-compile-files file-names) (setq bcc32-output-dir output-dir) (setq bcc32-result-name result) )) (defun bcc32-exe() (interactive) (shell-command-to-string (format "cd %s & %s.exe & cd .." bcc32-output-dir bcc32-result-name)) )
bcc32-DxLib-dir にDxLib.hのあるディレクトリを指定することを忘れないように。
M-x bcc32 で、コンパイル。
このコンパイルは、かなり手軽に出来るもので、設定ファイル等を用いない。
継続的なプロジェクトでは、makefileを作ればいい話だが、試し書きしているときに、役に立つ。
コンパイル前にまず、該当ファイルのひとつを開いておこう。そのディレクトリ内のファイルをまとめてコンパイルするイメージだ。
実行すると、funtions'fileを聞いてくる。
これに、関数定義のあるファイル名を、拡張子抜きで、空白区切りで渡す。
例:
main function
(main.cpp と function.cpp が存在する場合)
次にoutput-dirを聞いてくる。
これは出力先のフォルダ名の指定。
もし存在しなければ、作成される。
さらに完成ファイルのexe名を聞いてくる。
ここで設定した名前で、exeファイルが出来上がる。
これらの設定値は全て記憶され、Emacsを閉じない限り、保存される。
もしその結果としてエラーが出た場合には、mini-bufferに表示される。
もしエラーメッセージの全文が見たければ、*message*バッファーだ。
M-x bcc32-exe で実行。
bcc32を実行した直後に実行するのがおすすめ。