3 분 소요

세팅 작업

4주차에 C언어 세팅을 하면서
여러가지 고생을 하였지만
다행히 친절하신 동료분이 세팅을 도와주셔서 여러가지 인식할 수 있었다

현재 인식한 것은

  • wsl2 - ubuntu
  • makefile
  • task.json, launch.json

적어도 다음에 비슷한 세팅을 할 때가 있었을 때,
뻘쭘하면서 같은 도움을 받고 싶지는 않기에
TIL을 추가로 남기려 한다

  • code . 을 쓰면 해당 폴더 기준으로 vs code가 열린다

WSL2

첫번째 C 세팅중 삽질을 한 부분은
윈도우 10 이상의 환경에서 mingw gcc 를 통해
컴파일을 시도하려 하였다
(물론 이 녀석은 잘못이 없을 수 있다)

정확히는 ‘makefile’이 정상적으로 동작하지 않을 수도 있다
라는 점으로

이후, WSL 2 를 이용하여 ubuntu를 설치하는 방식으로 선회하였다
참고로 windows 10 home 인 경우 hyper-v 가 활성화 되지 않아있기에
(bios 에서 세팅할 수 없음)
별도의 bat 파일을 제작하여, VM 환경을 만들었다
[참고] : https://lastcard.tistory.com/141

이후 WSL2 설치는 MS의 사이트를 이용하였고,
[참고] : https://learn.microsoft.com/ko-kr/windows/wsl/install

ubuntu의 경우, ms appstore 에서 설치해도 되고,
install 해줘도 된다
[참고] : https://gaesae.com/161

이렇게 만들어진 가상 환경 linux(ubuntu)는
파일 탐색기에서도 확인이 가능하다

(여기에 직접 드래그해서 무언가를 넣으려고 하면 안되지만,
반대로 가져오는 건 된다고)

makeFile

빌드 프로세스 자동화를 위한 텍스트 파일이며,
일련의 규칙을 통하여 소스 코드 파일, 의존성, 빌드 규칙을 정의하여
빌드를 지시하는 용도라 한다
(c/c++ 및 컴파일 가능한 언어에서 사용)

빌드 목표, 의존성, 빌드 규칙 이 가장 큰 특징이다

간략한 문법 설명

  • PHONY : 실제 파일을 생성하지 않고 ‘명령’ 실행, 실제 파일과 충돌하지 않음
    (‘가상 목표’라고도 표현, ‘항상 실행’하며 .PHONY 방식으로 사용)
  • help : 도움말 출력 (make help 혹은 make 명령 사용시 실행)
  • CFLAGS : makeFile에서의 환경 변수이며, 컴파일시 C 컴파일러에게 전달
    -I : 지정한 디렉토리에서 헤더 파일을 찾음
    -Wall : 모든 경고 메시지 활성화
    -g : 디버그 정보 포함하여 컴파일
    -D : 전처리기 매크로 정의

  • test, build_test, test-rbtree 등은 ‘실제 목표’이다

  • $(MAKE) : makefile 에서 사용되는 변수로, make 도구 자체를 나타낸다
    -> 이를 이용하여 make를 재귀적으로 쓰거나 다른 makefile을 포함한다
    -C를 사용하여 다른 디렉토리를 가리킬 수 있음
.PHONY: help build test build_test

help:
# http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html
	@grep -E '^[a-zA-Z0-9_%/-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'

build:
build: ## Build executables
	$(MAKE) -C src

build_test:
build_test:
	$(MAKE) -C test build_test

test:
test: ## Test rbtree implementation
	$(MAKE) -C test test
	
clean:
clean: ## Clear build environment
	$(MAKE) -C src clean
	$(MAKE) -C test clean

.PHONY: test clean build_test

CFLAGS=-I ../src -Wall -g #-DSENTINEL

test: test-rbtree
	./test-rbtree
	valgrind ./test-rbtree

build_test: test-rbtree

test-rbtree: test-rbtree.o ../src/rbtree.o

../src/rbtree.o:
	$(MAKE) -C ../src rbtree.o

clean:
	rm -f test-rbtree *.o

vs code의 json

보통 ‘작업 환경’을 설정하는데 사용한다
여러 json이 있지만,
이번에 유용하게 사용한 것은, tasks와 launch 이므로 그 둘을 중점적으로
다루고, 나머지는 언급만 하려 한다

  • tasks.json
    작업(task)을 정의하고 구성하는데 사용
    빌드, 테스트, 실행, 사용자 지정 작업 을 설정하고 실행
    각 요소에 대한 간략한 설명이다
    • version: tasks.json 파일의 형식 버전을 나타냄
    • tasks: 작업 목록을 정의, 각 작업은 별도의 JSON 객체로 표시
    • label: 작업에 부여한 고유한 이름 또는 레이블
      이를 통해 해당 작업을 호출하고 실행할 때 참조 가능
    • type: 작업 유형을 지정
      일반적으로 “shell”을 사용하여 셸 명령을 실행하거나, 다른 유형(예: “process”)을 사용
    • command: 실행할 명령 또는 스크립트의 경로를 지정
    • args: 명령에 전달할 인수 목록을 정의
      필요한 경우 여러 개의 인수를 포함할 수 있습니다.
    • options (선택적): 작업 실행을 위한 옵션을 지정
      cwd를 사용하여 작업을 실행할 작업 디렉토리를 설정 가능
    • problemMatcher (선택적): 작업이 생성하는 출력에서 문제를 식별하고
      해당 정보를 문제 패널에 표시하는 방법을 지정하는데 사용
      이 부분은 특히 빌드 작업과 관련
       {
       "version": "2.0.0",
       "tasks": [
        {
            "label": "task_label",
            "type": "shell",
            "command": "command_to_execute",
            "args": ["argument1", "argument2", ...],
            "options": {
                "cwd": "working_directory"
            },
            "problemMatcher": []
        },
        // 추가 작업 정의
      ]
       }
      
  • launch.json
    vs code에서 디버깅 환경을 구성하고
    디버깅 세션을 시작하는데 사용하는 파일
    • version: launch.json 파일의 형식 버전을 나타냄
    • configurations: 디버그 설정 목록을 정의
      각 설정은 별도의 JSON 객체로 표시

    • name: 디버그 설정에 부여한 고유한 이름 또는 레이블

    • type: 디버거의 유형을 지정
      예를 들어, “cppdbg”는 C/C++ 디버거를 나타냄

    • request: 디버깅 요청 유형을 지정
      “launch”는 프로그램을 시작하고 디버그 세션을 시작하는 것을 의미

    • program: 디버깅할 프로그램 또는 스크립트의 경로를 지정

    • args: 프로그램에 전달할 명령행 인수의 목록을 정의

    • stopAtEntry: 프로그램 시작 시 진입점에서 중지할지 여부를 지정

    • cwd: 디버그 중인 프로그램의 작업 디렉토리를 설정

    • environment: 프로그램이 실행될 환경 변수를 설정

    • externalConsole: 디버그 콘솔을 외부 콘솔로 사용할지 여부를 지정

    • MIMode: 디버거의 유형과 모드를 지정
      예를 들어, “gdb” 또는 “lldb”와 같은 디버거를 선택 가능

    • setupCommands: 디버깅 세션 시작 전에 실행할 디버거 명령 목록을 정의

    • preLaunchTask (선택적): 디버그 세션 시작 전에 실행할 tasks.json 파일 내에서 정의된 작업(Task)을 지정
      이를 사용하여 빌드 작업을 디버깅 전에 실행하거나, 디버깅 전에 특정 작업을 수행이 가능
    {
      "version": "0.2.0",
      "configurations": [
          {
              "name": "ConfigurationName",
              "type": "DebugType",
              "request": "launch",
              "program": "path/to/program",
              "args": ["arg1", "arg2", ...],
              "stopAtEntry": false,
              "cwd": "working_directory",
              "environment": [],
              "externalConsole": false,
              "MIMode": "debugger_type",
              "setupCommands": [],
              "preLaunchTask": "task_name"
          },
          // 추가 디버그 설정 정의
      ]
    }
    

    이 밖에도, settings.json, extensions.json 등등 다양한 json이 존재한다

댓글남기기