সিএমকে দিয়ে সিসি কীভাবে ব্যবহার করবেন?


90

আমি নিম্নলিখিতগুলি করতে চাই: সিসিচি যদি PATH তে উপস্থিত থাকে তবে সংকলনের জন্য "ccache g ++" ব্যবহার করুন, অন্যথায় g ++ ব্যবহার করুন। আমি একটি ছোট মাই-কম স্ক্রিপ্টযুক্ত স্ক্রিপ্ট লেখার চেষ্টা করেছি

    CC="ccache gcc" CXX="ccache g++" cmake $*

তবে এটি কাজ করছে বলে মনে হচ্ছে না (চলছে মেকিং এখনও ccache ব্যবহার করে না; আমি এটি CMAKE_VERBOSE_MAKEFILE ব্যবহার করে চেক করেছি)।

হালনাগাদ:

অনুযায়ী এই লিঙ্কে আমি আমার স্ক্রিপ্ট পরিবর্তন চেষ্টা

     cmake -D CMAKE_CXX_COMPILER="ccache" -D CMAKE_CXX_COMPILER_ARG1="g++" -D CMAKE_C_COMPILER="ccache" -D CMAKE_C_COMPILER_ARG1="gcc" $*

কিন্তু চতুর অভিযোগটি ব্যর্থ করে যে কোনও পরীক্ষার সংকলক ccache (যা আশা করা যায়) ব্যবহার করে ব্যর্থ হয়েছিল।


4
আপনি কেবল সিসিচিকে জিসিসি সিসিচ করেন না কেন? এবং যদি আপনি এটি বিতরণ করেন তবে আমি মনে করি যে ব্যবহারকারী নিজেই যদি সিসিচ ইনস্টল করে থাকেন এবং এটি ব্যবহার করতে চান তবে ব্যবহারকারী নিজেই এই সিমলিংকটি করতেন ..
int3

4
@ int3 হ্যাঁ সম্ভবত এটি কাজ করবে (আমি জানতাম না যে ccache এর একটি alচ্ছিক যুক্তি হিসাবে সংকলক রয়েছে)। তবে এটি আরও পরিষ্কার হওয়া পরিষ্কার হবে clean
amit

উত্তর:


67

আমি ব্যক্তিগতভাবে আছে /usr/lib/ccacheআমার মধ্যে $PATH। এই ডিরেক্টরিতে প্রতিটি সম্ভাব্য নামের জন্য সংকলকটি কল করা যেতে পারে (যেমন gccএবং এর জন্য প্রচুর পরিমাণে সিমলিংক রয়েছেgcc-4.3 জন্য সংকলককে কল করা ) , সমস্ত ক্যাশে-তে নির্দেশিত।

এবং আমি সিমলিংকগুলিও তৈরি করি নি। আমি ডিবিয়ান-এ সিসি ইনস্টল করার সময় সেই ডিরেক্টরিটি পূর্বে পূর্ণ হয়।


11
নোট করুন যে আপনার প্রকৃত সংকলকটি এটির কাজ করার জন্য যেখানে রয়েছে তার আগে এই ccache পাথটি রাখতে হবে $PATH। এরকম কিছুexport PATH = /usr/lib/ccache:$PATH
গুই 13

6
@ গুই ১৩: পিএইচএইচটি হালনাগাদ করার চেয়ে সিএমকে স্পষ্ট করে বলা উচিত যে এটি জিসিসি ব্যবহার করা উচিত, যেমন cmake-DCMAKE_CXX_COMPILER = / usr / lib / ccache / bin / g ++
সিআইবি

4
পরে brew install ccache, আমি আছে /usr/local/Cellar/ccache/3.2.1/libexec/
cdunn2001

96

কমপাইল কমান্ড এবং লিঙ্ক কমান্ডের জন্য লঞ্চ হিসাবে ccache নির্দিষ্ট করা এখন সম্ভব (যেহেতু cmake 2.8.0)। এটি মেকফিল এবং নিনজা জেনারেটরের জন্য কাজ করে। এটি করতে, কেবল নিম্নলিখিত বৈশিষ্ট্যগুলি সেট করুন:

find_program(CCACHE_FOUND ccache)
if(CCACHE_FOUND)
    set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
    set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache) # Less useful to do it for linking, see edit2
endif(CCACHE_FOUND)

কেবলমাত্র নির্দিষ্ট ডিরেক্টরি বা লক্ষ্যমাত্রার জন্য এই বৈশিষ্ট্যগুলি সেট করা সম্ভব।

নিনজার ক্ষেত্রে, সংস্করণ 3.4 থেকে এটি সম্ভব। এক্সকোডের জন্য, ক্রেগ স্কট তার উত্তরে একটি বিস্ময়কর কাজ দেয়।

সম্পাদনা: উত্সাহ এবং লেকেনস্টেইনের মন্তব্যে ধন্যবাদ, আমি উত্তরটি সম্পাদনা করেছিলাম যে লঞ্চ হিসাবে ব্যবহার করার আগে সিসি ক্যাচ পাওয়া যায় কিনা এবং কোন জেনারেটরের জন্য একটি সংকলক প্রবর্তক ব্যবহার সম্ভব?

সম্পাদনা 2: @ এমিলিও কোবোস লিঙ্কিং অংশের জন্য এটি করা এড়াতে পরামর্শ দিয়েছিল যেহেতু সিসিচে সংযোগের গতি উন্নতি করে না এবং স্ক্যাসের মতো অন্যান্য ধরণের ক্যাশে গণ্ডগোল করতে পারে


অনেকগুলি সাইট স্পষ্টভাবে ডাবলকোটগুলি ব্যবহারের মতো পরামর্শ দেয় find_program(CCACHE_FOUND "ccache"), কোনটি বেশি বহনযোগ্য তা আমি জানি না, ডাবলকোটগুলির প্রয়োজন ছাড়াই আমার মাইলেজটি পুরোপুরি ঠিক করেছে।
1737973

4
এটি লক্ষণীয় যে এটি বর্তমানে কেবল মেকফাইল জেনারেটরের জন্য কাজ করে (সিএমকে ৩.৩.২ হিসাবে)। এর ম্যানুয়াল পৃষ্ঠাটি দেখুন cmake-properties
Lekensteyn

4
এটি লক্ষণীয় যে CTEST_USE_LAUNCHERS সেটিংসের সাথে এই বিরোধগুলি। এই বৈশিষ্ট্যগুলি এখানেও সেট করা আছে: github.com/Kitware/CMake/blob/master/Modules/…
বেগুনি ক্যারোট

আমি মনে করি আপনি এই কোডটিতে কোড পরিবর্তন করতে চাইতে পারেন (বাইরে থেকে ভিতরে পাঠ্য সরিয়ে ফেলুনendif() ) । উন্নতিগুলি হ'ল: ১. এটি অক্ষম করার জন্য একটি কনফিগারেশন বিকল্প রয়েছে এবং ২. দেখা যাচ্ছে, এইভাবে ব্যবহার করার সময় মেক ব্যাকএন্ডে রঙগুলি জিসিসি / কলং থেকে অদৃশ্য হয়ে যায়। ninjaব্যাকএন্ড যোগ করে এটি প্রায় কাজ করে -fdiagnostics-color, বিকল্প, তাই এটি জন্য তাই করা সমীচীন হবে makeখুব ব্যাকএন্ড।
হাই-এঞ্জেল

94

CMAKE 3.4 হিসাবে আপনি করতে পারেন:

-DCMAKE_CXX_COMPILER_LAUNCHER=ccache

4
এবং -DCMAKE_CXX_COMPILER_LAUNCHER=ccache। এই সুন্দর কাজ! আমি জানি না কেন চতুরclang থেকে অনুসন্ধান করার জন্য চতুর জোড় করে /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc(তাই সিমলিংক কৌশলটি কাজ করে না) $PATHতবে আপনার উত্তর যাইহোক কার্যকর হয়।
cdunn2001

4
এটি সেরা উত্তর হওয়া উচিত। পাথ ভেরিয়েবল এবং সংকলক সংলঙ্কগুলির সাথে আর কোনও গোলযোগ নেই!
ইলিয়া খ।

4
আমি এটি চেষ্টা করেছি, তবে এটি আমাকে কেবল "ccache: ত্রুটি: ত্রুটিটি দেয়: পুনরাবৃত্তির অনুরোধ (সিসিচে বাইনারিটির নাম অবশ্যই" ccache "হওয়া উচিত)"। ক্রিয়াপদটির সন্ধানে এটি "/ usr / স্থানীয় / বিন / ccache ccache / usr / bin / c ++" চালানোর চেষ্টা করছে ...
ক্রিস ডড

4
এটি কীভাবে RULE_LAUNCH_COMPILE এর সাথে যোগাযোগ করে?
Trass3r

10

সিএমকে ৩.১ থেকে, এক্সকোড জেনারেটরের সাথে ccache ব্যবহার করা সম্ভব এবং সিএমকে ৩.৪ এর পরে নিনজা সমর্থনযোগ্য। নিনজা RULE_LAUNCH_COMPILEঠিক ইউনিক্স মেকফিলস জেনারেটরের মতো সম্মান করবে (তাই @ বাবকুলের উত্তর আপনাকে নিনজার জন্য পেয়েছে), তবে এক্সকোড জেনারেটরের জন্য কাজ করা সিসিচি পেতে আরও কিছুটা কাজ লাগে। নিম্নলিখিত নিবন্ধটি পদ্ধতিটি বিস্তারিতভাবে ব্যাখ্যা করেছে, একটি সাধারণ প্রয়োগ যা তিনটি সিএমকে জেনারেটরের জন্য কাজ করে এবং সিসিচি সিমলিংক স্থাপন বা অন্তর্নিহিত সংকলক ব্যবহৃত সম্পর্কে কোনও অনুমান না করে (এটি এখনও সিএমকে সংকলক স্থির করতে দেয়):

https://crascit.com/2016/04/09/using-ccache-with-cmake/

নিবন্ধটির সাধারণ বক্তব্য নিম্নরূপ। আপনার CMakeLists.txtফাইলের শুরুতে এমন কিছু সেট আপ করা উচিত:

cmake_minimum_required(VERSION 2.8)

find_program(CCACHE_PROGRAM ccache)
if(CCACHE_PROGRAM)
    # Support Unix Makefiles and Ninja
    set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}")
endif()

project(SomeProject)

get_property(RULE_LAUNCH_COMPILE GLOBAL PROPERTY RULE_LAUNCH_COMPILE)
if(RULE_LAUNCH_COMPILE AND CMAKE_GENERATOR STREQUAL "Xcode")
    # Set up wrapper scripts
    configure_file(launch-c.in   launch-c)
    configure_file(launch-cxx.in launch-cxx)
    execute_process(COMMAND chmod a+rx
                            "${CMAKE_BINARY_DIR}/launch-c"
                            "${CMAKE_BINARY_DIR}/launch-cxx")

    # Set Xcode project attributes to route compilation through our scripts
    set(CMAKE_XCODE_ATTRIBUTE_CC         "${CMAKE_BINARY_DIR}/launch-c")
    set(CMAKE_XCODE_ATTRIBUTE_CXX        "${CMAKE_BINARY_DIR}/launch-cxx")
    set(CMAKE_XCODE_ATTRIBUTE_LD         "${CMAKE_BINARY_DIR}/launch-c")
    set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS "${CMAKE_BINARY_DIR}/launch-cxx")
endif()

দুটি স্ক্রিপ্ট টেম্পলেট ফাইল launch-c.inএবং launch-cxx.inদেখতে দেখতে (এগুলি CMakeLists.txtফাইলের মতো একই ডিরেক্টরিতে হওয়া উচিত ):

প্রবর্তন- c.in:

#!/bin/sh
export CCACHE_CPP2=true
exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_C_COMPILER}" "$@"

প্রবর্তন- cxx.in:

#!/bin/sh
export CCACHE_CPP2=true
exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_CXX_COMPILER}" "$@"

উপরে ব্যবহারসমূহ RULE_LAUNCH_COMPILEইউনিক্স ফাইল তৈরী এবং নিনজা জন্য কিন্তু Xcode একা জেনারেটরের এটা CMake এর কাছ থেকে সাহায্য উপর নির্ভর CMAKE_XCODE_ATTRIBUTE_...ভেরিয়েবল সমর্থন। সেটিং CCএবং CXXব্যবহারকারী-সংজ্ঞায়িত Xcode কম্পাইলার নির্দেশ ও নিয়ন্ত্রণ বৈশিষ্ট্যাবলী LDএবং LDPLUSPLUSlinker কমান্ডের জন্য, যতটা আমি বলতে পারেন, Xcode প্রকল্পের নথিভুক্ত বৈশিষ্ট্য, কিন্তু এটা কাজ বলে মনে হচ্ছে না করা হয় না। যদি কেউ নিশ্চিত করতে পারেন যে এটি আনুষ্ঠানিকভাবে অ্যাপল দ্বারা সমর্থিত, আমি লিঙ্কিত নিবন্ধ এবং তদনুসারে এই উত্তরটি আপডেট করব।


আমারও set(CMAKE_XCODE_ATTRIBUTE_LD "${CMAKE_C_COMPILER}") set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS "${CMAKE_CXX_COMPILER}")উল্লেখ করা নিবন্ধটি থেকে দরকার ছিল ।
জর্ন রিমার্ডেস

অনুস্মারকটির জন্য ধন্যবাদ, আমি LD এবং LDPLUSPLUS সেট করার জন্য উত্তর আপডেট করেছি।
ক্রেগ স্কট

ccache ভিএস সংকলকগুলিকে সমর্থন করে না, সুতরাং আপনি এটির জন্য এটি ব্যবহার করতে পারবেন না। ক্লকচে নামে একটি প্রকল্প রয়েছে যার লক্ষ্য ভিএসের জন্য একই কার্যকারিতা সরবরাহ করা, তবে এটি কতটা কার্যকর তা নিয়ে আমি মন্তব্য করতে পারি না।
ক্রেগ স্কট

9

আমি থেকে একটি সিমবলিক লিঙ্ক সেট করতে ভালো লাগে নি g++করার ccache। এবংCXX="ccache g++" আমার জন্য কাজ করেনি কারণ কিছু চতুর পরীক্ষার কেসটি বৈশিষ্ট্য ছাড়াই কেবল সংকলক প্রোগ্রাম করতে চায়।

সুতরাং আমি পরিবর্তে একটি ছোট বাশ স্ক্রিপ্ট ব্যবহার করেছি:

#!/bin/bash
ccache g++ "$@"

এবং এটিকে এক্সিকিউটেবল হিসাবে সংরক্ষণ করে /usr/bin/ccache-g++

তারপরে সি /usr/bin/ccache-g++++ কম্পাইলার হিসাবে ব্যবহারের জন্য সিএমকে কনফিগার করেছে । এইভাবে এটি ক্যামেক পরীক্ষার কেসগুলিতে উত্তীর্ণ হয় এবং আমি 2 বা 3 সপ্তাহের মধ্যে ভুলে যেতে যেতে পারে এমন সিমলিংকগুলির চেয়ে বেশি স্বাচ্ছন্দ্য বোধ করি এবং তখন হয়তো ভাবতে পারি যে যদি কিছু কাজ না করে ...


5

আমার মতে সবচেয়ে ভাল উপায় হ'ল জিসিসি, জি ++ কে সিসিচ করা, তবে আপনি যদি সিএমকে-তে ব্যবহার করতে চান তবে এটি চেষ্টা করুন:

export CC="ccache gcc" CXX="ccache g++" cmake ...

5

আমি নিম্নলিখিত কাজগুলি যাচাই করেছি (উত্স: এই লিঙ্ক ):

        CC="gcc" CXX="g++" cmake -D CMAKE_CXX_COMPILER="ccache" -D CMAKE_CXX_COMPILER_ARG1="g++" -D CMAKE_C_COMPILER="ccache" -D CMAKE_C_COMPILER_ARG1="gcc" $*

আপডেট : আমি পরে বুঝতে পারি যে এটি এমনকি কাজ করে না। আশ্চর্যজনকভাবে এটি প্রতি বিকল্প সময়ে কাজ করে (অন্য সময় চটজলদি অভিযোগ করে)।


4

আমাকে একটি গুরুত্বপূর্ণ আইটেম যুক্ত করতে দিন যা এখানে আগে উল্লেখ করা হয়নি।

উবুনুতু: 18.04 ডকার ইমেজ থেকে একটি সংক্ষিপ্ত বিল্ড সিস্টেম বুটস্ট্র্যাপ করার সময়, আমি পেয়েছি যে ইনস্টলেশন ক্রমটি একটি পার্থক্য করে।

আমার ক্ষেত্রে সিসি কল করার সময় ঠিকঠাক কাজ করেছিল gcc, তবে অন্য নামগুলির দ্বারা একই সংকলকটির অনুরোধ করতে ব্যর্থ হয়েছিল: ccএবং c++। পুরোপুরি সিসিটি ইনস্টল করতে, আপনাকে অবশ্যই সমস্ত সংকলক প্রথমে ইনস্টল করা আছে তা নিশ্চিত করতে হবে, বা নিরাপদ থাকতে আপডেট-সিসিচ সিমলিংকগুলিতে একটি কল যুক্ত করতে হবে।

sudo apt-get install ccache build-essential # and everyhting ... sudo /usr/sbin/update-ccache-symlinks export PATH="/usr/lib/ccache/:$PATH"

... এবং তারপরে (আপডেট হওয়া সিমলিংকের কারণে) সিসি এবং সি ++ তেও কল হয়!


ধন্যবাদ আমি সম্পর্কে জানতাম না update-ccache-symlinks, আমি c++একটি প্রকল্পের জন্য একটি স্ক্রিপ্টের সাথে লিঙ্ক তৈরি করছিলাম এবং এটি কাজ করছে তবে অন্য প্রকল্পের জন্য নয় (এখনও কেন জানি না, লিঙ্কটি ভাল ছিল), update-ccache-symlinksসমাধান হয়েছে।
অ্যালেক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.