최초작성 |
2006/05/14 22:56:37 |
참고
이 페이지를 읽기전에 cmake 와 MSVC와같이쓰기 를 읽어두자..
목적
cmake 가 중간파일들을 지저분하게 생성하길래 소스디렉토리가 아닌 다른 디렉토리, 예를들어 ./build 등을 쓰게 되었는데 이러다 보니 M-x compile 로 make 또는 nmake 를 돌리기가 곤란하더라. 그래서 소스 코딩중에 make 파일의 위치가 지정되어 있는경우에 한해서, f7 키를 누르면 빌드 디렉토리로 이동하고 커맨드라인을 통해 빌드를 하는 함수를 급조했다.
nmake 러너
처음엔 C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\vsvars32.bat 의 환경설정들을 모두 emacs 안으로 가져올려고 이런 함수까지 짜서 노가다를 했었는데,
(defun add-env-once (variable value) "환경변수에 값을 한번만 추가" (let ((old-value (or (getenv variable) ""))) (if (string-match value old-value) old-value (setenv variable (concat value old-value)))))
돌려보니 cl.exe 가 에러를 뱉더라. 뭔가 초기설정값을 빠트린 모양인데.. 조금 찾아보다가 방향을 바꿔서 vsvars32.bat 를 실행후 nmake 를 돌리는 배치파일을 만들어버렸다. run-nmake.bat 라는 이름으로 적당한데 던져두자
@echo off @call "%VS80COMNTOOLS%vsvars32.bat" @echo on nmake.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
아.. 그리고 vsvars32.bat 에 PSDK 세팅을 추가하는것일 잊지말자. 나는 어쩌다 보니 cmake path 도 여기서 잡게 되었다..
@rem cmake PATH 추가 @set PATH=C:\Program Files\CMake 2.2\bin;%PATH% @rem PSDK 설치후 설정 적용 @set PATH=C:\Program Files\Microsoft Platform SDK\Bin;%PATH% @set INCLUDE=C:\Program Files\Microsoft Platform SDK\Include;%INCLUDE% @set LIB=C:\Program Files\Microsoft Platform SDK\Lib;%LIB%
make 위치 지정
make 파일의 위치가 프로젝트마다 다르니.. 이건 dirvars.el 를 통해 해결하기로 했다. 적당한 위치의 .emacs-dirvars 에 cmake-nmake-location 설정이 들어있어야만 한다.
cmake-nmake-location: "d:/src/scratch/sigslot/vc2005ex/build/Makefile"
cmake 를 이용해 뽑은 출력이 NMake 의 Makefile 이 아니고 Unix 스타일의 Makefile 이라면, 즉 gcc 또는 mingw 환경이라면 cmake-make-location 변수를 세팅한다.
cmake-make-location: "d:/src/scratch/foo/bar/build/Makefile"
코드
|2006/10/13
아래쪽 yoonkn-build 를 이용하자. 이 yoonkn-compile2 를 작성하는 시점에서는 cmake 에 대해 너무나 몰랐다|
후럴.. 코드가 너무 더러운데.. 별수 없지. 몇가지 적어두면.. f7 을 눌렀을때 버퍼 이동없이 바로 빌드가 되도록 하려고 했는데 실패했다. save-어쩌구 함수들을 살펴보긴 했는데 잘 안되더라. 그래서 그냥 CMakeLists.txt 파일을 열도록 수정해버렸다. 이게 나름대로 편리하다.
cmake-make-location 또는 cmake-nmake-location 이 모두 nil 이면 일반적인 M-x compile 을 실행한다. 혹시 필요하면 MSVC와같이쓰기 의 내용도 적용해두자.
*.sln 를 지정하고 싶은 경우도 있을텐데.. visual studio 2003 의 devenv.exe 는 커맨드라인으로 빌드가 가능한데 2005 express 의 vcexpress.exe 는 그 옵션이 안먹더라.. 쉣.. 후에 방법을 찾거나 MSBuild 사용법을 익히게 되면 그경우도 고려해두자. 혹시나 cmake 로 *.sln 을 뽑아냈다면 IDE 를 통해 빌드를.. 헐..
매크로를 쓰면 코드를 깔끔하게 뺄수 있을거 같은데.. 이건 나중에.
(setq cmake-make-location nil) (setq cmake-nmake-location nil) (defun yoonkn-compile2 () (interactive) (cond ((not (null cmake-make-location)) (progn (set-buffer (find-file (concat (file-name-directory cmake-make-location) "CMakeLists.txt"))) (let ((compile-command "make -k ")) (call-interactively 'compile)))) ((not (null cmake-nmake-location)) (progn (set-buffer (find-file (concat (file-name-directory cmake-nmake-location) "CMakeLists.txt"))) (let ((compile-command "run-nmake ")) (call-interactively 'compile)))) (t (call-interactively 'compile)) )) (global-set-key [f7] 'yoonkn-compile2) ; visual studio 처럼 f7 매핑 (global-set-key [(f4)] 'next-error) ; M-x grep 에서도 쓸만하다 (global-set-key [(shift f4)] 'previous-error)
테스트..
사무실 Subversion 에 접근이 안되서.. 뭔가 열심히 적긴 적었는데 집의 msvc 2005 express 에서만 테스트를 해봤다. mingw 나 다른 환경에서도 잘 되는지는 아직...
2006/10/13 재정리, yoonkn-build 함수 작성
윗글을 쓸때는 cmake 의 out of source 하는 방법을 잘 몰랐는데 그냥 써보니 잘 되더라. 그래서 빌드하는 방법을 다소 수정했다.
;; 내가 원하는 빌드 과정을 간단히 적으면 ;; ;; 1. 어떤 코드를 수정을 하다가 빌드를 하려는 마음이 생기면 ;; 2. Makefile ( 또는 *.sln ) 이 존재하는 디렉토리로 가서 ;; 3. 적절한 빌드 명령 (make 또는 devenv) 을 내리고 ;; 4. 원래의 코드 작성으로 돌아온다. ;; ;; 위와 같다. ;; 아래 함수는 그런 일을 해주는데 간단히 설명을 적으면 ;; ;; .emacs-dirvars 등을 통해 yoonkn-build-option 의 값을 ;; (:wc "c:/tmp/a/build" :cmd "make -k ") ;; 이런식으로 지정을 해두고 아래 함수를 실행하면 ;; 현재 작업 디렉토리를 기억해두고 wc 로 지정된 디렉토리로 가서 ;; cmd 로 지정된 명령을 실행후 기억해둔 작업디렉토리로 돌아오게 된다. (defun yoonkn-build () (interactive) (if (and (boundp 'yoonkn-build-option) (not (null yoonkn-build-option))) (let ((pwd (substring (pwd) (length "Directory "))) (wc (getf yoonkn-build-option :wc)) (compile-command (getf yoonkn-build-option :cmd))) (unwind-protect (progn (cd wc) (call-interactively 'compile)) (cd pwd))) (call-interactively 'compile)))
예를들어 소스 트리 구조가 이렇다고 해보자
c:/tmp/a : 프로젝트루트 c:/tmp/a/src : 소스들 c:/tmp/a/build : 빌드 디렉토리
이상태에서 c:/tmp/a/build 를 빌드 트리로 이용하려고 하면 c:/tmp/a/.emacs-dirvars 등에 아래 내용을 추가하고
yoonkn-build-option: (:wc "c:/tmp/a/build" :cmd "make -k ")
.emacs-dirvars 가 적용된 버퍼내에서 yoonkn-build 함수를 실행하면 된다.
yoonkn-build 와 msvc8
이따위로 적어서 쓰자
yoonkn-build-option: (:wc "D:/src/tcpmp_yoonkn_modified" :cmd "run-devenv /build debug tcpmp.sln")
- run-devenv.bat
@call "%VS80COMNTOOLS%vsvars32.bat" @devenv.com %1 %2 %3 %4 %5 %6 %7 %8 %9
흠. gtags 등을 돌리려고 할때는 요렇게.. msvc 내에서 pre build 세팅해도 되지만 pre build 는 가능하면 안쓰는게 편하더라.
@echo off call "%VS80COMNTOOLS%vsvars32.bat" IF not EXIST "GTAGS." ( gtags ) ELSE ( global -u ) devenv.com %1 %2 %3 %4 %5 %6 %7 %8 %9 @echo on
msvc IDE 가 떠있으면 *.ncb 파일을 열다가 에러 나는데.. gtags 에 *.ncb 를 skip 하도록 하는 방법을 아직 모르겠다. conf 내의 설정에 skip 이 있긴 한데 패턴을 받지 않고 fullname 을 받는듯?
