157 lines
3.8 KiB
Markdown
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` 폴더에 저장된다.
|
|
|