컴파일러 옵션
컴파일러 옵션
F# 컴파일러에서 쓸 수 있는 명령줄 옵션을 소개할게요. dotnet build 명령은 F# 프로젝트 파일을 만나면 F# 컴파일러를 실행해요. F# 프로젝트 파일은 .fsproj 확장자를 갖고 있어요.
컴파일 환경은 프로젝트 속성으로도 제어할 수 있어요. .NET Core를 대상으로 하는 프로젝트에서는 .fsproj 안의 "Other flags" 속성(<OtherFlags>...</OtherFlags>)으로 추가 명령줄 옵션을 지정할 수 있답니다.
출처: https://learn.microsoft.com/en-us/dotnet/fsharp/language-reference/compiler-options
본문
가나다순(알파벳순)으로 정리한 컴파일러 옵션
아래 표는 컴파일러 옵션을 알파벳순으로 정리한 거예요. F# 컴파일러 옵션 중에는 C# 컴파일러 옵션과 비슷한 것도 있어요. 그런 경우에는 해당 C# 컴파일러 옵션 문서로 연결되는 링크를 함께 달아 뒀어요.
| 컴파일러 옵션 | 설명 |
|---|---|
--allsigs |
컴파일에 포함된 각 소스 파일에 대한 시그니처 파일을 새로 만들거나 기존 파일을 다시 생성해요. 시그니처 파일에 대한 자세한 내용은 Signatures를 참고하세요. |
-a filename.fs |
지정한 파일로부터 라이브러리를 생성해요. --target:library filename.fs의 줄임 형태예요. |
--baseaddress:address |
DLL을 로드할 때 선호하는 기본 주소(base address)를 지정해요. 이름이 같은 C# 컴파일러 옵션과 동일해요. 자세한 내용은 /baseaddress (C# Compiler Options)를 참고하세요. |
| `--checknulls[+ | -]` |
--codepage:id |
시스템의 기본 코드 페이지가 필요하지 않을 때 컴파일 중 사용할 코드 페이지를 지정해요. 이름이 같은 C# 컴파일러 옵션과 동일해요. 자세한 내용은 /code pages (C# Compiler Options)를 참고하세요. |
--consolecolors |
오류와 경고를 콘솔에서 색상 코드로 표시해요. |
--crossoptimize[+ or -] |
모듈 간(cross-module) 최적화를 켜거나 꺼요. |
| `--delaysign[+ | -]` |
| `--checked[+ | -]` |
| `--debug[+ | -]<br>-g[+ |
--define:symbol-d:symbol |
조건부 컴파일에 사용할 기호(symbol)를 정의해요. |
| `--deterministic[+ | -]` |
--doc:xmldoc-filename |
지정한 파일에 XML 문서 주석을 생성하도록 컴파일러에 지시해요. 자세한 내용은 XML Documentation을 참고하세요. 이름이 같은 C# 컴파일러 옵션과 동일해요. 자세한 내용은 /doc (C# Compiler Options)를 참고하세요. |
--fullpaths |
정규화된 전체 경로(fully qualified path)를 생성하도록 컴파일러에 지시해요. 이름이 같은 C# 컴파일러 옵션과 동일해요. 자세한 내용은 /fullpaths (C# Compiler Options)를 참고하세요. |
--help-? |
모든 컴파일러 옵션에 대한 간단한 설명을 포함한 사용 정보를 표시해요. |
| `--highentropyva[+ | -]` |
--keycontainer:key-container-name |
강력한 이름 키 컨테이너를 지정해요. |
--keyfile:filename |
생성된 어셈블리 서명에 사용할 공개 키 파일의 이름을 지정해요. |
--lib:folder-name-I:folder-name |
참조하는 어셈블리를 검색할 디렉터리를 지정해요. 이름이 같은 C# 컴파일러 옵션과 동일해요. 자세한 내용은 /lib (C# Compiler Options)를 참고하세요. |
--linkresource:resource-info |
지정한 리소스를 어셈블리에 연결해요. resource-info의 형식은 filename[name[public|private]]이에요. 이 옵션으로 단일 리소스를 연결하는 것은 --resource 옵션으로 리소스 파일 전체를 임베드하는 것의 대안이에요. 이름이 같은 C# 컴파일러 옵션과 동일해요. 자세한 내용은 /linkresource (C# Compiler Options)를 참고하세요. |
--mlcompatibility |
다른 버전의 ML과의 호환성을 위해 설계된 기능을 사용할 때 나타나는 경고를 무시해요. |
--noframework |
.NET Framework 어셈블리에 대한 기본 참조를 비활성화해요. |
--nointerfacedata |
F# 전용 메타데이터를 포함하는 어셈블리에 컴파일러가 보통 추가하는 리소스를 생략하도록 지시해요. |
--nologo |
컴파일러를 실행할 때 배너(banner) 텍스트를 표시하지 않아요. |
--nooptimizationdata |
인라인(inlined) 구문을 구현하는 데 필수적인 최적화만 포함하도록 컴파일러에 지시해요. 모듈 간 인라인은 억제하지만 바이너리 호환성은 향상시켜요. |
--nowin32manifest |
기본 Win32 매니페스트를 생략하도록 컴파일러에 지시해요. |
--nowarn:warning-number-list |
번호로 지정한 특정 경고를 비활성화해요. 각 경고 번호를 쉼표로 구분해요. 경고 번호는 컴파일 출력에서 확인할 수 있어요. 이름이 같은 C# 컴파일러 옵션과 동일해요. 자세한 내용은 /nowarn (C# Compiler Options)을 참고하세요. |
| `--optimize[+ | -] [optimization-option-list]<br>-O[+ |
--out:output-filename-o:output-filename |
컴파일된 어셈블리 또는 모듈의 이름을 지정해요. 이름이 같은 C# 컴파일러 옵션과 동일해요. 자세한 내용은 /out (C# Compiler Options)을 참고하세요. |
--pathmap:path=sourcePath,... |
컴파일러가 출력하는 물리적 경로를 소스 경로 이름으로 매핑하는 방법을 지정해요. 이름이 같은 C# 컴파일러 옵션과 동일해요. 자세한 내용은 /pathmap (C# Compiler Options)를 참고하세요. |
--pdb:pdb-filename |
출력 디버그 PDB(프로그램 데이터베이스) 파일의 이름을 지정해요. --debug가 활성화된 경우에만 적용돼요. 이름이 같은 C# 컴파일러 옵션과 동일해요. 자세한 내용은 /pdb (C# Compiler Options)를 참고하세요. |
--platform:platform-name |
생성된 코드가 지정한 플랫폼(x86, Itanium 또는 x64)에서만 실행되도록 지정하거나, platform-name을 anycpu로 선택하면 어떤 플랫폼에서도 실행할 수 있게 지정해요. 이름이 같은 C# 컴파일러 옵션과 동일해요. 자세한 내용은 /platform (C# Compiler Options)을 참고하세요. |
--preferreduilang:lang |
선호하는 출력 언어 문화권(culture) 이름을 지정해요(예: es-ES, ja-JP). |
--quotations-debug |
F# 인용(quotation) 리터럴과 반사 정의(reflected definition)에서 파생된 식에 대해 추가 디버그 정보를 내보내야 한다고 지정해요. 디버그 정보는 F# 식 트리 노드의 사용자 지정 특성(custom attribute)에 추가돼요. Code Quotations와 Expr.CustomAttributes를 참고하세요. |
--reference:assembly-filename-r:assembly-filename |
F# 또는 .NET Framework 어셈블리의 코드를 컴파일 중인 코드에서 사용할 수 있게 해요. 이름이 같은 C# 컴파일러 옵션과 동일해요. 자세한 내용은 /reference (C# Compiler Options)를 참고하세요. |
--resource:resource-filename |
관리 리소스(managed resource) 파일을 생성된 어셈블리에 임베드해요. 이름이 같은 C# 컴파일러 옵션과 동일해요. 자세한 내용은 /resource (C# Compiler Options)를 참고하세요. |
--sig:signature-filename |
생성된 어셈블리를 기반으로 시그니처 파일을 생성해요. 시그니처 파일에 대한 자세한 내용은 Signatures를 참고하세요. |
--simpleresolution |
어셈블리 참조를 MSBuild 해석 대신 디렉터리 기반 Mono 규칙으로 해석해야 한다고 지정해요. 기본값은 Mono에서 실행할 때를 제외하고 MSBuild 해석을 사용하는 거예요. |
--standalone |
모든 의존성을 포함한 어셈블리를 생성해서 F# 라이브러리 같은 추가 어셈블리 없이 그 자체로 실행되도록 지정해요. |
--staticlink:assembly-name |
지정한 어셈블리와 이 어셈블리에 의존하는 모든 참조 DLL을 정적으로 연결해요. DLL 이름이 아니라 어셈블리 이름을 사용해요. |
--subsystemversion |
생성된 실행 파일이 사용할 OS 서브시스템 버전을 지정해요. Windows 8.1에는 6.02, Windows 7에는 6.01, Windows Vista에는 6.00을 사용해요. 이 옵션은 DLL이 아닌 실행 파일에만 적용되고, 애플리케이션이 특정 OS 버전에서만 사용할 수 있는 보안 기능에 의존할 때만 필요해요. 이 옵션을 사용했는데 사용자가 더 낮은 버전의 OS에서 애플리케이션을 실행하려 하면 오류 메시지와 함께 실패해요. |
| `--tailcalls[+ | -]` |
--target:[exe|winexe|library|module] filename |
생성된 컴파일 코드의 종류와 파일 이름을 지정해요.exe는 콘솔 애플리케이션을 의미해요.winexe는 Windows 애플리케이션을 의미하며, 표준 입력/출력 스트림(stdin, stdout, stderr)이 정의되지 않는다는 점에서 콘솔 애플리케이션과 달라요.library는 진입점(entry point)이 없는 어셈블리예요.module은 나중에 다른 모듈과 결합해 어셈블리로 만들 수 있는 .NET Framework 모듈(.netmodule)이에요.이름이 같은 C# 컴파일러 옵션과 동일해요. 자세한 내용은 /target (C# Compiler Options)을 참고하세요. |
--times |
컴파일 시간 정보를 표시해요. |
--utf8output |
UTF-8 인코딩으로 컴파일러 출력을 인쇄할 수 있게 해요. |
--warn:warning-level |
경고 수준(0~5)을 설정해요. 기본 수준은 3이에요. 각 경고는 심각도에 따라 수준이 부여돼요. 수준 5는 수준 1보다 더 많지만 덜 심각한 경고를 제공해요. 이름이 같은 C# 컴파일러 옵션과 동일해요. 자세한 내용은 /warn (C# Compiler Options)을 참고하세요. |
--warnon:warning-number-list |
기본적으로 꺼져 있거나 다른 명령줄 옵션으로 비활성화된 특정 경고를 활성화해요. 목록은 쉼표로 구분돼요. |
| `--warnaserror[+ | -] [warning-number-list]` |
--win32manifest:manifest-filename |
컴파일에 Win32 매니페스트 파일을 추가해요. 이름이 같은 C# 컴파일러 옵션과 동일해요. 자세한 내용은 /win32manifest (C# Compiler Options)를 참고하세요. |
--win32res:resource-filename |
컴파일에 Win32 리소스 파일을 추가해요. 이름이 같은 C# 컴파일러 옵션과 동일해요. 자세한 내용은 /win32res ((C#) Compiler Options)를 참고하세요. |
옵트인(opt-in) 경고
F# 컴파일러는 여러 옵트인 경고를 지원해요.
| 번호 | 요약 | 수준 | 설명 |
|---|---|---|---|
| 21 | Recursion checked at run time | 5 | 재귀 사용이 초기화 건전성(initialization-soundness)을 위해 런타임에 검사될 때 경고해요. |
| 22 | Bindings executed out of order | 5 | 재귀 바인딩이 전방 참조(forward reference) 때문에 순서에 어긋나게 실행될 수 있을 때 경고해요. |
| 52 | Implicit copies of structs | 5 | 불변(immutable) 구조체가 연산으로 원본이 변경되지 않도록 복사될 때 경고해요. |
| 1178 | Implicit equality/comparison | 5 | F# 형식 선언이 암시적으로 NoEquality 또는 NoComparison으로 추론되는데 해당 특성이 형식에 없을 때 경고해요. |
| 1182 | Unused variables | n/a | 사용되지 않는 변수에 대해 경고해요. |
| 3180 | Implicit heap allocations | n/a | 변경 가능한 지역 변수가 클로저에 포착되어 참조 셀(reference cell)로 암시적으로 힙에 할당될 때 경고해요. |
| 3186 | Missing metadata declaration | n/a | F# 메타데이터 노드에 일치하는 선언이 없을 때 경고해요. 손상된 어셈블리를 나타낼 수 있으며, 다시 컴파일해야 할 수도 있어요. |
| 3366 | Index notation | n/a | F# 5의 인덱스 표기 expr.[idx]를 사용할 때 경고해요. |
| 3388 | Additional implicit upcast | n/a | 추가 업캐스트(upcast)가 암시적으로 사용될 때 경고해요. F# 6에서 추가됐어요. |
| 3389 | Implicit widening | n/a | 암시적 숫자 확장(numeric widening)이 사용될 때 경고해요. |
| 3390 | Malformed XML doc comments | n/a | XML 문서 주석이 여러 방식으로 잘못 작성됐을 때 경고해요. |
| 3395 | Implicit method argument conversion | n/a | 메서드 인수의 타입을 맞추기 위해 암시적 변환(conversion)이 사용될 때 경고해요. |
| 3517 | InlineIfLambda failure | n/a | F# 최적화기가 InlineIfLambda 값을 인라인하지 못할 때 경고해요. 예를 들어 명시적 람다 대신 계산된 함수 값이 제공된 경우예요. |
| 3559 | Type inferred as obj | n/a | 타입이 암시적으로 'obj'로 추론될 때 경고해요. 명시적 타입 주석을 추가할 것을 권장해요. |
| 3560 | All fields changed in record copy | n/a | 레코드 복사-업데이트(copy-and-update) 식이 모든 필드를 변경할 때 경고해요. 레코드 생성 구문을 사용할 것을 권장해요. |
| 3570 | Ambiguous discard or shorthand | n/a | 같은 범위에서 '_'가 discard와 함수 축약형으로 모호하게 사용될 때 경고해요. |
| 3579 | Untyped string interpolation | n/a | 보간된 문자열(interpolated string)에 타입이 없는 값이 포함될 때 경고해요. 타입이 있는 형식 지정자(typed format specifier)를 권장해요. |
| 3582 | Function shadows union case | n/a | 함수 정의가 실수로 공용체 케이스(union case)를 가릴(shadow) 때 경고해요. 괄호를 사용해 모호성을 없애세요. |
| 3878 | Attribute invalid on union case with fields | n/a | 특성이 필드가 있는 공용체 케이스에 유효하지 않을 때 경고해요. |
이 경고들은 /warnon:NNNN 또는 <WarnOn>NNNN</WarnOn> 구문으로 활성화할 수 있어요. 여기서 NNNN은 해당 경고 번호예요. (<WarnOn>FSNNNN</WarnOn> 구문도 쓸 수 있어요. 예: <WarnOn>FS3388</WarnOn>.)
주의할 점: WarnOn 속성이 여러 번 지정되면 마지막 항목만 사용돼요. 여러 경고를 지정하려면 WarnOn 속성을 한 번만 쓰고 내용을 쉼표로 구분된 문자열로 넣어야 해요: <WarnOn>3388,3559</WarnOn>.
더 알아보기 (Learn more)
- F# Interactive Options — F# 인터프리터(
fsi.exe)가 지원하는 명령줄 옵션을 설명해요. - Project Properties Reference — 빌드 옵션을 제공하는 프로젝트 속성 페이지를 포함해 프로젝트 UI를 설명해요.