رفتن به مطلب
مرجع رسمی سی‌پلاس‌پلاس ایران
کامبیز اسدزاده

معرفی ابزار کیوبس (Qbs) و پیکربندی آن


امتیاز دادن به این موضوع:

پست های پیشنهاد شده

معرفی ابزار

کیوبس (Qbs) با آوای (“Cubes”) همانند qmake و cmake یک ابزار بسیار ساده و قدرتمند برای ساخت پروژه در پلتفرم‌های مختلف می‌باشد. این ابزار قابلیت استفاده در هر نوع پروژه ای را دارد به‌گونه‌ای که مهم نیست زبان‌برنامه نویسی٬ ابزار‌ها و حتی کتابخانه‌های مورد استفاده چه چیزی باشند. کیوبس یک ابزار همه کاره است که یک نمودار ساخت از پروژه‌های سطح بالا مانند (qmake و cmake) فراهم می‌کند که علاوه بر آن وظیفه اجرای دستورات نمودار ساخته شده در سطح پایین را مانند (make) فراهم می‌کند. در این کتاب ما به پیش معرفی آن می‌پردازیم چرا که قرار است در نسخه ۶ کیوت جایگزین نوع .pro از qmake باشد.

کیوبس برنامه‌ها را بر پایهٔ اطلاعاتی می‌سازد که در قالب یک فایل QML فراهم می‌شوند. هر فایل پروژه مشخص می‌کند که پروژه می‌تواند شامل چندین محصول باشد و شما نوع پروژه می‌توانیدمشخص کنید که یکی از انواع : نرم افزار، کتابخانه و غیره باشد. مشخصات سیستم مورد نیاز جهت استفاده از ابزار QBS حداقل نسخه ۵.۶.۰ به بعد خواهد بود. این ابزار همراه با Qt ارائه می‌شود.

 

معرفی ساختار QBS در قالب QML

کیوبس برای فایل پروژه خود از پسوند (*.qbs) استفاده می‌کند تا بتواند محتوای موجود در یک پروژه را معرفی کند. به طور کلی یک پروژه شامل چندین محتوا از محصول (پروژه) می‌باشد که در ادامه به آن‌ها اشاره شده است. یک محصول هدفی از روند ساخت است٬ به طور معمول یک برنامه کاربردی٬ کتابخانه و یا شاید یک چیز دیگر می‌تواند هدف آن باشد. جهت بررسی و مدیریت Qbs وارد بخش Setting یا Perefrences شوید و زبانه Qbs را انتخاب کنید تا در این بخش به نسخه و پیکربندی مقادیر مربوط به Qbs دسترسی داشته باشید.

QBS-01.png

مباحثی که در این پست آموزشی پوشش داده خواهد شد:

  • نحوهٔ استفاده
  • معرفی انواع پروژه‌ها
  • معرفی برخی از پر کاربرد‌ترین آیتم‌های موجود در کیوبس مانند:
    • پروژه Project
    • زیر پروژه SubProject
    • ویژگی‌ها (خواص‌ها) Properties
    • اپلیکیشن Application
    • اپلیکیشن سی‌پلاس‌پلاس CppApplication
    • کتابخانه (پویا) DynamicLibrary
    • کتابخانه (ایستا) StaticLibrary
    • محصول Product
    • پروفایل Profile
    • گروه‌‌بندی Group
    • وابستگی‌ها Depends
    • و ...
  • معرفی ماژول‌های پر کاربرد در کیوبس مانند:
    • ماژول cpp جهت پیکربندی و پشتیبانی از C++ و ویژگی‌های آن در کیوبس
    • پیکربندی ماژول‌های کیوت
    • پیکربندی ویژگی‌های پردازنده
    • پیکربندی اختصاصی اندروید
    • پیکربندی اختصاصی محصولات اپل
    • پیکربندی Xcode
    • پیکربندی ماژول‌های کیوت
    • پیکربندی Java
    • و ...
  • در صورت نیاز به مباحث دیگری نیز اشاره خواهد شد.

نحوهٔ استفاده

جهت استفاده از کیوبس کافی است با سینتکس JavaScript یا QML آشنا باشید. جهت پیکربندی یک پروژه سی‌پلاس‌پلاس نمونه کُد آن به صورت زیر خواهد بود:

import qbs 1.0

Application {
    name: "helloworld"
    files: "main.cpp"
    Depends { name: "cpp" }
}

انواع پروژه‌ها در کیوبس به چهار دستهٔ زیر تقسیم بندی می‌شوند:

  1. تولید اپلیکیشن ساده (Application)
    • این نوع پروژه به عنوان یک آیتم از محصول می‌باشد. 
       
      Application {
          Depends { name: "cpp" }
      }
  2. تولید اپلیکیشن تحت وابستکی و ویژگی‌های سی‌پلاس‌پلاس (CppApplication)
    • به عنوان یک محصول که تحت وابستگی‌های ماژول Cpp می‌باشد استفاده می‌شود.
       
      CppApplication {
      
       cpp.cxxLanguageVersion: "c++11"
              
       files: [
          "main.cpp",
          "qml.qrc",
         ]
      }
  3. تولید پروژه در قالب کتابخانهٔ پویا (DynamicLibrary)
    • این نوع زمانی مورد استفاده قرار می‌گیرد که قرار است پروژه را در قالب یک خروجی کتابخانهٔ پویا تولید کنیم.
       
      Product {
          type: "dynamiclibrary"
      }
  4. تولید پروژه در قالب کتابخانهٔ استاتیک (StaticLibrary)
    • این نوع زمانی مورد استفاده قرار می‌گیرد که قرار است پروژه را در قالب یک خروجی کتابخانهٔ ایستا تولید کنیم.
    • مثال
       
      Product {
          type: "staticlibrary"
      }

       

در یک پروژه برای مشخص کردن فایل‌های قابل استفاده، نام و وابستگی‌ها به سادگی می‌توانند مشخص شوند. برای مثال در صورتی که پروژهٔ شما تحت فناوری کیوت و Qt Quick است کافی است مقدار Depends را مشخص کنید:

Depends { name: "Qt.core" }
Depends { name: "Qt.quick" }

لیستی از آیتم‌های (پر کاربرد و پایه) در QBS

  • آیتم پروژه (Project) به عنوان یک آیتم از پروژه مجموعه‌ای از محصولات و خواص‌های مربوط به آن‌ها را ارائه می‌دهد.
  • آیتم زیر پروژه‌ (Sub Project) یک ایتم زیر پروژه برای اضافه کردن یک پروژه به عنوان زیر مجموعه پروژه می‌باشد که در یک فایل جداگانه تعریف شده است.
        SubProject {
            filePath: "Subproject/OtherProject.qbs"
            Properties {
                name: "A sub-project"
            }
        }
  • آیتم خواص (Properties) شرایط دستوری و خاصیت‌های مورد نیاز را برای یک محصول ایجاد می‌کند.
     Product {
          Properties {
              condition: qbs.targetOS.contains("windows")
              ...
              .....
          }
      }
    - خواص condition از نوع بولین جهت شرط سازی سایر موارد در یک محصول را فراهم می‌کند.
    - خواص overrideListProperties لیست خواص تنظیم شده را که در ماژول‌ها به دست می آید را بر می‌گرداند.
     
  • آیتم اپلیکیشن Application به عنوان یک آیتم با نوع 'application' برای یک محصول تعریف می‌شود.
  • آیتم اپلیکیشن سی‌پلاس‌پلاس CppApplication به عنوان یک محصول با وابستگی‌های لازم در سی‌پلاس‌پلاس می‌باشد.
  • آیتم کتابخانه‌‌ی پویا (DynamicLibrary) به عنوان یک آیتم برای محصول از نوع کتابخانه در قالب داینامیک (پویا) می‌باشد.
    import qbs
    
    Project {
        minimumQbsVersion: "1.7.1"
        
        CppApplication {
    
            type: "dynamiclibrary"
            ...
            
            Group {    
                // Properties for the produced executable
                fileTagsFilter: "application"
                qbs.install: true
            }
        }
    
    }

     

  • آیتم کتابخانه‌‌ی ایستا (StaticLibrary) به عنوان یک آیتم برای محصول از نوع کتابخانه در قالب استاتیک (ایستا) می‌باشد.
    import qbs
    
    Project {
        minimumQbsVersion: "1.7.1"
        
        CppApplication {
    
            type: "staticlibrary"
            ...
            
            Group {    
                // Properties for the produced executable
                fileTagsFilter: "application"
                qbs.install: true
            }
        }
    
    }

     

  • آیتم محصول (Product) به عنوان یک محصول (Product) به طور معمول نتیجه یک فرآیند ساخت را ارائه می‌دهد. مجموعه ای از فایلهای ورودی و خروجی را مشخص می‌کند. برای مثال نمونهٔ زیر محصول را به عنوان یک پروژه سی پلای پلاس تنظیم می‌کند.
    Product {
          name: "helloworld"
          type: "application"
          files: "main.cpp"
          Depends { name: "cpp" }
      }

    خواص عضو در محصول (Product)

 

  • aggregate : bool
  • buildDirectory : path
  • builtByDefault : bool
  • condition : bool
  • consoleApplication : bool
  • destinationDirectory : string
  • excludeFiles : stringList
  • files : stringList
  • multiplexByQbsProperties : stringList
  • multiplexedType : stringList
  • name : string
  • qbsSearchPaths : stringList
  • sourceDirectory : path
  • targetName : string
  • type : stringList
  • version : string 

 

  • عضو aggregate اگر مقدارش برابر با true باشد، محصولی را که تحت وابستگی چندگانه باد در قالب یک محصول جمع آوری شده تولید خواهد کرد. در صورتی که شما نمی‌خواهید چنین کاری کنید بهتر است آن را به صورت تعریف نشده در نظر بگیرید.
  • عضو buildDirectory دایرکتوری (ریشه مسیر) برای ساخت محصول است. فایل‌های تولید شده بعد از کامپایل در این مسیر قرار خواهند گرفت که به صورت پیش فرض توسط Qbs مقدار دهی می‌شود و کاربر نمی‌تواند آن را تغییر دهد.
  • عضو buildByDefault تعیین کننده ساخت محصول است. اگر مقدارش false باشد، عمل ساخت محصول تنها در زمان درخواست صریح صورت خواهد گرفت که دستور ساخت آن توسط پارامتر --products و یا استفاده از --all-products برای دستور ساخت استفاده خواهد شد. مقدار آن به صورت پیشفرض true می‌باشد.
  • عضو condition تعیین می‌کند که محصول ساخته خواهد شد، اگر مقدارش false باشد، محصول ساخته نخواهد شد. مقدار این عضو به صورت پیشفرض true است.
  • در ویندوز، تعیین می‌کند که برنامه تحت GUI تولید شود یا تحت کنسول. اگر مقدار آن برابر true باشد،  یک اپلیکیشن تحت کنسول تولید خواهد شد. در غیر این صورت یک اپلیکیشن تحت رابط کاربری (GUI) تولید خواهد شد. در پلتفرم‌های اپل، به نوع برنامه به صورت پیشفرض بستگی دارد. اگر مقدارش true باشد، یک برنامه اجرایی طبیعی تولید خواهد شد در غیر این صورت، بستهٔ نرم‌ا‌فزاری تولید می‌شود.
  • عضو destinationDirectory مسیری است که در هدف مصنوعات قرار می‌گیرد. اگر یک مسیر نسبی داده شود آن را به عنوان دایرکتوری پایه برای project.buildDirectory تنظیم می‌کند.
  • عضو exclude-files لیست فایلهای منبع یا سورس را شاملش نمی‌شود. برای موارد معروف و خاص مفید است.
  • عضو files لیستی از فایل های منبع یا سورس را شامل می‌شود. 
  • عضو multiplexByQbsProperties مشخص می‌کند که کدام خواص ماژول qbs برای استفاده از محصولات چندگانه استفاده شود.
  • عضو multiplexedType نوع محصول را برای نمونه محصولات چند گانه مشخص می‌کند. در صورتی که نیاز به این خواص ندارید می‌توانید آن را تعریف نکنید.
  • عضو name نام محصول را اعمال میکند. مقدار آن باید بر اساس یک عبارت جاوا اسکریپتی باشد.
    
      CppApplication {
          name: "hello" + "world"
          // valid
      }
      CppApplication {
          name: "app_" + qbs.targetOS.join("_")
          // invalid
      }
    
  • عضو qbsSearchPath با مقدار project.qbsSearchPaths ادغام خواهد شد که لیستی از مسیرها را برای وارد کردن ماژول‌ها جستجو می‌کند.
  • عضو sourceDirectory دایرکتوری یا مسیر منبع را برای محصول مشخص می‌کند. این دایرکتوری برای فایل‌هایی که در محصول تعریف شده اند می‌باشد.
  • عضو targetName نام پایه فایل است که با هدف مصنوعات برای محصول می‌باشد. مقدار نام فایلی که نامعتبر باشد توسط کاراکتر زیر خط جایگزین می‌شود.
  • عضو type برچسب‌های فایل مربط به مصنوعات محصول را مشخص می‌کند.
  • عضو version شماره نسخه محصول را مشخص می‌کند. برای کتابخانه‌های به اشتراک گذاری شده و همچنین فایل Info.plist تحت محصولات اپل مورد استفاده می‌گیرد.
     
  • آیتم پروفایل (Profile) به عنوان پروفایل سفارشی می‌تواند برای تعریف اهداف و شرایط ساخت بر روی یک ماشین خاص تنظیم شود.
        Profile {
                  name: "my-special-profile"
                  qbs.toolchainType: "gcc"
                  qbs.targetPlatform: "linux"
                  qbs.architecture: "armv7a"
                  cpp.toolchainInstallPath: "/opt/special-gcc/bin"
                  cpp.toolchainPrefix: "arm-linux-gnueabi-"
              }
    
              qbs.profiles: ["my-special-profile"]
    

     

  • آیتم گروه (Group) جهت تعریف گروه‌های مختلف در فایل‌هایی که شامل یک محصول می‌باشند مورد استفاده قرار می‌گیرد. این ویژگی در محیط توسعه برای مدیریت پروژه‌های بزرگ بسیار کارآمد و مفید است.
     Application {
          Group {
              name: "common files"
              files: ["myclass.h", "myclass_common_impl.cpp"]
          }
          Group {
              name: "Windows files"
              condition: qbs.targetOS.contains("windows")
              files: "myclass_win_impl.cpp"
          }
          Group {
              name: "Unix files"
              condition: qbs.targetOS.contains("unix")
              files: "unixhelper.cpp"
              Group {
                  name: "Linux files"
                  condition: qbs.targetOS.contains("linux")
                  files: "myclass_linux_impl.cpp"
              }
              Group {
                  name: "FreeBSD files"
                  condition: qbs.targetOS.contains("freebsd")
                  files: "myclass_freebsd_impl.cpp"
              }
              Group {
                  name: "macOS files"
                  condition: qbs.targetOS.contains("macos")
                  files: "myclass_macos_impl.cpp"
              }
              Group {
                  name: "PS4 Pro files"
                  condition: qbs.targetOS.contains("linux")
                  files: "myclass_macos_impl.cpp"
              }
              Group {
                  name: "Xbox One X files"
                  condition: qbs.targetOS.contains("windows")
                  files: "myclass_macos_impl.cpp"
              }
          }
          Group {
              name: "Files to install"
              qbs.install: true
              qbs.installDir: "share"
              files: "runtime_resource.txt"
          }
      }
    
  • آیتم وابستگی (Depends) یک آیتم وابستگی در یک محصول یا ماژول تعریف می‌شود. به عنوان مثال محصول زیر ماژول Qt Quick، Qt Core و Qt Gui را بارگیری می‌کند.
        Product {
            
            Depends { name: "Qt.core" }
            Depends { name: "Qt.quick" }
            Depends { name: "Qt.gui" }
        }

    و یا به روش زیر تحت کتابخانهٔ Qt ماژول‌های مربوطه را بارگیری می‌کند.
     

        Product {
            Depends { name: "Qt"; submodules: ["core", "quick", "gui"] }        
        }

    ترکیبی از ماژول‌های مختلف از پروژه‌های مختلف به صورت زیر خواهد بود:
     

        Product {
            Depends { name: "cpp" }        
            Depends { name: "MyEngine"; submodules: ["module1", "module2", "module3"] }                
            Depends { name: "Qt"; submodules: ["core", "quick", "gui"] }        
        }

     

معرفی ماژول‌های پر کاربرد در Qbs

  • ماژول cpp جهت پیکربندی و پشتیبانی از C++ و ویژگی‌های آن در کیوبس
    • برخی از ویژگی‌های موجود در این ماژول به صورت زیر آورده شده‌اند:

 

  • allowUnresolvedSymbols : bool
  • alwaysUseLipo : bool
  • architecture : string
  • archiverName : string
  • archiverPath : string
  • assemblerFlags : stringList
  • assemblerName : string
  • assemblerPath : string
  • automaticReferenceCounting : bool
  • cFlags : stringList
  • cLanguageVersion : stringList
  • combineCSources : bool
  • combineCxxSources : bool
  • combineObjcSources : bool
  • combineObjcxxSources : bool
  • commonCompilerFlags : stringList
  • compilerDefinesByLanguage : var
  • compilerFrameworkPaths : pathList
  • compilerIncludePaths : pathList
  • compilerLibraryPaths : pathList
  • compilerName : string
  • compilerPath : string
  • compilerPathByLanguage : var
  • compilerVersionMajor : int
  • compilerVersionMinor : int
  • compilerVersionPatch : int
  • compilerWrapper : stringList
  • cppFlags : stringList
  • cxxFlags : stringList
  • cxxLanguageVersion : stringList
  • cxxStandardLibrary : string
  • debugInformation : bool
  • defines : stringList
  • discardUnusedData : bool
  • distributionFrameworkPaths : pathList
  • distributionIncludePaths : pathList
  • distributionLibraryPaths : pathList
  • driverFlags : stringList
  • driverLinkerFlags : stringList
  • dsymutilFlags : stringList
  • dsymutilPath : string
  • dynamicLibraries : stringList
  • enableCompilerDefinesByLanguage : stringList
  • enableExceptions : bool
  • enableReproducibleBuilds : bool
  • enableRtti : bool
  • endianness : string
  • entryPoint : string
  • exceptionHandlingModel : string
  • exportedSymbolsCheckMode : string
  • frameworkPaths : pathList
  • frameworks : stringList
  • generateManifestFile : bool
  • includePaths : pathList
  • libraryPaths : pathList
  • linkerFlags : stringList
  • linkerMode : string
  • linkerName : string
  • linkerPath : string
  • linkerWrapper : stringList
  • lipoPath : string
  • minimumIosVersion : string
  • minimumMacosVersion : string
  • minimumTvosVersion : string
  • minimumWatchosVersion : string
  • minimumWindowsVersion : string
  • nmName : string
  • nmPath : string
  • objcFlags : stringList
  • objcopyName : string
  • objcopyPath : string
  • objcxxFlags : stringList
  • optimization : string
  • platformDefines : stringList
  • positionIndependentCode : bool
  • prefixHeaders : pathList
  • requireAppContainer : bool
  • requireAppExtensionSafeApi : bool
  • rpathOrigin : string
  • rpaths : stringList
  • runtimeLibrary : string
  • separateDebugInformation : bool
  • soVersion : string
  • sonamePrefix : string
  • staticLibraries : stringList
  • stripName : string
  • stripPath : string
  • systemFrameworkPaths : pathList
  • systemIncludePaths : pathList
  • systemRunPaths : stringList
  • treatSystemHeadersAsDependencies : bool
  • treatWarningsAsErrors : bool
  • useCPrecompiledHeader : bool
  • useCxxPrecompiledHeader : bool
  • useLanguageVersionFallback : bool
  • useObjcPrecompiledHeader : bool
  • useObjcxxPrecompiledHeader : bool
  • useRPathLink : bool
  • useRPaths : bool
  • variantSuffix : string
  • visibility : string
  • warningLevel : string
  • weakFrameworks : stringList
  • windowsApiAdditionalPartitions : stringList
  • windowsApiCharacterSet : string
  • windowsApiFamily : string 
  • با توجه به لیست بالا، به برخی از ویژگی‌های موجود در این لیست اشاره می‌کنیم.
  • ویژگی cxxLanguageVersion و cLanguageVersion جهت تعیین کردن پشتیبانی از نسخهٔ زبان‌های سی‌پلاس‌پلاس و سی مورد استفاده قرار می‌گیرد که مشخصه‌های آن به ترتیب برای سی‌پلاس‌پلاس c++98 | c++11 | c++14 | c++17 و برای سی c89 | c98 | c11 می‌باشند. 
    cpp.cLanguageVersion: "c11"
    cpp.cxxLanguageVersion: "c++17"

     

  • پسندیدن 1

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
مهمان
این موضوع برای عدم ارسال قفل گردیده است.

  • کاربران آنلاین در این صفحه   0 کاربر

    هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.

×
×
  • جدید...