Solusi sumber yang sepenuhnya terbuka dan kuat untuk modifikasi dan pembuatan kode sumber C ++. Kurangi jumlah kode boilerplate dalam proyek C ++ Anda.
Repo ini akan dimigrasikan ke https://github.com/blockspacer/flextool sesegera mungkin
CXXCTP akan sudah usang. Lebih suka flextool
CXXCTP adalah transpiler yang memperluas C ++ untuk introspeksi baru, refleksi dan eksekusi waktu kompilasi.
CXXCTP tidak bertujuan untuk membuat serangkaian transformasi kode sumber yang telah ditentukan. Pengguna dapat berbagi skrip C ++ untuk transformasi kode sumber.
Misalkan seseorang berbagi skrip yang berguna seperti interface.cxx dan enum_to_json.cxx ke komunitas open-source. Anda dapat menggunakannya di proyek Anda hanya dengan menempatkannya di folder ctp_scripts .
Metaprogramming adalah "seni" program penulisan untuk memperlakukan program lain sebagai data mereka. Ini berarti bahwa suatu program dapat menghasilkan, membaca, menganalisis, dan mengubah kode atau bahkan dengan sendirinya untuk mencapai solusi tertentu.
Catatan: Proyek ini disediakan sebagaimana adanya, tanpa jaminan apa pun (lihat lisensi).
Mengapa Anda tidak memperpanjang dentang karena juga menyediakan beberapa fitur eksperimental (misalnya modul)?
Clang adalah kompiler sementara proyek ini adalah transpiler, yang mengubah kode menjadi kode C ++ standar tanpa perlu memodifikasi llvm/perakitan.
Karena output alat adalah kode C ++, Anda dapat mengkompilasi kode transpil menggunakan emscripten, menggunakan analisis kode statis, menjalankan kode di dalam cling dll.
Cxxctp memungkinkan Anda membuat dan berbagi skrip untuk
Dalam pengembangan, lihat contoh. Saat ini hanya mendukung Linux.
Perhatikan bahwa Anda dapat menjalankan wadah Linux di bawah Windows/Mac/dll.
// 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 --remoteInstal dan Konfigurasikan Docker: https://medium.com/@saniaky/configure-docker-to-use-a-host-proxy-e88bd988c0aa
Kode klon (seperti di atas) dan cd ke dalam Dir Kloning.
Catatan: Anda mungkin ingin membangun gambar Docker dengan --build-arg NO_SSL="False" . Baca komentar di 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 Konfigurasikan Proksi & Cacert_Path di ~/.conan/conan.conf , lihat https://docs.conan.io/en/latest/reference/config_files/conan.conf.html#proxies
Konfigurasikan profil clang conan untuk kemudian menggunakan -dentang profil:
/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 Dan kemudian 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++Jika Anda ingin menonaktifkan SSL (di bawah proxy, dll.):
# 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=bincraftersJika Anda ingin mengatur Corp. Cacert:
CONAN_CACERT_PATH=/path/to/ca-bundle.crt
file $CONAN_CACERT_PATHTautan yang berguna:
Untuk dapat menambahkan daftar remote ketergantungan, harap ketik perintah berikut:
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.shInstal CXTPL Library https://github.com/blockspacer/cxtpl
Instal 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.shInstal Deps seperti di 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.cppAtau di bawah GDB:
rm -rf * generated * ; clear && clear ; gdb ./CXXCTP -ex " run " -ex " bt " -ex " q " Gunakan bersama cxxctp_core sebagai perpustakaan bersama -DBUILD_SHARED_LIBS=TRUE .
Jalankan skrip bash/install_folly.sh dari https://github.com/blockspacer/cxtpl atau patch folly secara manual untuk dukungan dentang (ganti folly_use_jemalloc dengan folly_assume_no_jemalloc) facebook/folly#976
Gunakan Clang (bukan GCC!) Sebelum membangun dan -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 --pluginsJika Anda menginstal cxxctp_tool - Anda dapat menjalankan contoh:
# 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 Jangan lupa untuk mengatur cling termasuk jalur oleh -extra-arg=-I$PWD/include dan jalur perpustakaan oleh -extra-arg=-L$PWD/build dan .so/.dll libs oleh -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 Gunakan opsi -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=1Contoh:
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.cppBagian berikut mencakup penggunaan, aturan khusus, dan debugging untuk CXXCTP.
Anda dapat menulis skrip C ++ khusus untuk transformasi kode sumber atau menggunakan yang sudah ada.
CXXCTP memuat semua skrip C ++ dari folder CTP_Scripts dalam urutan leksikografi.
Contoh Isi CTP_Scripts:
Util harus memuat sebelum skrip (terkait dengan cling), jadi kami menambahkan 1_ , 2_ , ... sebelum nama folder (lihat di atas).
Anda dapat menggunakan #include , menggunakan sistem file, mengakses internet, dll. Dalam skrip C ++.
direktori`
Instal dengan -DENABLE_CLING=TRUE -DINSTALL_CLING=TRUE dan atur LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/local/lib/: $LD_LIBRARY_PATH
sudo ldconfigAnda dapat menggunakan anotasi C ++ untuk memberi tahu cxxctp tindakan apa yang harus dijalankannya.
Misalkan kita ingin mengubah kelas menjadi antarmuka:
// 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 ;
}; Kami dapat menggunakan tindakan funccall untuk menjalankan skrip C ++ untuk transformasi kode sumber. Mari kita anggap bahwa nama skrip adalah make_interface dan make_removefuncbody (nama seperti yang Anda inginkan).
__attribute__ ((annotate( " {gen};{funccall};make_interface;make_removefuncbody " ))) {gen}; - Kata kunci yang digunakan dalam setiap anotasi CXXCTP.
{funccall}; - Kata kunci yang digunakan untuk memberi tahu cxxctp apa yang harus dijalankan skrip C ++ dengan cling.
make_interface;make_removefuncbody - dua skrip apa yang akan dijalankan CXXCTP.
Script akan dieksekusi dari kiri ( make_interface ) ke kanan ( make_removefuncbody ).
Biasanya Anda tidak perlu menulis anotasi C ++ panjang, cukup gunakan c ++ #define (atau sertakan header bawaan dengan definisi umum):
# 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);
}; Menggunakan pendekatan yang sama Anda dapat menerapkan beberapa langkah transformasi kode sumber ke class / struct / dll yang sama
Buat file dengan fungsi Anda di ctp_scripts
Salin custom_plugins.cmake.example sebagai custom_plugins.cmake
Tambahkan jalur skrip Anda ke custom_plugins.cmake melalui 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
) Periksa apakah nama fungsi Anda ada di file yang dihasilkan ctp_registry.cpp (dapat dilewati dalam cling / dev-mode)
Tanda Tangan Fungsi untuk Transformasi Kode harus kompatibel dengan 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;Tanda Tangan Fungsi Detail:
all_funcs_with_args (lihat di bawah)parsed_func - interface dan foo_with_args . Pikirkan tentang nama fungsi sebagai salah satu dari __VA_ARGS__ dari
# define $apply(...)
__attribute__ ((annotate( " {gen};{funccall}; " #__VA_ARGS__))) Contoh di mana make_interface dan make_removefuncbody - dua nama fungsi:
$apply(make_interface;
make_removefuncbody)Jika Anda membutuhkan pembuatan kode:
.cxtpl ). Bangun file Anda menggunakan cxtpl_tool https://github.com/blockspacer/cxtplstd::string cxtpl_output , yang akan menyimpan hasil rendering template dengan beberapa argumen..cxtpl ) di dalam fungsi Anda. .cxtpl .cxtpl adalah ekstensi file untuk mesin template c ++ https://github.com/blockspacer/cxtpl
.cxtpl di compile-time (cmake) Tambahkan file .cxtpl Anda ke Codegen_files.cmake
CATATAN: Dalam mode dev (seperti mode cling) mungkin ide yang baik untuk menghasilkan file dari templat menggunakan cxtpl_tool https://github.com/blockspacer/cxtpl Anda dapat menambahkan aturan generasi ke dalam Codegen_files.cmake nanti dalam pembuatan rilis.
Catatan: Jangan lupa untuk menyediakan file .cxtpl dan .cxtpl.h dengan aturan codegen bersama (tambahkan ke sistem kontrol versi).
.cxtpl saat runtime dengan clingAnda memiliki dua opsi:
.cxtpl Anda, lalu sertakan ke dalam skrip cling c ++. Mirip dengan waktu kompilasi, tetapi Anda dapat menghasilkan kembali atau mengubah file tanpa kompilasi program. Perhatikan bahwa dimungkinkan untuk menghasilkan file dan memasukkannya ke dalam skrip Anda; Cukup pisahkan skrip menjadi beberapa termasuk..cxtpl Anda, lalu jalankannya di juru bahasa yang terpisah. Dalam kebanyakan kasus Anda akan menggunakan opsi pertama. .cxtpl dengan cxxctpMasukkan data refleksi ke mesin template.
Hasilkan file dari templat menggunakan cxtpl_tool https://github.com/blockspacer/cxtpl
Dalam skrip 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);
} Dalam template .cxtpl :
const auto arguments = std::any_cast<Arguments>(cxtpl_params.at( " Arguments " ));
std::cout << arguments.arg1; Lihat resources/cxtpl/enum_gen_hpp.cxtpl sebagai contoh.
Cxxctp_tool membungkus libtooling untuk menambahkan opsi baris perintah khusus.
Opsi yang terkait dengan libtooling (tipe -help atau --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 pathOpsi yang terkait dengan cxxctp_tool (type --help, bukan -help):
ctp_scripts_paths - daftar jalur di mana tol akan mencari subfolder ctp_scripts
Catatan: ctp_scripts_paths membutuhkan -DENABLE_CLING=TRUE
-L .=DBG9 adalah konfigurasi log dalam format https://github.com/facebook/folly/blob/master/folly/logging/docs/config.md
Contoh konfigurasi log yang menulis ke dalam arsip dan aliran konsol:
./build/bin/CXXCTP_tool -L " .:=INFO:default:console; default=file:path=y.log,async=true,sync_level=DBG9;console=stream:stream=stderr " --srcdir untuk mengubah jalur sistem file saat ini untuk file input.
--resdir untuk mengubah jalur sistem file saat ini untuk file output.
Contoh (Dir Output Kustom):
# 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_scriptsHapus artefak bangunan lama dan file yang dihasilkan.
Bundel skrip Anda dengan CXXCTP_tool via -DBUNDLE_EXAMPLE_SCRIPTS=TRUE .
Pastikan skrip Anda (plugin) ditambahkan ke CXXCTP_tool melalui custom_plugins.cmake.example .
Nonaktifkan skrip per -proyek -DALLOW_PER_PROJECT_CTP_SCRIPTS=FALSE .
Periksa apakah skrip Anda (plugin) ada di build/tool/CXXCTP_tool --plugins
Periksa bahwa versi yang dipasang sistem CXXCTP_tool sama dengan build/tool/CXXCTP_tool (berdasarkan tanggal/hash file)
Jalankan CXXCTP_tool secara manual di bawah gdb :
gdb -ex " r " -ex " bt " --args build/tool/CXXCTP_tool ......... Periksa apakah semua jalur yang dibutuhkan ada di -extra-arg= .
Buat log ke file dalam mode DBG9 dan periksa file .log .
CXXCTP menggunakan libtooling untuk menguraikan dan memodifikasi C ++.
Libtooling adalah perpustakaan untuk mendukung penulisan alat mandiri berdasarkan dentang.
Tautan yang berguna:
CXXCTP menggunakan cling untuk mengeksekusi C ++ pada waktu kompilasi.
Anda dapat menggunakan cling for hot code reload / repl / fast c ++ prototipe / engine skrip / jit / dll.
Tautan yang berguna:
sudo apt install clang-format Jalankan berdasarkan file .clang-format :
find . -regex ' .*.(cpp|hpp|cu|c|h) ' -exec clang-format -style=file -i {} ;Tautan yang berguna:
.clang-formatBaca pedoman yang berkontribusi sebelum membuat permintaan tarik Anda.
Harap dicatat bahwa proyek ini dirilis dengan kode etik. Dengan berpartisipasi dalam proyek ini, Anda setuju untuk mematuhi persyaratannya.
Proyek itu mungkin karena autoprogrammer Flexferrum.
Artikel tentang autoprogrammer Flexferrum di Media:
Semua komponen open source digunakan di bawah lisensi open source yang terkait.
Menggunakan komponen open source:
Lihat file lisensi
File CMake Lulus Cek gaya, dapat diperbaiki dengan menjalankan run-cmake-format.py dari akar repositori. Ini membutuhkan python 3 dan cmake_format (Catatan: ini saat ini tidak berfungsi pada windows)
Gunakan cmake-format.py dan run-cmake-format.py
pip3 install cmake_format
python3 run-cmake-format.pyUntuk menggunakan format CMake pada file cmakelists.txt tertentu di baris perintah run
python3 -m cmake_format -c cmake-format.py -i CMakeLists.txtAda ekstensi Visual Studio resmi, yang detailnya dapat ditemukan di sini.
Ikuti CMake StyleGuide https://github.com/ruslo/0
.cxtpl