2017-08-22 66 views
1

問題處理複雜和大型的依賴

我一直在開發一個遊戲,C++在我的業餘時間,我已經選擇使用Bazel作爲我的生成工具,因爲我從未有過一噸運氣(或有趣)與makecmake一起工作。我也有其他語言的依賴關係(python,用於某些高級腳本)。我使用glfw進行基本的窗口處理和高級圖形支持,並且運行良好,但現在出現問題。我不確定我應該如何在Bazel世界中處理像glfw這樣的依賴關係。

對於我的一些相關性(如gtestfruit)我只能引用他們在我的WORKSPACE文件和Bazel自動地處理它們,但glfw尚未通過Bazel。所以這一切都讓我問,我應該怎樣處理Bazel項目中不使用Bazel的依賴關係?

目前的做法

對於許多簡單的依賴我的,我只是創造了我WORKSPACE文件new_git_repository條目,並創建了一個BUILD文件庫。這很好,直到你真的複雜了像glfw這樣的庫,它們有很多依賴關係。

當運行X11你現在有X11依賴這意味着增加X11Bazel安裝一臺Linux機器構建glfwX11附帶它自己的一組依賴項(X11庫,如X11Cursor)等。

glfw也試圖提供Linux中默認提供的基本操縱桿支持,這非常棒!除了這是由內核提供的,這意味着內核也是我的項目的依賴項。現在我不應該需要什麼比內核頭文件。這似乎還是像很多更帶來。

替代選項

我把我到目前爲止所採取的做法的原因是爲了使啓動一臺能夠成功構建我的遊戲的機器所需的依賴性非常小。從理論上講,他們只需要一個C/C++編譯器,Java 8和Bazel,並且它們都是競爭對手。這很好,因爲這也意味着我可以創建安裝了Bazel的容器,並且很容易地執行CI/CD。

我會犧牲這個輕鬆,只是說,你需要有庫,例如試圖編譯賽前安裝glfw但帶來的是安裝哪個版本的整體,它是如何配置的所有問題,備份該Bazel應該幫助解決。

當然有一個更簡單的解決方案,我正在推翻這個?

回答

2

如果glfw項目沒有BUILD文件,那麼你有以下幾種選擇:

  • 構建glfw一個genrule內。

    如果glfw支持一些其他構建系統,如make,則可以創建運行該工具的genrule。這種方法具有明顯的缺點,比如不得不聲明所有輸入爲genrule的不可低估的不切實際性,但它將是Bazel'izing glfw最簡單的方法。

  • 預生成glfw.o並將其檢入到您的源代碼樹中。

    您可以爲它創建一個cc_library規則,並將.o文件放入srcs。儘管這個解決方案是最不靈活的,因爲您不僅將目標平臺限制在.o的建造目標平臺上,而且還難以重現整個構建,但有時候這些好處是值得的。

    我認爲這種方法是最後的手段。即使在Bazel自己的源代碼中也有一個cc_library.srcs that includes a raw object file,因爲這是值得的,因爲92caf38的提交消息說明了這一點。要求安裝glfw

    您已經考慮過此選項。有些人可能更喜歡這種方式。

+0

我會看看我是否可以一起折騰一些腳本來爲目標平臺構建'glfw',所以至少我知道可以安裝和設置正確的版本,並且現在可以使用後者。謝謝! –