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を実行した直後に実行するのがおすすめ。