কোনও ফোল্ডারে সমস্ত ফাইল স্বয়ংক্রিয়ভাবে সিএমকে ব্যবহার করে কোনও লক্ষ্যবস্তুতে যুক্ত করবেন?


163

আমি ভিজ্যুয়াল সি ++, এক্সকোড এবং মেকফাইলগুলিতে সিএমকে পৃথক বিল্ড ম্যানেজমেন্ট সিস্টেম থেকে ক্রস প্ল্যাটফর্ম প্রকল্পটি স্যুইচ করার কথা ভাবছি।

আমার একটি প্রয়োজনীয় বৈশিষ্ট্য হ'ল ডিরেক্টরিতে থাকা সমস্ত ফাইল স্বয়ংক্রিয়ভাবে একটি টার্গেটে যুক্ত করা। যদিও এটি মেকিংয়ের সাথে করা সহজ, এটি ভিজ্যুয়াল সি ++ এবং এক্সকোডের সাহায্যে সহজেই করা যায় না (আমি ভুল হলে আমাকে সংশোধন করি)। এটি সরাসরি সিএমকে করা সম্ভব? কিভাবে?


BTW। কমপক্ষে সি # প্রকল্পগুলিতে ভিজ্যুয়াল স্টুডিওতে, প্রকল্প এক্সপ্লোরারটিতে একটি সরঞ্জামদণ্ডের বোতাম রয়েছে, নাম দেওয়া আছে সমস্ত ফাইল show এটি প্রজেক্টের সমস্ত উপ ডিরেক্টরিকে দৃশ্যমান করে তোলে, প্রজেক্টে যুক্তিযুক্তভাবে অন্তর্ভুক্ত কোনও ফাইল না থাকলে গ্রেইয় আউট করে। আপনি এই ডিরেক্টরিগুলি প্রসঙ্গ মেনুতে অন্তর্ভুক্ত করতে পারেন, যার মধ্যে তাদের অভ্যন্তরের সমস্ত উত্স ফাইল অন্তর্ভুক্ত রয়েছে, পুনরাবৃত্তভাবে :)
ইয়োম্যান

উত্তর:


228

এটা সম্ভব. যেমন file(GLOB:

cmake_minimum_required(VERSION 2.8)

file(GLOB helloworld_SRC
    "*.h"
    "*.cpp"
)

add_executable(helloworld ${helloworld_SRC})

নোট করুন যে এর জন্য কোনও উত্স ফাইল যুক্ত বা সরিয়ে ফেলা হলে ম্যানুয়াল পুনরায় চলমান হওয়া দরকার cmake, যেহেতু উত্পন্ন বিল্ড সিস্টেমটি কখন সিএমকেকে পুনরায় তৈরি করতে জিজ্ঞাসা করতে পারে তা জানে না এবং প্রতিটি বিল্ডে এটি করার ফলে বিল্ড সময়টি বাড়বে।


11
ম্যানুয়ালি রিম-রানিং ক্যাম্যাকের বিকল্প হ'ল মেক চালানোর আগে সিএমকেলিস্টস টেক্সট ফাইলটি স্পর্শ করা।
সিউমাস কনর


8
> "আমরা আপনার উত্স ট্রি থেকে উত্স ফাইলগুলির একটি তালিকা সংগ্রহের জন্য জিএলওবি ব্যবহার করার পরামর্শ দিই না a এটি হ্যান্ড 1 ক্লাউড দ্বারা সংযুক্ত CMAKE3.7 নথিতে আর পুনঃনির্ধারণ করা হবে না
ট্রিপল

4
GLOB এর বিকল্প তখন কী?
শায়েন

13
V3.1 এর থেকে আরও ভাল উপায় এখানে প্রস্তাবিত হয়েছে: টার্গেট_সোর্স () crascit.com/2016/01/31/…
শেন

34

ক্লেস্টের উত্তর অবশ্যই কার্যকরভাবে কাজ করে তবে একটি গুরুত্বপূর্ণ সতর্কতা রয়েছে:

আপনি যখন Makefileম্যানুয়ালি লিখবেন , আপনি SRCSসমস্ত .cppএবং .hফাইল নির্বাচন করার জন্য কোনও ফাংশন ব্যবহার করে একটি ভেরিয়েবল তৈরি করতে পারেন । যদি পরে কোনও উত্স ফাইল যুক্ত করা হয় তবে পুনরায় চলমান makeএটি অন্তর্ভুক্ত করবে।

যাইহোক, সিএমকে (যেমন একটি কমান্ড সহ file(GLOB ...)) স্পষ্টভাবে একটি ফাইল তালিকা তৈরি করবে এবং এটি স্বয়ংক্রিয়ভাবে উত্পন্ন উত্পাদনে রাখবে Makefile। যদি আপনি একটি নতুন উৎস ফাইল থাকে, তাহলে আপনি পুনরায় জেনারেট করতে হবে Makefileপুনরায় চালিয়ে cmake

সম্পাদনা: মেকফিল সরানোর দরকার নেই।


4
চাহানো সহজভাবে পুনরায় চালানো যায় না, যা পুরানো মেকফিলটিকে সরিয়ে / সংশোধন করে?
ইথান

25
এটি কোনও উত্তর নয়, এটি @ ক্লিস্টের উত্তর সম্পর্কে একটি মন্তব্য।
Neowizard

3
@ নিউউইজার্ড স্ট্যাকওভারফ্লো পরিভাষায় নেই।
কারা ডানিজ

1
এই মন্তব্যটি দুর্দান্ত, তবে এটি "স্ট্যান্ডার্ড", তাই না? প্রশ্নকারী ইতিমধ্যে cmake ব্যবহার করছে, তাই মেক প্রস্তাব "চতুর" হতে পারে যে সহায়ক নয়।
frankliuao

তাহলে কি নতুন উত্স ফাইল যুক্ত করার এবং পুনরায় চলমান চাবি ছাড়াই বিল্ড করার কোনও উপায় আছে?
আর্টিন

6

@ ক্লিস্ট উত্তরের জন্য এক্সটেনশন :

CMake যেহেতু 3,12 অতিরিক্ত বিকল্প CONFIGURE_DEPENDS হয় সমর্থিত কমান্ড দ্বারা file(GLOB)এবং file(GLOB_RECURSE)। এই অপশনটি দিয়ে আছে কোন চাহিদা থেকে ম্যানুয়ালি পর ডিরেক্টরির মধ্যে একটি উৎস ফাইল যোগে / অপসারণের পুনরায় চালানোর CMake - CMake পুনরায় চালানোর পরবর্তী প্রকল্প নির্মাণের স্বয়ংক্রিয়ভাবে হবে।

যাইহোক, CONFIGURE_DEPENDS বিকল্পটি বোঝায় যে প্রতিবার বিল্ডিংয়ের জন্য অনুরোধ করা হলে সংশ্লিষ্ট ডিরেক্টরিটি পুনরায় চেক করা হবে, সুতরাং বিল্ড প্রক্রিয়াটি CONFIGURE_DEPENDS ব্যতীত বেশি সময় ব্যয় করবে ।

এমনকি CONFIGURE_DEPENDS বিকল্পের সাথে সিএমকে ডকুমেন্টেশন এখনও উত্সগুলি ব্যবহার বা ব্যবহারের জন্য সুপারিশ করে নাfile(GLOB)file(GLOB_RECURSE)


"সিএমকে ডকুমেন্টেশনগুলি এখনও উত্সগুলি ব্যবহার file(GLOB)বা file(GLOB_RECURSE)সংগ্রহ করার জন্য সুপারিশ করে না " তারা তখন কী সুপারিশ করবেন? উত্স সংগ্রহ করতে বা ম্যানুয়ালি প্রতিটি একক উত্স ফাইলের তালিকা করতে অন্য কিছু ব্যবহার করছেন?
টমাস

1
@ থমাস: তারা প্রতিটি উত্স ফাইল ম্যানুয়ালি তালিকাবদ্ধ করার পরামর্শ দেয়। এই উত্তরটি সুপারিশের দুর্দান্ত ব্যাখ্যা দেয়।
Tsyvarev

-2

সুতরাং কেন আপনার জন্য উত্স ফাইলগুলির তালিকা তৈরি করতে পাওয়ারশেল ব্যবহার করবেন না। এই স্ক্রিপ্ট একবার দেখুন

param (
    [Parameter(Mandatory=$True)]
    [string]$root 
)

if (-not (Test-Path  -Path $root)) {    
throw "Error directory does not exist"
}

#get the full path of the root
$rootDir = get-item -Path $root
$fp=$rootDir.FullName;


$files = Get-ChildItem -Path $root -Recurse -File | 
         Where-Object { ".cpp",".cxx",".cc",".h" -contains $_.Extension} | 
         Foreach {$_.FullName.replace("${fp}\","").replace("\","/")}

$CMakeExpr = "set(SOURCES "

foreach($file in $files){

    $CMakeExpr+= """$file"" " ;
}
$CMakeExpr+=")"
return $CMakeExpr;

মনে করুন এই কাঠামোর সাথে আপনার একটি ফোল্ডার রয়েছে

C:\Workspace\A
--a.cpp
C:\Workspace\B 
--b.cpp

উদাহরণস্বরূপ এখন এই ফাইলটিকে "জেনারেটসোর্সলিস্ট.পিএস 1" হিসাবে সংরক্ষণ করুন এবং স্ক্রিপ্টটি চালান

~>./generateSourceList.ps1 -root "C:\Workspace" > out.txt

out.txt ফাইল থাকবে file

set(SOURCE "A/a.cpp" "B/b.cpp")

প্রশ্নটি ট্যাগ করা ক্রস প্ল্যাটফর্ম - পাওয়ারশেল ক্রস প্ল্যাটফর্ম নয়।
রিচার্ট

@reichhart PowerShell খুব লিনাক্স এবং ম্যাক উপর কাজ করে
Noone

আমি জানি. তবে পাওয়ারশেলের জন্য কোনও ট্যাগ নেই এবং "সিএমকে" ইতিমধ্যে ক্রসপ্ল্যাটফর্ম। "পাওয়ারশেল" একটি অতিরিক্ত নির্ভরতা হতে পারে এবং উইন্ডোজ ছাড়া অন্য ওএসে খুব কমই ব্যবহৃত হয়। আপনি লিনাক্সে পাওয়ারশেলের লোকের চেয়ে আরও সি ​​# বিকাশকারী খুঁজে পেতে পারেন। এবং সবচেয়ে গুরুত্বপূর্ণ ঘটনাটি হল প্রশ্ন: "সরাসরি সিএমকে এটি করা সম্ভব? কীভাবে?"
রিচার্ট 21
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.