반응형

기본 키 맵 해제

 VS Code로 사실 충분히 사용을 하고 있지만, PyCharm의 명성을 듣고 있던 터라 개인적으로 한번 사용을 해보게 되었다. 그런데, 키 맵이 범상치 않았다. 일반적인 편집 키인 Ctrl + a 라던가 Ctrl + c 같은 윈도우에서 사용하는 일반적인 단축키가 먹히지 않았다.

 

 검색을 하던중 알게 된 것은 PyCharm의 기본 플러그인으로 Vim 으로 인해서 기존의 원도우 단축키가 먹히지 않았었다. 따라서 플러그인 설정을 해제하면, 사용할 수 있다.

 

 근데, vim 플러그인이 기본으로 활성화 되어 있다는 것은 Vim 단축키가 개발에 편리하니 한 것 아닐까 하는 생각이 든다.

참조 자료

반응형

'각종 툴' 카테고리의 다른 글

CMake 익히기 : 기초문법 (2)  (0) 2018.02.21
CMake 익히기 : 기초문법 (1)  (0) 2018.02.19
CMake : 공식예제 step1 해보기  (0) 2017.12.11
반응형

CMake 익히기 : 기초문법 (2)

작성 배경

 CMake의 가장 큰 장점은 C/C++ 크로스 플랫폼에 빌드를 할 수 있다. 그러나 임베이디드의 대부분을 차지하는 리눅스 환경의 경우 적당한 빌드 시스템이 CMake만한게 없다는 것도 함정이다. 또한 다른 사람이 만들어 놓은 것을 사용하기는 쉽지만, 막상 규모가 조금 되는 프로그램을 만들려고 하면, 쉽지 않다. 이 때문에 간단하게나마 문법을 조금씩 정리한다.



CMake 기초문법


end가 붙은 키워드의 arg

 end키워드가 붙은 경우(endif, endfunction, endmacro, while, 등)에 앞의 arg를 동일하게 적어 줘서 여러 키워드가 중첩이 될 경우 구분할 수 있는 역할을 할 수 있다. 하지만 붙이지 않아도 된다.



매크로(macro)

 CMake에서 매크로는 문법상 함수와 동일하다. 다만, 동작 방식에서 차이가 있다. 함수의 경우 메모리에 동적으로 생성되어 작동하는 반면 매크로는 C의 매크로처럼 호출 부분에 작성되어 있는 절차를 삽입하는 방식이다.

macro(hello_macro)
    message("hello world")
endmacro(hello_macro)

hello_macro()



조건문(if)

 조건문 if()도 마지막에는 endif()로 끝이 나야 한다. if()조건 외 실행할 경우 else()가 사용된다. if()외에 다른 조건을 정의 할때는 elseif()를 사용한다.


 조건문이 참이 되는 경우는 ON, YES, Y, TRUE, 또는 0이 아닌 값이다. 반면 거짓이 되는 경우는 0, OFF, NO, FALSE, N, IGNORE, ""이다.


 또한 조건문에서 함께 사용되는 비교, 논리 연산자의 경우 기호가 아닌 대문자 키워드로 표현을 한다. 비교 연산자 : EQUAL, LESS, GREATER

논리 연산자 : AND, OR, NOT

기타 매칭 :  MATCHES [REGEX]

set(VAL 1)

if(${VAL})
    message("${VAL} is TRUE")
else()
    message("${VAL} is FALSE")
endif()



include()

 확장자가 cmake로 작성된 다른 cmake 파일을 포함시킬 수가 있다. C/C++의 include와 유사하다. 다만, 표준라이브러리가 없어서 로컬에서 포함을 해야 한다. 대부분 오픈소스에는 cmake라는 폴더에 .cmake 파일을 모아 놓는다.

 include하게 되면, include된 파일에 있는 매크로나 함수, 변수를 사용할 수 있다.




연습예제

 앞에서 간단하게 살펴본 내용으로 간단하게 실습 예제를 작성해보자. 스크립트를 2개로 만들어서 실행해보자

# cmake폴더의 macro.cmake 파일
macro(check_val_macro val)
    if(${val})
        message("${val} is true")
    else()
        message("${val} is false")
    endif()
endmacro(check_val_macro val)
# 작업 폴더의 CMakeLists.txt 파일
cmake_minimum_required(VERSION 2.6)

include(cmake/macro.cmake)

set(FOO 1)
check_val_macro(FOO)

set(FOO FALSE)
check_val_macro(FOO)


결과는 다음과 같이 나온다





참고자료

OpenCV 소스코드의 CMake스크립트

Mastering CMake A Cross-Platform Build System 서적

반응형

'각종 툴' 카테고리의 다른 글

[PyCharm]기본 키 맵 해제  (0) 2020.12.20
CMake 익히기 : 기초문법 (1)  (0) 2018.02.19
CMake : 공식예제 step1 해보기  (0) 2017.12.11
반응형

CMake 익히기 : 기초문법 (1)

작성 배경

 원래는 공식 웹 페이지에 있는 튜토리얼로 학습을 생각이었는데, 비교적 불친절한 설명과 실습하기에는 부족한 부분이 많았다. 따라서 기존 대형 오픈소스 프로젝트인 OpenCV나 VTK의 CMake 스크립트를 참고하면서 공식 서적인 "Matering CMake-Platform Build System"을 참고하여 조금씩 연습을 하려고 마음을 먹었다.


 "Matering CMake-Platform Build System"서적의 경우 대부분이 레퍼런스이고, 단계적인 설명은 약250페이지 정도 된다.



CMake

 이 글은 CMake를 익히기 위한 내용이기 때문에 CMake의 빌드 메카니즘에 대해서는 과감히 스킵을 한다.


 다만, CMake로 빌드를 하기 위해서는 몇 가지 알아야할 사항이 있다. CMake 자체는 CUI 인터페이스이다. 보니 진입장벽이 존재하고 또한 프로젝트의 규모가 커질 수 록 옵션을 어떻게 잡아야하는지가 막막해진다. 이 때문에 보조 도구가 2가지가 있다. 그리고 공식적으로 대규모의 오픈소스 프로젝트를 빌드할 경우에는 CUI보다는 GUI환경에서 빌드할 것을 권장하고 있다.


CMake-GUI

 기존의 CMake의 기능을 윈도우와 같은 GUI로 사용할 수 있는 툴이다. 리눅스 뿐만 아니라 윈도우, OS X 등에서도 사용이 가능하다. 혹시나 빌드시스템에 대해서 잘 모르지만, C/C++로 만들어진 오픈 소스 프로젝트를 윈도우에서 빌드를 해야할 경우 한번쯤은 사용하게 된다.





CCMake

 CMake-GUI의 경우 OS가 GUI환경을 제공해야 사용이 가능하다는 단점이 있다. 즉, Windows나 Linux의 X-Window와 같은 환경이 먼저 있어야 한다. 하지만, CCMake는 기존의 CUI 환경에서 CMake-GUI와 비슷하게 옵션을 선택할 수 있도록 해준다. 인터페이스는 Vi(혹은 Vim)과 유사한 단축키를 사용한다.





CMake 기초 문법

 정상적으로 CMakeLists.txt가 작동되기 위해서는 서드에 cmake_minimum_required()이 선언되어 있어야 한다. 만약 안하게 될 경우 에러 메시지를 볼 수 있다.



Agruments 구분

 CMake는 CMakeLists.txt에 작성된 스크립트대로 작동이 된다(처음 파일이름 작성시 대소문자 주의). CMake는 대부분 변수와 명령어로 구성되어 있고, 명령어는 command( arg ...) 형태로 구성되어 있다.

 대부분 명령어의 첫 arg는 대부분 특수한 의미가 있다. set()의 경우 첫 arg는 최종적으로 정의되는 변수가 된다.

 명령어의 arguments를 인식하는 것은 다음 예시와 같다.

# set의 예시

# set([변수] [arguements 값])
# set arguments를 2개로 인식
set(VAL "")
set(VAL "a;b;c")
set(VAL "a b c")
set(VAL a;b;c)

# set arguments를 4개로 인식
set(VAL "a" "b" "c")
set(VAL a b c)


 과거에 작성된 문서를 보면, CMake의 명령어들이 대문자로 되어 있지만, vs code의 확장 도구를 통해 CMakeLists.txt를 작성해보면, 명령어는 소문자로 되어 있다. 또한, 변수는 대부분 대문자로 사용하는 관습이 있다(그 이유는 항상 합리적이 이유다).



스코프(Scope) 구분

 C/C++언어에서는 중괄호를 활용해서 함수나 조건문 등의 영역인 스코프를 정의 한다. CMake에서는 이러한 중괄호가 없고 해당되는 command를 호출해서 스코프를 구분한다.


# function의 경우
function(foo)
  message("Hello foo")
endfunction()

# function foo 호출
foo()


 message()의 경우 C의 puts()처럼 입력받은 string을 한줄 출력을 한다. 이러한 명령어는 디버그할때 매우 유용하다. function()은 endfunction()으로 스코프 영역을 정의 해주고, function의 첫 arg는 function의 이름이 된다.



변수

 변수는 set()을 통해서 정의가 되고 ${}를 통해서 값을 호출한다. 또한 변수에 여러개의 값을 정의하면, 배열(혹은 리스트) 형태로 정의가 된다.

 이렇게 정의된 배열은 foreach()로 순차적으로 호출할 수 있다.



연습예제

 이제, 이 페이지에서 배운 내용을 복습해보자.


cmake_minimum_required(VERSION 2.6)

# function foo 정의
function(foo)
  message(${test})
  set(test 2 PARENT_SCOPE)
  message(${test})
endfunction()

set(test 1)
# function foo 호출
foo()

# 값확인
message(${test})

# list item_to_buy
set(item_to_buy apple orange pear beer)

# foreach item_to_buy
foreach(item ${item_to_buy})
  message("Do not forget to buy one ${item}")
endforeach()


 간단하기 때문에 CMakeLists.txt가 있는 폴더에서 다음과 같은 명령어로 빌드한다.


cmake -H. -Bbuild

위의 -B 옵션을 사용할 경우 자동으로 build 폴더를 생성하여 해당 폴더에 빌드를 한다. 빌드 과정에 다음 메시지가 출력되는 것을 확인할 수 있다.





예제에서 특이한 점을 보면, 메시지 결과를 보면, function foo()가 종료되어야 test값이 달라지는 것을 확인 할 수 있다. 이렇게 간단하게 기초 문법을 확인 해봤다.



참고

Matering CMake A Cross-Platform Build System 서적(영문)



반응형

'각종 툴' 카테고리의 다른 글

[PyCharm]기본 키 맵 해제  (0) 2020.12.20
CMake 익히기 : 기초문법 (2)  (0) 2018.02.21
CMake : 공식예제 step1 해보기  (0) 2017.12.11
반응형

CMake : 공식예제 step1 해보기


MS의 VS 시리즈 통합개발환경을 사용하다가 리눅스 같은 유닉스 계열에서 비통합개발환경에서 여러 소스파일을 컴파일을 할 경우 이를 도와주는 도구가 shell, makefile, CMake 등이 있다.

 소스파일이 많아지고 복잡해질 수록 shell 보다는 makefile, makefile보다는 CMake가 비교적 적합하다. 특히 CMake의 경우 윈도우에서도 빌드할 수 있기 때문에, 소스코드 생성시 의 운영체제의 고유 API를 사용하지 않았다면, 동일한 소스파일을 빌드할 수 있다. 이를 이용해서 OpenCV등 오래전 부터 지속된 오픈소스 프로젝트들이 CMake를 사용해서 사용되어져 왔다.


 문제는 이러한 강력한 기능이 있음에도 불구하고 튜토리얼 문서는 관리가 안되고 있는 듯하다. 이 글을 기록하는 시점에 3.5.1버전이 필자의 리눅스에 설치되어 있지만, 공식 홈페이지의 메인 튜토리얼에는 여전히 2.6 버전으로 되어 있다. 게다가 상당히 난잡하게 기록되어 있다. 아마도 이를 통해서 진입장벽을 만들고 싶었던건지 아니면, 기록이 귀찮았던건지는 물어보지 않아서 알 수 없다.


 일단은 예시 들을 진행을 해보면서, 발생되는 문제점을 해결하면서 기록을 하고자 한다.


CMake 개요

 cmake는 CMakeLists.txt 명으로 된 파일을 스크립트로 인식하여 makefile을 생성하여 최종적으로는 makefile(실행은 make)을 사용하여 실행 및 공유파일을 생성한다.




예시 소스코드


// tutorial.cxx

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "TutorialConfig.h"

int main(const int argc, const char * argv[])
{
    double inputValue;
    double outputValue;
    if(argc < 2)
    {
        fprintf(stdout, "usage: %s number\n", argv[0]);
        return 1;
    }
    inputValue = atof(argv[1]);
    outputValue = sqrt(inputValue);
    fprintf(stdout, "The square root of %g is %g\n",
        inputValue, outputValue);

    return 0;
}


 확장자가 cxx이지만 헤더파일을 살펴보면 c인것을 알 수 있다. "TutorialConfig.h"은 CMake에서 설정하는 파일로 빌드 직전에 생성된다.



예시 헤더파일


// TutorialConfig.h.in

// the configured options and settings for Tutorial
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@


"@"로 감싼 부분은 CMake 파일에서 후에 정의 된 값이 들어가서 작성하게 된다.



예시 CMakeLists.txt


# CMakeLists.txt

cmake_minimum_required(VERSION 2.6)
project(Tutorial)
# The version number
set(Tutorial_VERSION_MAJOR 1)
set(Tutorial_VERSION_MINOR 0)

# configure a header file to pass scma of the CMake settings
# to the source code
configure_file(
    "${PROJECT_SOURCE_DIR}/TutorialConfig.h.in"
    "${PROJECT_BINARY_DIR}/Tutorialconfig.h"
)

# add the binary tree to the search path ofr include files
# so that we will find TutorialConfig.h
include_directories("${PROJECT_BINARY_DIR}")

# add the executedable
add_executable(Tutorial tutorial.cxx)


만약에 여기 까지 진행을 했는데, math.h에 관련된 에러가 발생한다면, 위의 마지막줄 add_executable() 직전에 한줄을 추가 해주자


# add link libraries
LINK_LIBRARIES(m)

주석에 표기 되어 있는대로 라이브러리를 추가 시켜준다. 원래는 cmake가 알아서 추가 시켜줘야 하는데, 간혹 안되는 경우가 있으니 참고 하도록 하자. 위의 한줄은 math.h를 include 했을 때 컴파일 과정중 링크 단계에서 -lm을 하는 것과 같은 효과가 있다.


CMake에서는 콤마(,)가 없다는 것을 주의 해야 한다.

project(Tutorial)은 이름 그대로 프로젝트 이름을 정의해준다.


 set() 키워드는 CMake내에서 변수를 정의 혹은 초기화를 해준다. set(Tutorial_VERSION_MAJOR 1)이라고 하면, Tutorial_VERSION_MAJOR이라는 변수 없다는 생성해서 초기화를 시킨다.


add_executeable(Tutorial tutorial.cxx)는 결과 파일이름이 Tutorial로 되고 여기에 포함되는 소스가 위에 열거가 된다. 예제에서는 하나의 소스파일이지만, 실제로는 여러개의 소스파일이 사용된다.


참조 자료

공식 튜토리얼(영문)

개발자 블로그



반응형

'각종 툴' 카테고리의 다른 글

[PyCharm]기본 키 맵 해제  (0) 2020.12.20
CMake 익히기 : 기초문법 (2)  (0) 2018.02.21
CMake 익히기 : 기초문법 (1)  (0) 2018.02.19

+ Recent posts