حل مفتوح بالكامل وقوي لتعديل وتوليد رمز المصدر C ++. تقليل كمية رمز Boilerplate في مشاريع C ++ الخاصة بك.
سيتم ترحيل هذا الريبو إلى https://github.com/blockspacer/flextool في أقرب وقت ممكن
سيتم إهمال CXXCTP. تفضل Flextool
CXXCTP هو جهاز نقل يمتد C ++ للتأمل الجديد والانعكاس وتنفيذ وقت الترجمة.
لا يهدف CXXCTP إلى إنشاء مجموعة محددة مسبقًا من تحويلات شفرة المصدر. يمكن للمستخدمين مشاركة البرامج النصية C ++ لتحويل رمز المصدر.
افترض أن شخصًا ما مشتركًا برامج نصية مفيدة مثل interface.cxx و enum_to_json.cxx إلى مجتمع المصدر المفتوح. يمكنك استخدامها في مشروعك فقط عن طريق وضعها في مجلد ctp_scripts .
metaprogramming هو "فن" في كتابة البرامج لعلاج البرامج الأخرى كبياناتهم. هذا يعني أن البرنامج يمكنه إنشاء الكود وقراءته وتحليله وتحويله أو حتى نفسه لتحقيق حل معين.
ملاحظة: يتم توفير هذا المشروع كما هو ، دون أي ضمان (انظر الترخيص).
لماذا لا يمكنك تمديد Clang لأنه يوفر أيضًا بعض الميزات التجريبية (الوحدات النمطية على سبيل المثال)؟
Clang هو برنامج التحويل البرمجي بينما هذا المشروع عبارة عن جهاز نقل عنق ، يحول الكود إلى رمز C ++ الموحد دون الحاجة إلى تعديل LLVM/التجميع.
نظرًا لأن إخراج الأداة هو رمز C ++ ، يمكنك تجميع التعليمات البرمجية المنقولة باستخدام emscripten ، واستخدام تحليلات التعليمات البرمجية الثابتة ، وتشغيل الرمز داخل cling إلخ.
CXXCTP يتيح لك إنشاء ومشاركة البرامج النصية ل
في التنمية ، انظر الأمثلة. يدعم حاليا Linux فقط.
لاحظ أنه يمكنك تشغيل حاويات Linux تحت Windows/Mac/etc.
// usage example from ReflShapeKind.hpp
enum class
$apply(
reflect_enum
)
ReflShapeKind0 : uint32_t {
Box = 3 ,
Sphere = 6 ,
}; // Usage example. NOTE: no inheritance & definition outside lib.
// in lib .h
struct drawable {
virtual void draw ( const char * arg1) const noexcept = 0;
};
struct printable {
virtual void print ( const char * arg1, const char * arg2) const noexcept = 0;
};
struct canvas3D {
std::string name3D;
};
struct canvas4D {
std::string name4D;
};
// in app .cpp
void draw<drawable>( const canvas3D& data, const char * arg1){
std::cout << " drawing to canvas3D name = " << data. name3D << std::endl;
}
void draw<drawable>( const canvas4D& data, const char * arg1){
std::cout << " drawing to canvas4D name = " << data. name4D << std::endl;
}
void print<printable>( const canvas3D& data, const char * arg1, const char * arg2){
std::cout << " printing to canvas3D name = " << data. name3D << std::endl;
}
void print<printable>( const canvas4D& data, const char * arg1, const char * arg2){
std::cout << " printing to canvas4D name = " << data. name4D << std::endl;
}
std::vector< _tc_combined_t <drawable>> vec {
canvas3D{},
canvas4D{},
};
_tc_combined_t <drawable, printable> CVS = canvas4D{};
CVS.draw( " " );
CVS.print( " " , " " );
canvas3D cvs3D;
CVS = std::move(cvs3D);
canvas4D cvs4D;
CVS = cvs4D; // copy
CVS = vec.at( 0 ); // <drawable> to <drawable, printable>$ export (
static int resultSomeInt = 2345 ;
)
$eval( " #include <optional> " )
$exec(
printf ( " execkjljlk n " );
printf ( " execasdasd n " );
)
$set_embed( " set_embed103 " ,
printf ( " set_embed101 n " );
printf ( " set_embed102 n " );
)
$embed(
[&clangMatchResult, &clangRewriter, &clangDecl]() {
printf ( " embed01 n " );
printf ( " embed02 n " );
return new llvm::Optional<std::string>{ " embed03 " };
}();
) class
$apply(make_interface;make_removefuncbody;make_reflect)
SomeInterfaceName {
virtual ~SomeInterfaceName () = 0 ;
/* int f ( ) { // {}
int i = 6;
{
// {
// }
}
return i;
}; */
int foo ();
virtual void foobar ( int & arg1) = 0 ;
virtual inline void zoobar ( int & arg2);
// int m_bar;
// int m_bar2 = 2;
};git submodule sync --recursive
git fetch --recurse-submodules
git submodule update --init --recursive --depth 100 --progress
# or
git submodule update --force --recursive --init --remoteتثبيت وتكوين Docker: https://medium.com/@saniaky/configure-docker-to-use-a-host-proxy-e88bd988c0aa
رمز استنساخ (على النحو الوارد أعلاه) وقرص cd في dired dir.
ملاحظة: قد ترغب في إنشاء صورة Docker مع- --build-arg NO_SSL="False" . قراءة التعليقات في Dockerfile.
# Give docker the rights to access X-server
sudo -E xhost +local:docker
# build Dockerfile
sudo -E docker build --no-cache
--build-arg GIT_WITH_OPENSSL= " "
--build-arg NO_SSL= " False "
-t cpp-docker-cxxctp .
# Now let’s check if our image has been created.
sudo -E docker images
# Run in container without leaving host terminal
sudo -E docker run -v " $PWD " :/home/u/cxxctp -w /home/u/cxxctp cpp-docker-cxxctp CXXCTP_tool -version --version
# Run a terminal in container
sudo -E docker run --rm -v " $PWD " :/home/u/cxxctp -w /home/u/cxxctp -it -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix cpp-docker-cxxctp
# type in container terminal
CXXCTP_tool -version --version # Run a terminal in container
sudo -E docker run --rm -v " $PWD " :/home/u/cxxctp -w /home/u/cxxctp -it -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix cpp-docker-cxxctp
# An example of how to build (with Makefile generated from cmake) inside the container
# Mounts $PWD to /home/u/cxxctp and runs command
mkdir build
sudo -E docker run --rm -v " $PWD " :/home/u/cxxctp -w /home/u/cxxctp/build cpp-docker-cxxctp cmake -DCONAN_AUTO_INSTALL=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_EXPORT_COMPILE_COMMANDS=TRUE ..
# Run resulting app in host OS:
# ./build/<app> pip install --index-url=https://pypi.python.org/simple/ --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org wheel
&&
pip install --index-url=https://pypi.python.org/simple/ --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org virtualenv
&&
pip install --index-url=https://pypi.python.org/simple/ --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org conan
&&
pip install --index-url=https://pypi.python.org/simple/ --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org conan_package_tools
conan profile new default --detect
# conan profile update settings.compiler.libcxx=libstdc++11 default
conan remote list
conan search * boost * -r all تكوين الوكلاء و cacert_path في ~/.conan/conan.conf ، راجع https://docs.conan.io/en/latest/reference/config_files/conan.conf.html#proxies
قم بتكوين ملف تعريف Conan Clang لاستخدامه -Profile Clang:
/usr/bin/clang-6.0 -v
/usr/bin/clang++-6.0 -v
nano ~ /.conan/profiles/clang
[settings]
# We are building in Ubuntu Linux
os_build=Linux
os=Linux
arch_build=x86_64
arch=x86_64
compiler=clang
compiler.version=6.0
compiler.libcxx=libstdc++11
[env]
CC=/usr/bin/clang-6.0
CXX=/usr/bin/clang++-6.0 ثم conan install ***** --profile clang
/usr/bin/gcc -v
/usr/bin/g++ -v
nano ~ /.conan/profiles/gcc
[settings]
# We are building in Ubuntu Linux
os_build=Linux
os=Linux
arch_build=x86_64
arch=x86_64
compiler=gcc
compiler.version=7
compiler.libcxx=libstdc++11
[env]
CC=/usr/bin/gcc
CXX=/usr/bin/g++إذا كنت ترغب في تعطيل SSL (تحت الوكيل ، إلخ):
# see https://docs.conan.io/en/latest/reference/commands/misc/remote.html#conan-remote
conan remote update conan-center https://conan.bintray.com False
conan search boost * -r=conan-center
conan remote add bincrafters https://api.bintray.com/conan/bincrafters/public-conan
conan remote update bincrafters https://api.bintray.com/conan/bincrafters/public-conan False
conan search boost * -r=bincraftersإذا كنت تريد تعيين كورب. Cacert:
CONAN_CACERT_PATH=/path/to/ca-bundle.crt
file $CONAN_CACERT_PATHروابط مفيدة:
لتكون قادرًا على إضافة قائمة أجهزة التحكم عن بعد التبعية ، يرجى كتابة الأمر التالي:
cmake -E time conan config install conan/remotes/
# OR:
# cmake -E time conan config install conan/remotes_disabled_ssl/ # NOTE: don't forget to re-run `conan install` after command below
# NOTE: change `build_type=Debug` to `build_type=Release` in production
cmake -DEXTRA_CONAN_OPTS= " --profile;clang;-s;build_type=Debug;--build;missing " -P tools/buildConanThirdparty.cmakeconan remote add Manu343726 https://api.bintray.com/conan/manu343726/conan-packages False
git clone http://github.com/foonathan/type_safe.git -b v0.2.1
cd type_safe
# NOTE: change `build_type=Debug` to `build_type=Release` in production
CONAN_REVISIONS_ENABLED=1
CONAN_VERBOSE_TRACEBACK=1
CONAN_PRINT_RUN_COMMANDS=1
CONAN_LOGGING_LEVEL=10
GIT_SSL_NO_VERIFY=true
conan create . conan/stable -s build_type=Debug --profile clang --build missing # NOTE: change `build_type=Debug` to `build_type=Release` in production
git clone http://github.com/mosra/corrade.git && cd corrade
CONAN_REVISIONS_ENABLED=1
CONAN_VERBOSE_TRACEBACK=1
CONAN_PRINT_RUN_COMMANDS=1
CONAN_LOGGING_LEVEL=10
GIT_SSL_NO_VERIFY=true
conan create . magnum/stable -s build_type=Debug --profile clang --build missing -tf package/conan/test_packagesudo apt-get install openmpi-bin openmpi-common libopenmpi-devsudo -E apt-get purge -y cmake
bash scripts/install_cmake.shتثبيت CXTPL Library https://github.com/blockspacer/cxtpl
تثبيت cxtpl_tool https://github.com/blockspacer/cxtpl#how-to-build
BEFORE install_cling.sh:
sudo apt-get update && sudo apt-get upgrade
sudo apt-get install clang-6.0 libstdc++6 libstdc++-6-dev
sudo update-alternatives --config c++
sudo update-alternatives --config cc
sudo ldconfig
export CC=clang-6.0
export CXX=clang++-6.0 # Build Cling into `cling-build` folder
cd scripts
bash install_cling.shتثبيت DEPS كما في cxtpl https://github.com/blockspacer/cxtpl#how-to-build
export CC=clang-6.0
export CXX=clang++-6.0
cmake -E remove_directory build
cmake -E make_directory build
cmake -E remove_directory resources/cxtpl/generated
cmake -E make_directory resources/cxtpl/generated
# NOTE: change `build_type=Debug` to `build_type=Release` in production
CONAN_REVISIONS_ENABLED=1
CONAN_VERBOSE_TRACEBACK=1
CONAN_PRINT_RUN_COMMANDS=1
CONAN_LOGGING_LEVEL=10
GIT_SSL_NO_VERIFY=true
cmake -E chdir build
cmake -E time
conan install
-s build_type=Debug
--build=missing
--profile clang
-o enable_tests=False
-o openssl:shared=True
..
cmake -E chdir build cmake -E time cmake -DCONAN_AUTO_INSTALL=OFF -DENABLE_CLING=TRUE -DBUILD_SHARED_LIBS=FALSE -DBUILD_EXAMPLES=FALSE -DALLOW_PER_PROJECT_CTP_SCRIPTS=TRUE -DBUNDLE_EXAMPLE_SCRIPTS=FALSE -DCMAKE_BUILD_TYPE=Debug -DENABLE_CXXCTP=TRUE ..
cmake -E chdir build cmake -E time cmake --build . -- -j6
# you can install CXXCTP_tool:
sudo cmake -E chdir build make install
# NOTE: You can also use the “-p” flag with CMAKE_EXPORT_COMPILE_COMMANDS. See https://variousburglarious.com/2018/02/18/include-paths-for-clang-tools/
# cmake -E chdir build ./tool/CXXCTP_tool -p=../example_compile_commands/
# NOTE: runs CXXCTP_tool on multiple files and adds include paths by `-extra-arg=-I`
cmake -E chdir build ./tool/CXXCTP_tool -L .=DBG9 -extra-arg=-I $PWD /include -extra-arg=-I../resources ../examples/built_in/for_codegen/example_make_reflect.cpp
# check generator output
file build/example_make_reflect.cpp.generated.cppأو تحت GDB:
rm -rf * generated * ; clear && clear ; gdb ./CXXCTP -ex " run " -ex " bt " -ex " q " استخدم CXXCTP_CORE المشترك كمكتبة مشتركة -DBUILD_SHARED_LIBS=TRUE .
قم بتشغيل البرامج النصية bash/install_folly.sh من https://github.com/blockspacer/cxtpl أو تصحيح Folly يدويًا لدعم clang (استبدل folly_use_jemalloc مع folly_assume_no_jemalloc) facebook/folly#976
استخدم clang (وليس GCC!) قبل الإنشاء و -DENABLE_CLING=TRUE :
export CC=clang-6.0
export CXX=clang++-6.0
sudo rm -rf examples/ * /ctp_scripts/ * / * /generated/
cmake -E remove_directory build
cmake -E make_directory build
cmake -E remove_directory resources/cxtpl/generated
cmake -E make_directory resources/cxtpl/generated
# NOTE: clang profile!
# NOTE: change `build_type=Debug` to `build_type=Release` in production
CONAN_REVISIONS_ENABLED=1
CONAN_VERBOSE_TRACEBACK=1
CONAN_PRINT_RUN_COMMANDS=1
CONAN_LOGGING_LEVEL=10
GIT_SSL_NO_VERIFY=true
cmake -E chdir build
cmake -E time
conan install
-s build_type=Debug
--build=missing
--profile clang
-o enable_tests=False
-o openssl:shared=True
..
cmake -E chdir build cmake -E time cmake -DCONAN_AUTO_INSTALL=OFF -DENABLE_CLING=TRUE -DBUILD_SHARED_LIBS=TRUE -DALLOW_PER_PROJECT_CTP_SCRIPTS=TRUE -DBUILD_EXAMPLES=FALSE -DBUNDLE_EXAMPLE_SCRIPTS=FALSE -DCLEAN_CXXCTP_GEN=TRUE -DCMAKE_BUILD_TYPE=Debug -DENABLE_CXXCTP=TRUE ..
# OR cmake -E chdir build cmake -E time cmake -DCONAN_AUTO_INSTALL=OFF -DENABLE_CLING=TRUE -DBUILD_SHARED_LIBS=TRUE -DALLOW_PER_PROJECT_CTP_SCRIPTS=FALSE -DBUILD_EXAMPLES=FALSE -DBUNDLE_EXAMPLE_SCRIPTS=TRUE -DCLEAN_CXXCTP_GEN=TRUE -DCMAKE_BUILD_TYPE=Debug -DENABLE_CXXCTP=TRUE ..
cmake -E chdir build cmake -E time cmake --build . -- -j6
# you can install CXXCTP_tool:
sudo cmake -E chdir build make install
# check supported plugins
/usr/local/bin/CXXCTP_tool --pluginsإذا قمت بتثبيت CXXCTP_TOOL - يمكنك تشغيل أمثلة:
# requires CXXCTP_tool
sudo cmake -E chdir build make install
# use -DBUILD_EXAMPLES=TRUE
rm ./build/examples/simple/CXXCTP_tool_for_CXXCTP_example.log
cmake -E chdir build cmake -E time cmake -DCONAN_AUTO_INSTALL=OFF -DENABLE_CLING=TRUE -DBUILD_SHARED_LIBS=TRUE -DBUILD_EXAMPLES=TRUE -DBUNDLE_EXAMPLE_SCRIPTS=FALSE -DALLOW_PER_PROJECT_CTP_SCRIPTS=TRUE -DCMAKE_BUILD_TYPE=Debug -DENABLE_CXXCTP=TRUE ..
cmake -E chdir build cmake -E time cmake --build . -- -j6
cat ./build/examples/simple/CXXCTP_tool_for_CXXCTP_example.log
Check that ` .log ` find doesn ` t contain errors
# run examples
build/bin/CXXCTP_example لا تنسى أن تضع تشبث تشمل المسارات بواسطة -extra-arg=-I$PWD/include ومسارات المكتبة بواسطة -extra-arg=-L$PWD/build و .so/.dll libs بواسطة -extra-arg=-lCXXCTP_core :
# NOTE: runs CXXCTP_tool on multiple files and adds include paths by `-extra-arg=-I`
cmake -E chdir build ./tool/CXXCTP_tool --ctp_scripts_paths= $PWD -L .=DBG9 -extra-arg=-I $PWD /include -extra-arg=-L $PWD /build -extra-arg=-lCXXCTP_core -extra-arg=-I../resources ../resources/ReflShapeKind.hpp ../resources/test_typeclass_base1.hpp ../resources/test_typeclass_instance1.hpp ../resources/test.cpp استخدم -extra-arg خيار CXXCTP_tool :
-extra-arg=-I $PWD /include -extra-arg=-I $PWD /include/foo -extra-arg=-DMY_DEFINITION=1 -extra-arg=-DONE_MORE_DEFINITION=1مثال:
cmake -E chdir build ./tool/CXXCTP_tool --ctp_scripts_paths= $PWD -L .=DBG9 -extra-arg=-I $PWD /include -extra-arg=-I../resources ../resources/ReflShapeKind.hpp ../resources/test_typeclass_base1.hpp ../resources/test_typeclass_instance1.hpp ../resources/test.cppتغطي الأقسام التالية الاستخدام والقواعد المخصصة والتصحيح ل CXXCTP.
يمكنك كتابة البرامج النصية C ++ المخصصة لتحويل رمز المصدر أو استخدام تلك الموجودة.
يقوم CXXCTP بتحميل جميع البرامج النصية C ++ من مجلد CTP_Scripts بالترتيب المعجم.
مثال محتويات CTP_Scripts:
يجب تحميل utils قبل البرامج النصية (المتشبث ذات الصلة) ، لذلك أضفنا 1_ ، 2_ ، ... قبل أسماء المجلدات (انظر أعلاه).
يمكنك استخدام #include ، واستخدام نظام الملفات ، والوصول إلى الإنترنت ، وما إلى ذلك في البرامج النصية C ++.
دليل
تثبيت باستخدام -DENABLE_CLING=TRUE -DINSTALL_CLING=TRUE وتعيين LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/local/lib/: $LD_LIBRARY_PATH
sudo ldconfigيمكنك استخدام التعليقات التوضيحية C ++ لإخبار CXXCTP عن الإجراءات التي يجب تنفيذها.
لنفترض أننا نريد أن نتحول إلى الطبقة إلى واجهة:
// Source
class SomeInterfaceName {
int foo1 () {
// ...
};
int foo ();
virtual void foobar ( int & arg1) = 0;
virtual void zoobar ( int & arg2);
virtual ~SomeInterfaceName () = 0 ;
};
// <== will be changed into ==>
// Result
class SomeInterfaceName {
virtual int foo1 () = 0;
virtual int foo () = 0;
virtual void foobar ( int & arg1) = 0;
virtual void zoobar ( int & arg2) = 0;
virtual ~SomeInterfaceName () = 0 ;
}; يمكننا استخدام إجراءات funccall لتشغيل البرامج النصية C ++ لتحويل رمز المصدر. لنفترض أن أسماء البرامج النصية هي make_interface و make_removefuncbody (الاسم كما تريد).
__attribute__ ((annotate( " {gen};{funccall};make_interface;make_removefuncbody " ))) {gen}; - الكلمة الرئيسية المستخدمة في كل شرح CXXCTP.
{funccall}; - الكلمة الرئيسية المستخدمة لإخبار CXXCTP بما يجب عليه تنفيذه البرامج النصية C ++ مع التشبث.
make_interface;make_removefuncbody - نصتان ستنفذ CXXCTP.
سيتم تنفيذ البرامج النصية من اليسار ( make_interface ) إلى اليمين ( make_removefuncbody ).
عادةً ما لا تحتاج إلى كتابة تعليقات طويلة C ++ ، فقط استخدم C ++ #define (أو تضمين رأس مدمج مع تعريفات شائعة):
# define $apply(...)
__attribute__ ((annotate( " {gen};{funccall}; " #__VA_ARGS__)))
class
$apply(make_interface;
make_removefuncbody)
SomeInterfaceName {
virtual ~SomeInterfaceName () = 0 ;
int foo ();
virtual void foobar ( int & arg1) = 0 ;
virtual void zoobar ( int & arg2);
}; باستخدام نهج مماثل ، يمكنك تطبيق خطوات تحويل رمز المصدر المتعددة على نفس class / struct / إلخ.
قم بإنشاء ملفات مع وظيفتك في ctp_scripts
نسخ custom_plugins.cmake.example باسم custom_plugins.cmake
قم بإلحاق مسارات البرنامج النصي الخاصة بك إلى custom_plugins.cmake عبر add_ctp_plugin :
# first arg - typeclass_instance - script function name
# second arg - script source file
# third arg - script header file
# last arg - path to CMakeLists.txt used to generate script-related files
add_ctp_plugin(
" typeclass_instance "
${CMAKE_CURRENT_SOURCE_DIR} /examples/simple/ctp_scripts/2_scripts/typeclass_instance/typeclass_instance.cpp
${CMAKE_CURRENT_SOURCE_DIR} /examples/simple/ctp_scripts/2_scripts/typeclass_instance/typeclass_instance.hpp
${CMAKE_CURRENT_SOURCE_DIR} /examples/simple/ctp_scripts/2_scripts/typeclass_instance
) تأكد من وجود اسم وظيفتك في الملف الذي تم إنشاؤه ctp_registry.cpp (قد يتم تخطيه في التشبث / dev-mode)
يجب أن يكون توقيع الوظيفة لتحويل الكود متوافقًا مع cxxctp_callback :
typedef std::function< const char *(
const cxxctp::parsed_func& func_with_args,
const clang::ast_matchers::MatchFinder::MatchResult& matchResult,
clang::Rewriter& rewriter,
const clang::Decl* decl,
const std::vector<cxxctp::parsed_func>& all_funcs_with_args)> cxxctp_callback;توقيع الوظيفة التفصيلية:
all_funcs_with_args (انظر أدناه)parsed_func - interface و foo_with_args . فكر في اسم الوظيفة كواحد من __VA_ARGS__ من
# define $apply(...)
__attribute__ ((annotate( " {gen};{funccall}; " #__VA_ARGS__))) مثال حيث make_interface و make_removefuncbody - اسمين وظيفيين:
$apply(make_interface;
make_removefuncbody)إذا كنت بحاجة إلى توليد الكود:
.cxtpl ). قم بإنشاء ملفك باستخدام cxtpl_tool https://github.com/blockspacer/cxtplstd::string cxtpl_output ، والتي ستخزن نتيجة عرض القالب مع بعض الوسائط..cxtpl ) داخل وظيفتك. .cxtpl .cxtpl هو امتداد الملف لمحرك القالب C ++ https://github.com/blockspacer/cxtpl
.cxtpl في وقت الترجمة (cmake) أضف ملف .cxtpl الخاص بك إلى Codegen_files.cmake
ملاحظة: في وضع dev (مثل وضع التشبث) ، قد يكون من الجيد إنشاء ملفات من القوالب باستخدام cxtpl_tool https://github.com/blockspacer/cxtpl يمكنك إضافة قواعد توليد إلى Codegen_files.cmake لاحقًا في بناء الإصدار.
ملاحظة: لا تنس توفير كل من ملفات .cxtpl و .cxtpl.h مع قواعد codegen المشتركة (أضف إلى نظام التحكم في الإصدار).
.cxtpl في وقت التشغيل مع التشبثلديك خياران:
.cxtpl الخاص بك ، ثم قم بتضمينه في Cling C ++ البرنامج النصي. على غرار وقت الترجمة ، ولكن يمكنك إعادة توحيد الملفات أو تغييرها دون إعادة توحيد البرنامج. لاحظ أنه من الممكن إنشاء ملفات وإدراجها في البرنامج النصي الخاص بك ؛ ما عليك سوى تقسيم البرنامج النصي إلى عدة تشمل..cxtpl ، ثم قم بتشغيلها في مترجم متشبث منفصل. في معظم الحالات ، ستستخدم الخيار الأول. .cxtpl مع CXXCTPتمرير بيانات الانعكاس في محرك القالب.
قم بإنشاء ملفات من القوالب باستخدام cxtpl_tool https://github.com/blockspacer/cxtpl
في البرنامج النصي CXXCTP ( .cpp ):
// see ReflectAST.cpp
reflection::NamespacesTree m_namespaces;
// `node` from AST parser (libtooling)
reflection::ClassInfoPtr structInfo = reflector.ReflectClass(node, &m_namespaces);
// ...
stuct Arguments {
// any custom arguments here ...
std::string arg1 = " arg1... " ;
std::string arg2 = " arg2... " ;
// reflection data here (ClassInfoPtr) ...
};
// ...
std::map<std::string, std::any> cxtpl_params;
{
cxtpl_params[ " Arguments " ] =
std::make_any<Arguments>(Arguments{});
cxtpl_params[ " generator_path " ] =
std::make_any<std::string>( " enum_gen_hpp.cxtpl " );
cxtpl_params[ " generator_includes " ] =
std::make_any<std::vector<std::string>>(
std::vector<std::string>{});
std::string cxtpl_output;
# include " ../../resources/cxtpl/generated/enum_gen_hpp.cxtpl.cpp "
writeToFile (cxtpl_output, gen_hpp_name);
} في قالب .cxtpl :
const auto arguments = std::any_cast<Arguments>(cxtpl_params.at( " Arguments " ));
std::cout << arguments.arg1; راجع resources/cxtpl/enum_gen_hpp.cxtpl كمثال.
CXXCTP_TOOL يلف libtooling لإضافة خيارات سطر الأوامر المخصصة.
الخيارات المتعلقة بـ libtooling (النوع -help أو -help):
Generic Options:
-help - Display available options (-help-hidden for more)
-help-list - Display list of available options (-help-list-hidden for more)
-version - Display the version of this program
Use override options:
-extra-arg= < string > - Additional argument to append to the compiler command line
-extra-arg-before= < string > - Additional argument to prepend to the compiler command line
-p= < string > - Build pathالخيارات المتعلقة بـ CXXCTP_TOOL (النوع -help ، وليس -HELP):
ctp_scripts_paths - قائمة المسارات التي سيبحث فيها عدد المجلد الفرعي CTP_SCRIPTS
ملاحظة: ctp_scripts_paths يتطلب -DENABLE_CLING=TRUE
-L .=DBG9 هو تكوين السجل في التنسيق https://github.com/facebook/folly/blob/master/folly/logging/docs/config.md
مثال على تكوين السجل الذي يكتب على حد سواء في الملف ودفق وحدة التحكم:
./build/bin/CXXCTP_tool -L " .:=INFO:default:console; default=file:path=y.log,async=true,sync_level=DBG9;console=stream:stream=stderr " --srcdir لتغيير مسار نظام الملفات الحالي لملفات الإدخال.
--resdir لتغيير مسار نظام الملفات الحالي لملفات الإخراج.
مثال (DIR الإخراج المخصص):
# Remove old generated files
rm -rf gen
rm -rf build/ * generated *
` --version ` to get tool version
` -version ` to get clang version
# Build files to `gen/out` dir
mkdir -p gen/out
cmake -E chdir gen ../build/bin/CXXCTP_tool --resdir= $PWD /gen/out --ctp_scripts_paths= $PWD -L .=DBG9 -extra-arg=-I $PWD /include -extra-arg=-I../resources ../resources/ReflShapeKind.hpp ../resources/test_typeclass_base1.hpp ../resources/test_typeclass_instance1.hpp ../resources/test.cppctp_scriptsقم بإزالة القطع الأثرية القديمة والملفات التي تم إنشاؤها.
قم بتجميع البرامج النصية الخاصة بك باستخدام CXXCTP_tool عبر -DBUNDLE_EXAMPLE_SCRIPTS=TRUE .
تأكد من إضافة البرامج النصية (الإضافات) إلى CXXCTP_tool عبر custom_plugins.cmake.example .
تعطيل البرامج النصية لكل مشاركة -DALLOW_PER_PROJECT_CTP_SCRIPTS=FALSE .
build/tool/CXXCTP_tool --plugins
تأكد من أن الإصدار المثبت على النظام من CXXCTP_tool هو نفسه build/tool/CXXCTP_tool (حسب التاريخ/الملف)
قم بتشغيل CXXCTP_tool يدويًا تحت gdb :
gdb -ex " r " -ex " bt " --args build/tool/CXXCTP_tool ......... تحقق من أن جميع المسارات المطلوبة في -extra-arg= .
قم بعمل سجل للملف في وضع DBG9 وتحقق من ملفات .log .
يستخدم CXXCTP libtooling لتحليل وتعديل C ++.
Libtooling هي مكتبة لدعم كتابة الأدوات المستقلة على أساس Clang.
روابط مفيدة:
يستخدم CXXCTP التمسك لتنفيذ C ++ في وقت الترجمة.
يمكنك استخدام التشبث من أجل إعادة تحميل / REPLE / FAST C ++ النماذج الأولية / محرك البرمجة النصية / JIT / إلخ.
روابط مفيدة:
sudo apt install clang-format تشغيل بناءً على ملف .clang-format :
find . -regex ' .*.(cpp|hpp|cu|c|h) ' -exec clang-format -style=file -i {} ;روابط مفيدة:
.clang-formatيرجى قراءة إرشاداتنا المساهمة قبل تقديم طلب السحب الخاص بك.
يرجى ملاحظة أن هذا المشروع يتم إصداره مع مدونة قواعد السلوك. من خلال المشاركة في هذا المشروع ، فإنك توافق على الالتزام بشروطه.
هذا المشروع ممكن بسبب autoprogrammer Flexferrum.
مقالات حول autoprogrammer الخاص بـ Flexferrum في وسائل الإعلام:
يتم استخدام جميع مكونات المصدر المفتوح ضمن تراخيص المصادر المفتوحة المرتبطة بها.
مكونات مفتوحة المصدر تستخدم:
انظر ملفات الترخيص
يمكن إصلاح ملفات CMake Files ، عن طريق تشغيل تشغيل c-cmake-format.py من جذر المستودع. هذا يتطلب Python 3 و Cmake_Format (ملاحظة: هذا لا يعمل حاليًا على Windows)
استخدم تلقائيًا cmake-format.py و run-cmake-format.py
pip3 install cmake_format
python3 run-cmake-format.pyلاستخدام cmake-format على ملف cmakelists.txt محدد في تشغيل سطر الأوامر
python3 -m cmake_format -c cmake-format.py -i CMakeLists.txtهناك امتداد رسمي للاستوديو المرئي ، يمكن العثور على تفاصيله هنا.
اتبع cmake styleguide https://github.com/ruslo/0
.cxtpl