컴파일러 옵션

컴파일러 옵션

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-nameanycpu로 선택하면 어떤 플랫폼에서도 실행할 수 있게 지정해요. 이름이 같은 C# 컴파일러 옵션과 동일해요. 자세한 내용은 /platform (C# Compiler Options)을 참고하세요.
--preferreduilang:lang 선호하는 출력 언어 문화권(culture) 이름을 지정해요(예: es-ES, ja-JP).
--quotations-debug F# 인용(quotation) 리터럴과 반사 정의(reflected definition)에서 파생된 식에 대해 추가 디버그 정보를 내보내야 한다고 지정해요. 디버그 정보는 F# 식 트리 노드의 사용자 지정 특성(custom attribute)에 추가돼요. Code QuotationsExpr.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)