Files
gradle-examples/doc/16_c.md
2025-02-22 01:13:24 +09:00

157 lines
3.8 KiB
Markdown

# C 프로젝트
Gradle은 주로 Java, Kotlin과 같은 JVM 언어를 위한 빌드 도구로 알려져 있지만, **C/C++ 프로젝트도 빌드할 수 있는 강력한 기능**을 제공한다. Gradle의 **`cpp-application`** 또는 **`cpp-library`** 플러그인을 사용하면 C 프로젝트의 빌드를 자동화할 수 있다.
## Gradle 프로젝트 설정
C 프로젝트를 Gradle로 빌드하려면 먼저 Gradle 프로젝트를 초기화해야 한다.
```sh
gradle init
```
이후 "Application" 또는 "Library" 유형을 선택하고, 언어로 `C++`을 선택할 수 있다. 하지만, 직접 `build.gradle.kts` 파일을 작성해도 된다.
Gradle을 사용하는 C 프로젝트의 기본적인 디렉터리 구조는 다음과 같다.
```
C-Project/
├── src/
│ ├── main/
│ │ ├── c/
│ │ │ ├── main.c
│ │ │ ├── utils.c
│ │ │ ├── utils.h
│ ├── test/
│ │ ├── c/
│ │ │ ├── test_main.c
│ │ │ ├── test_utils.c
├── build.gradle.kts
├── settings.gradle.kts
├── gradlew
├── gradlew.bat
├── gradle/
└── build/
```
## `cpp-application` 플러그인을 사용한 C 프로젝트 빌드
Gradle의 **`cpp-application`** 플러그인은 실행 가능한 C 프로그램을 만들 때 사용된다.
`build.gradle.kts` 설정
```kotlin
plugins {
id("cpp-application")
}
application {
targetMachines.add(machines.linux.x86_64) // 빌드 타겟 (Linux 64-bit)
targetMachines.add(machines.windows.x86_64) // Windows 지원 추가
}
tasks.withType<CppCompile>().configureEach {
compilerArgs.add("-Wall") // 모든 경고 표시
}
```
이 설정을 통해:
- `cpp-application` 플러그인을 적용한다.
- 빌드할 대상 아키텍처(Windows, Linux)를 지정한다.
- `-Wall` 플래그를 추가하여 경고를 활성화한다.
### 빌드 및 실행
```sh
./gradlew build # 빌드 실행
./build/install/main/debug/main # 실행 (Linux)
build\install\main\debug\main.exe # 실행 (Windows)
```
Gradle은 `build/install/main/debug/` 폴더에 실행 파일을 생성한다.
## `cpp-library` 플러그인을 사용한 C 라이브러리 프로젝트
라이브러리를 생성할 경우 **`cpp-library`** 플러그인을 사용하면 된다.
`build.gradle.kts` 설정
```kotlin
plugins {
id("cpp-library")
}
library {
targetMachines.add(machines.linux.x86_64)
targetMachines.add(machines.windows.x86_64)
}
```
### 라이브러리 코드 (`utils.c`, `utils.h`)
`utils.h`
```c
#ifndef UTILS_H
#define UTILS_H
void print_message();
#endif
```
`utils.c`
```c
#include <stdio.h>
#include "utils.h"
void print_message() {
printf("Hello from the C Library!\n");
}
```
## 테스트 추가 (`cpp-unit-test` 플러그인 사용)
Gradle에서 C 프로젝트에 대한 유닛 테스트를 추가할 수도 있다.
`test_main.c`
```c
#include <stdio.h>
#include "utils.h"
int main() {
print_message();
printf("Test Passed!\n");
return 0;
}
```
`build.gradle.kts`
```kotlin
plugins {
id("cpp-application")
id("cpp-unit-test") // 테스트 플러그인 추가
}
application {
targetMachines.add(machines.linux.x86_64)
targetMachines.add(machines.windows.x86_64)
}
tasks.withType<CppCompile>().configureEach {
compilerArgs.add("-Wall")
}
testing {
suites {
val test by getting(CppTestSuite::class) {
targets {
all {
testTask.configure {
shouldRunAfter(tasks.named("build"))
}
}
}
}
}
}
```
### 테스트 실행
```sh
./gradlew check
```
테스트 결과는 `build/reports/tests/test` 폴더에 저장된다.