OCaml 프로젝트를 구성하고 빌드하는 데 선호되는 방법은 무엇입니까?
생태계를 처음 접하는 사람들에게는 중소 규모의 OCaml 프로젝트를 구성하고 관리하는 데 정식으로 선호되는 방법이 무엇인지 명확하지 않습니다. ocamlc
, & c 의 기본 사항을 이해합니다 . – 이들은 간단 해 보일만큼 기존의 UNIX C 컴파일러를 미러링합니다. 그러나 개별 파일의 일회성 컴파일 수준을 넘어서는 컴파일을 간단하고 깔끔하게 관리하는 방법이 명확하지 않습니다. 문제는 잠재적 인 도구를 찾는 것이 아니라 표준 OCaml 프로젝트를 구성하고 구축하기 위해 커뮤니티의 경험에 의해 검증 된 하나 또는 몇 가지 올바른 방법을 보는 것입니다.
내 모델 사용 사례는 순수 OCaml 또는 OCaml과 C 종속성의 겸손하지만 사소하지 않은 프로젝트입니다. 그런 프로젝트 :
- 여러 소스 파일을 포함
- 여러 표준 라이브러리에 대한 링크
- 하나 이상의 타사 라이브러리에 대한 링크
- 선택적으로 C 라이브러리 및 OCaml 래퍼를 하위 프로젝트로 포함합니다 (단, (3)에서와 같이 별도로 관리하고 타사 라이브러리로 포함 할 수도 있음).
몇 가지 대체 도구가 두드러집니다.
- 사용자 정의 Makefile은 대부분의 오픈 소스 OCaml 패키지에서 일반적인 표준으로 보이지만, 겸손한 C / C ++ 프로젝트보다 훨씬 더 복잡하고 장황하게 보입니다. 설상가상으로, 단순 해 보이는 많은 OCaml 라이브러리는 더 큰 복잡성을 위해 autoconf / automake를 맨 위에 계층화합니다.
- ocamlbuild 는 최소한의 구성으로 빌드를 자동화하기위한 현대적이고 간소화 된 메커니즘을 제공하는 것으로 보이지만, 신규 사용자에게는 잘 문서화되지 않았으며 OCaml 생태계의 입문 자료에 예시로 표시되지 않았으며 게시 된 다양한 OCaml 프로젝트에서 시각적으로 사용되지 않았습니다. 나는 영감을 찾아 보았다.
- OASIS 는 Cabal과 같은 패키지 관리자 및 라이브러리 빌드를 지원하기 위해 다른 빌드 시스템 위에있는 규칙 및 라이브러리 코드 계층 인 것 같습니다.
(또한 OCaml 및 ocaml-make née OCamlMakefile을 포함하여 GNU 표준 규칙 템플릿을 제공하는 OCaml -make née OCamlMakefile을 포함하여 공통 언어에 대한 표준 규칙 모음도 포함 하는 자체 스타일 " " 인 것처럼 보이는 OMake 를 보았습니다 .)make++
make
이 중 OCaml 빌드를 관리하는 선호되고 현대적인 방법이 있습니까?
프로젝트 파일은 어떻게 가장 잘 구성되어 있습니까?
타사 라이브러리 종속성은 어떻게 포함되고 관리됩니까? 시스템 수준에서 설치하는 것이 선호됩니까? 아니면 프로젝트에 로컬로 관리하는 표준적이고 간단한 방법이 있습니까? 저는 프로젝트가 가능한 한 독립적 인 모델을 선호합니다.
사용 가능한 옵션의 전체 목록이 있지만이 질문에는 명확한 답변이 없습니다. 내 개인적인 권장 사항은 ocamlbuild를 사용하는 것입니다. 여기 에 제공된 myocamlbuild.ml 파일 은 좋은 시작입니다. 다양한 라이브러리에 의존하는 프로젝트를 쉽게 컴파일 할 수 있습니다. 나는 그것이 C 라이브러리에 바인딩하는 경우를 처리한다고 생각하지 않지만, 도움이 될 수 있는 추가 예제가 위키 에 있습니다.
어떤 사람들은 ocamlbuild가 또 다른 빌드 도구이기 때문에 패키지 관리자 작업을 복잡하게 만들기 때문에 반대합니다. 그러나 사용하기 쉽고 공식 배포판에 포함되어 있다는 사실이 점점 더 널리 사용되고 있습니다.
이 모든 것을 건너 뛰고 오아시스를 직접 사용할 수도 있습니다. 매우 새롭고 안정적인 릴리스가 아직 발표되지 않았지만 매우 유용합니다. myocamlbuild.ml이 자동으로 생성됩니다. 이것은 아마도 아주 가까운 미래에 갈 수있는 방법 일 것입니다. 또한 오아시스를 사용하면 개발중인 OCaml 용 CPAN 유사 시스템 인 oasis-db의 이점을 즉시 누릴 수 있습니다.
라이브러리 관리와 관련하여 대답은 ocamlfind입니다. OCaml의 여러 인스턴스가 설치되어있는 경우 적절한 ocamlfind 복사본을 호출하면 모든 라이브러리에 대해 체계적으로 ocamlfind를 사용한다고 가정 할 때 라이브러리에 대한 모든 참조가 해당 특정 인스턴스에 대한 참조가됩니다. 저는 현재 godi를 사용하여 OCaml과 라이브러리를 설치합니다. ocamlfind를 사용하며 여러 OCaml 인스턴스를 설치하는 데 문제가 없습니다.
개인적으로 나는 ocamlbuild에 +1을 줄 것입니다. 기본 규칙은 하나의 명령으로 중소 규모 프로젝트를 컴파일하기에 충분하며 최소한의 구성에는 없습니다. 또한 매우 합리적인 규칙을 적용합니다 (소스를 빌드 결과와 혼합하지 않음). 대규모 프로젝트의 경우 추가 규칙 및 플러그인을 사용하여 원하는대로 사용자 지정할 수 있습니다. 내가 일하는 회사에서 우리는 큰 프로젝트 (Ocaml + some C + some preprocessing + ...)를 위해 그것을 사용하고 있고 그것은 매력처럼 작동합니다 (그리고 Makefiles보다 훨씬 덜 골치 아픈 일을줍니다).
매뉴얼에 관해서는 사용자 가이드 ( 저자의 웹 페이지 에서 구할 수 있음)가 시작하기에 충분할 것이라고 생각합니다 . 더 펑키 한 물건은 좀 더 파는 것이 필요할 수 있습니다.
OMake의 경우 +1.
몇 년 전에 빌드 인프라를 개선했으며 다음과 같은 이유로 OMake를 선택했습니다.
- 당사의 제품은 C, C ++, Managed C ++, Ruby 및 OCaml의 혼합으로 구성됩니다.
- 우리는 Linux와 Windows를 모두 대상으로합니다.
- 빌드 할 때 데이터베이스와 상호 작용합니다.
- 일부 제작에서는 OCaml 3.10을 사용해야했습니다.
- 우리의 원래 빌드 시스템은 autoconf / automake를 사용했습니다.
- 소스 외부 빌드 *가 필요합니다.
솔직히 말해서 우리가 ocamlbuild로 할 수 있었는지 모르겠지만 테스트하지 않았습니다. 이 도구는 OCaml의 버그 추적기에서 관련 활동이 있기 때문에 확실히 사용되고 있습니다. ocamlbuild를 선택하는 경우 최신 버전의 OCaml이 있는지 확인하십시오.
* OMake는 명확하지 않은 방식으로 소스 외부 빌드를 지원합니다. 소스가 읽기 전용 일 때도 몇 가지 문제가 있습니다. 우리는 OMake의 Windows 버전을 패치하고 다시 빌드해야했습니다.
좋은 질문. 나는 다음과 같이 말하는 경향이 있습니다.
1) ocamlbuild 효율적이고 빠르며 공식 배포판에서 제공하는 기본 도구이기 때문에 표준 컴파일 방법이 될 것입니다. 시간이 지남에 따라 남아있을 가능성이 높기 때문에 공식 배포에 포함되어 있다는 사실이 좋은 점입니다. 또한 ocamlfind가 활성화되어 있으므로 패키지 설치를위한 또 다른 표준 인 ocamlfind로 설치된 패키지를 관리 할 수 있습니다 (ocamlfind는 C의 pkg-config와 약간 비슷합니다).
2) 그러나 귀하의 프로젝트에는 충분하지 않습니다. C와의 통합은 ocamlbuild와 기본입니다. 그래서 여기서 마지막으로 질문에 답하기 위해 오아시스를 사용하라고 조언 할 것입니다. 나는 또한 OMake를 시도했지만 그것을 좋아하지 않았습니다.
3) 그러나 다른 사람들이 자신의 컴퓨터에서 프로젝트를 다운로드하고 빌드 할 수 없도록하려면 빌드 스크립트가 제대로 작동하지 않을 수 있습니다. 또한 oasis는 pkg-config를 처리하지 않습니다. 이러한 이유로 저는 ocaml-autoconf (autotools 용 ocaml 매크로)를 사용하는 것이 좋습니다. autotools는 C 라이브러리를 관리하기위한 표준이고 패키지 관리자에게 잘 알려져 있기 때문입니다. 교차 컴파일도 처리 할 수 있습니다.
=> ocamlbuild가있는 ocaml-autoconf
'programing tip' 카테고리의 다른 글
F #의 거듭 제곱 연산자가 부동 소수점 숫자에만 작동하는 이유는 무엇입니까? (0) | 2020.12.26 |
---|---|
대부분의 UI 프레임 워크가 단일 스레드 인 이유는 무엇입니까? (0) | 2020.12.26 |
Quartz.NET 구성 파일에 대한 문서는 어디에 있습니까? (0) | 2020.12.26 |
Django REST 프레임 워크의 중첩 된 리소스에 필터를 적용하려면 어떻게해야합니까? (0) | 2020.12.26 |
Android에서 최고의 REST 클라이언트 프레임 워크 / 유틸리티 (0) | 2020.12.26 |