OCamlMake를 사용하여 현재 빌드 된 OCaml 프로젝트가 있습니다. 모든 빌드 아티팩트를 소스 파일과 동일한 디렉토리에 남겨두기 때문에 현재 빌드 시스템에 만족스럽지 않으며 모듈 들간의 종속성 순서를 수동으로 지정해야합니다. 이 문제로 고생하지 않는 빌드 시스템으로 전환하고 싶습니다. 나는 오아시스에 시도를하기로 결정했지만 문제가 발생했습니다.ocamlbuild와의 종속 된 종속성
프로젝트가 매우 구체적인 방법으로 만들어 졌기 때문에 문제가 발생합니다. 여러 다른 데이터베이스 백엔드 (PostgreSQL, MySQL, SQLite)를 지원합니다. 현재 데이터베이스 백엔드를 컴파일하려면 백엔드에서 필요로하는 추가 라이브러리를 설치하고 환경 변수를 설정하여 사용 가능하게해야합니다. 이것은 Makefile에서 보는 방법입니다.
ifdef MYSQL_LIBDIR
DB_CODE += mysql_database.ml
DB_AUXLIBS += $(MYSQL_LIBDIR)
DB_LIBS += mysql
endif
또한 모듈이 컴파일 된 모듈 목록에 추가됩니다. 중요한 점은 응용 프로그램 시작 지점에서 도달 할 수있는 모듈과 데이터베이스 백엔드 모듈 간의 종속성 (모듈 가져 오기 관점에서)이 없다는 것입니다. 오히려 각 데이터베이스 백엔드 모듈에는 모듈이 시작될 때 실행되는 최상위 코드가 포함되어 있으며 부작용을 사용하여 주 응용 프로그램에 등록됩니다.
이 설정을 오아시스에서 사용할 수 없습니다.
Library mysql-backend
Path : .
Build $: flag(mysql)
Install : false
BuildTools : ocamlbuild
BuildDepends : main, mysql
Modules : Mysql_backend
그러나, 나는 실행에 옵션 모듈을 연결하는 오아시스를 알 수있는 방법을 알아낼 수 없습니다 : 나는 플래그와 함께 컴파일에 사용할 수있는 별도의 라이브러리로 데이터베이스 백엔드 모듈의 각을 선언했다. myocamlbuild.ml
파일을 수정하여이 작업을 수행하는 방법을 찾아 냈지만 실패했습니다. here라고 표시된 rule
함수를 사용하여이를 수행 할 수 있습니까?
ocamlbuild
으로 설명 할 수 없다면 OCamlMake의 문제를 피하고 피할 수있는 도구가 있습니까?
문제가 어떻게 해결되는지 잘 모르겠습니다. 문제는 선택적 종속성을 구현하는 방법이었습니다. 객체 섹션에서이 문제를 해결하지 못하면 호스트 프로그램에서 명시 적으로 종속성을 지정해야합니다. 기본적으로, 문제는 컴파일 레벨에서 다형성을 구현하는 방법이었습니다. 동일한 인터페이스지만 다른 구현으로 라이브러리를 대체 할 수있을 때였습니다. – ivg
아아, 알겠습니다. myocamlbuild 플러그인에서 조건부 연결을 구현했습니다. 약간 hardcodish,하지만 작동해야합니다. 이상적으로, 우리는 이것을 오아시스에 다시 기고해야합니다. PR이 PoC이므로 작동 할 수 있습니다. :) – ivg