मैं बाज़ेल के लिए कुल नौसिखिया हूं और अपने निर्माण में एक स्थिर पुस्तकालय जोड़ने की कोशिश कर रहा हूं।

आइए एक साधारण उदाहरण के रूप में कहें कि मेरे पास निम्न है।

cc_import(
  name = "my_test_lib"
  static_library = "lib\my_test_lib\test.lib"
  hdrs = ["lib\my_test_lib\include\headerA.h", 
          "lib\my_test_lib\include\headerB.h"]
  visibility = ["//visibility:public"],
)

अब यह ठीक काम करता है।

हालांकि, अगर मेरे पास बड़ी संख्या में शामिल हैं और निर्देशिका में शामिल हैं तो कई उपनिर्देशिकाएं हैं। क्या मुझे प्रत्येक को व्यक्तिगत रूप से दर्ज करना होगा जिस पर मेरी मुख्य परियोजना निर्भर करती है, या क्या मैं इस निर्देशिका/उपनिर्देशिका में सभी शीर्षलेखों को अनिवार्य रूप से उपलब्ध कराने के लिए निम्नलिखित की तरह कुछ कर सकता हूं?

 hdrs = [ "lib\my_test_lib\include\*"]
1
oracle3001 27 जून 2019, 00:30

2 जवाब

सबसे बढ़िया उत्तर

आपको जो चाहिए वह है glob फ़ंक्शन।

अपने उपरोक्त उदाहरण में इसका उपयोग करने के लिए, आप कुछ इस तरह करेंगे

cc_import(
  name = "my_test_lib"
  static_library = "lib/my_test_lib/test.lib"
  hdrs = glob(["lib/my_test_lib/include/*.h"])
  visibility = ["//visibility:public"],
)

जो .h से समाप्त होने वाली सभी फाइलों को lib\my_test_lib\include के तहत ढूंढेगा और उन्हें आपके cc_import की hdrs विशेषता में डाल देगा।

Bazel दस्तावेज़ में glob के बारे में अधिक जानकारी है: https: //docs.bazel.build/versions/master/be/functions.html#glob

नोट: Bazel BUILD फ़ाइलों (यहां तक ​​कि विंडोज़ पर भी) में सभी प्लेटफ़ॉर्म पर हमेशा फ़ॉरवर्ड स्लैश का उपयोग करें।

एकाधिक ग्लोब पैटर्न

कभी-कभी ग्लोब में एक से अधिक पैटर्न डालना उपयोगी होता है, उदाहरण के लिए इस तरह

cc_import(
  ...
  hdrs = glob([
    "lib/my_test_lib/include/*.h",
    "lib/my_test_lib/include/*.hpp",
    "lib/my_test_lib/public/*.h",
  ]),
  ...
)

ग्लोब को फ़ाइलों की हार्ड कोडित सूची के साथ संयोजित करना

एक और उपयोगी चीज ग्लब्स को हार्ड कोडेड पथों के साथ जोड़ना है। आपके पास कुछ फाइलें हो सकती हैं जिन्हें आप वहां चाहते हैं और फिर एक निर्देशिका जिसे आप भी शामिल करना चाहते हैं। आप + ऑपरेटर का उपयोग करके पथों की हार्ड कोडित सूची को ग्लोब परिणामों के साथ इस तरह से जोड़ सकते हैं

cc_import(
  ...
  hdrs = [
    "lib/my_test_lib/some_header.h",
  ] + glob([
    "lib/my_test_lib/include/*.h",
  ]),
  ...
)

निर्देशिका पदानुक्रम को ग्लोबिंग करना (बड़े पैमाने पर समावेशन से सावधान रहना)

glob फ़ंक्शन फ़ाइलों को ढूंढते समय ट्रैवर्सिंग निर्देशिकाओं और उनकी उप निर्देशिकाओं का भी समर्थन करता है। यह ** ग्लोब पैटर्न का उपयोग करके किया जा सकता है। इसलिए, उदाहरण के लिए, my_test_lib निर्देशिका में सभी .h फाइलों को पकड़ने के लिए, इस ग्लोब का उपयोग करें

cc_import(
  ...
  hdrs = glob([
    "lib/my_test_lib/**/*.h",
  ]),
  ...
)

सावधान रहें: इसमें निर्दिष्ट निर्देशिका के नीचे सभी फ़ाइलें शामिल होंगी, जैसा कि अपेक्षित था। यह हाथ से निकल सकता है क्योंकि यह स्पष्ट नहीं है कि कौन सी फाइलें शामिल हैं। ** से दूर रहना ही बेहतर होगा।

1
Sebastian Ärleryd 28 जून 2019, 13:57

[यह सेबेस्टियन के उत्तर का पूरक है।] cc_import के साथ उपयोग करने के लिए मैंने अभी-अभी (एक सहकर्मी से) एक तरकीब सीखी है:

मान लीजिए कि आप अपने हेडर को "नग्न" नहीं दिखाना चाहते हैं, लेकिन उन सभी को अपने पुस्तकालय के नाम से पहले एक उपदिर में चाहते हैं, ताकि आप उन्हें इस तरह देखें:

#include <openjpeg/openjpeg.h>

पहला कदम एक निर्देशिका संरचना है जो इस तरह दिखती है:

. <library root>
- include
  - openjpeg
    - openjpeg.h
    - <other header files>

लेकिन अब यदि आप इन शीर्षलेख फ़ाइलों को glob, जैसे, glob(["mylib/include/openjpeg/*.h"]) या glob(["mylib/include/**/*.h"]) (या उन्हें स्पष्ट रूप से नाम देकर भी!) के माध्यम से उजागर करते हैं, तो वे वास्तव में #include <openjpeg/openjpeg.h> लेकिन इसके बजाय #include "openjpeg.h" या #include <include/openjpeg/openjpeg.h> या ऐसा ही कुछ।

समस्या यह है कि cc_import अनजाने में उस includes विशेषता का समर्थन नहीं करता है जो cc_library करती है, इसलिए आप केवल एक शामिल निर्देशिका.

तो, अप्रत्यक्ष स्तर का एक और स्तर जोड़ने के मानक कंप्यूटर विज्ञान समाधान का उपयोग करें और इसका उपयोग करें:

cc_library(name = "openjpeg", 
           includes = ["include"],
           deps = ["openjpeg-internal"],
           visibility = ["//visibility:public"],
)
cc_import(name = "openjpeg-internal",
          hdrs = glob(["include/**/*.h"]),
          static_library = ...,
          visibility = ["//visibility:private"],
)
0
davidbak 11 सितंबर 2019, 22:01