Eine vollständig Open Source, leistungsstarke Lösung zur Modifikation und Erzeugung von C ++ - Quellcode. Reduzieren Sie die Menge an Kesselplattencode in Ihren C ++ - Projekten.
Dieses Repo wird so schnell wie möglich auf https://github.com/blockspacer/flextool migriert
CXXCTP wird veraltet. Lieber Flextool
CXXCTP ist ein Transpiler, der C ++ für neue Introspection-, Reflection- und Compile-Time-Ausführung erweitert.
CXXCTP zielt nicht darauf ab, einen vordefinierten Satz von Quellcode -Transformationen zu erstellen. Benutzer können C ++ - Skripte für die Quellcode -Transformation freigeben.
Angenommen, jemand hat nützliche Skripte wie interface.cxx und enum_to_json.cxx an die Open-Source-Community geteilt. Sie können sie in Ihrem Projekt verwenden, indem Sie sie in den Ordner ctp_scripts platzieren.
Die Metaprogrammierung ist eine „Kunst“ des Schreibens von Programmen zur Behandlung anderer Programme als Daten. Dies bedeutet, dass ein Programm Code generieren, lesen, analysieren und transformieren kann oder sogar selbst, um eine bestimmte Lösung zu erreichen.
Hinweis: Dieses Projekt ist so wie es ist, ohne Garantie (siehe Lizenz).
Warum würden Sie Clang nicht einfach erweitern, da es auch einige experimentelle Funktionen bietet (z. B. Module)?
Clang ist ein Compiler, während dieses Projekt ein Transpiler ist, der den Code in standardisierten C ++ - Code umwandelt, ohne dass LLVM/Assembly geändert werden muss.
Da die Ausgabe des Tools C ++ - Code ist, können Sie transpilierter Code mit EMSCIPTEN erfassen, statische Codeanalysatoren verwenden, Code im Inneren des CLINGS usw. ausführen usw. ausführen usw.
Mit CXXCTP können Sie Skripte erstellen und freigeben
In der Entwicklung siehe Beispiele. Unterstützt derzeit nur Linux.
Beachten Sie, dass Sie Linux -Container unter Windows/Mac/etc ausführen können.
// 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 --remoteInstallieren und Konfigurieren von Docker: https://medium.com/@saniaky/configure-docker-to-use-a-host-proxy-e88bd988c0aa
Kloncode (wie oben) und cd in geklonte Dir.
Hinweis: Möglicherweise möchten Sie das Docker-Bild mit --build-arg NO_SSL="False" erstellen. Lesen Sie Kommentare in 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 Konfigurieren Sie Proxies & Cacert_Path in ~/.conan/conan.conf , siehe https://docsconan.io/en/latest/reference/config_files/conan.conf.html#proxies
Konfigurieren Sie das Conan -Clang -Profil, um dann -Profile Clang zu verwenden:
/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 Und dann 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++Wenn Sie SSL (unter Proxy usw.) deaktivieren möchten:
# 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=bincraftersWenn Sie Corp einstellen möchten. Cacert:
CONAN_CACERT_PATH=/path/to/ca-bundle.crt
file $CONAN_CACERT_PATHNützliche Links:
Um die Liste der Abhängigkeitsentfernungen hinzufügen zu können, geben Sie bitte den folgenden Befehl ein:
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.shInstallieren Sie die CXTPL -Bibliothek https://github.com/blockspacer/cxtpl
Installieren Sie 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.shInstallieren Sie DEPs wie in 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.cppOder unter GDB:
rm -rf * generated * ; clear && clear ; gdb ./CXXCTP -ex " run " -ex " bt " -ex " q " Verwenden Sie die gemeinsam genutzte CXXCTP_CORE als freigegebene Bibliothek -DBUILD_SHARED_LIBS=TRUE .
BASH BASH CRIFTS/INSTELLUNG_FOLLY.SH FÜR HTTPS://GITHUB.com/BLOCKSPACER/CXTPL oder PATCH FOLLY FORTY SO FÜR CLANG SUPPORT (TROSSEN SIE FOLLY_USE_JEMALLOC ERSETZEN AUSGABEN MIT FOLLY_ASSUME_NO_JEMALLOC) Facebook/Folly#976
Verwenden Sie Clang (nicht GCC!) Vor dem Erstellen und -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 --pluginsWenn Sie cxxctp_tool installiert haben, können Sie Beispiele ausführen:
# 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 Vergessen Sie nicht, die Klampf Uhren zu festigen, wobei Pfade von -extra-arg=-I$PWD/include und Bibliothek Pfade von -extra-arg=-L$PWD/build und .so/.dll libs von -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 Verwenden Sie die Option für CXXCTP_tool : -extra-arg :
-extra-arg=-I $PWD /include -extra-arg=-I $PWD /include/foo -extra-arg=-DMY_DEFINITION=1 -extra-arg=-DONE_MORE_DEFINITION=1Beispiel:
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.cppDie folgenden Abschnitte decken die Nutzung, benutzerdefinierte Regeln und Debuggen für CXXCTP ab.
Sie können benutzerdefinierte C ++ - Skripte für die Quellcode -Transformation schreiben oder vorhandene verwenden.
CXXCTP lädt alle C ++ - Skripte aus dem Ordner ctp_scripts in lexikografischer Reihenfolge.
Beispielinhalte von ctp_scripts:
Utils müssen vor Skripten geladen werden (Klammern), also haben wir 1_ , 2_ , ... vor Ordnernamen hinzugefügt (siehe oben).
Sie können #include verwenden, Dateisysteme verwenden, auf das Internet usw. in C ++ - Skripten zugreifen.
Verzeichnis "
Installieren Sie mit -DENABLE_CLING=TRUE -DINSTALL_CLING=TRUE LD_LIBRARY_PATH setzen
export LD_LIBRARY_PATH=/usr/local/lib/: $LD_LIBRARY_PATH
sudo ldconfigSie können C ++ - Anmerkungen verwenden, um CXXCTP mitzuteilen, welche Aktionen es ausführen müssen.
Angenommen, wir wollen die Klasse in die Schnittstelle verwandeln:
// 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 ;
}; Wir können funccall -Aktionen verwenden, um C ++ - Skripte für die Quellcode -Transformation auszuführen. Nehmen wir an, dass Skriptnamen make_interface und make_removefuncbody (Name wie Sie möchten) sind.
__attribute__ ((annotate( " {gen};{funccall};make_interface;make_removefuncbody " ))) {gen}; - Keyword, das in jeder CXXCTP -Annotation verwendet wird.
{funccall}; - Keyword, mit dem CXXCTP mitgeteilt wird, was es C ++ -Skripts mit Haftung ausführen muss.
make_interface;make_removefuncbody - Zwei Skripte, was CXXCTP ausführen wird.
Skripte werden von links ( make_interface ) nach rechts ausgeführt ( make_removefuncbody ).
Normalerweise müssen Sie keine langen C ++-Anmerkungen schreiben, verwenden Sie einfach C ++ #define (oder eingebauter Header mit gemeinsamen Definierungen einbeziehen):
# 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);
}; Verwenden eines ähnlichen Ansatzes können Sie mehrere Quellcode -Transformationsschritte auf dieselbe class / struct / usw. anwenden.
Erstellen Sie Dateien mit Ihrer Funktion in ctp_scripts
custom_plugins.cmake.example custom_plugins.cmake
Gehen Sie Ihre Skriptpfade an custom_plugins.cmake über 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
) Überprüfen Sie, ob Ihr Funktionsname in der generierten Datei ctp_registry.cpp vorliegt (kann im Klingel / Dev-Modus übersprungen werden).
Funktionssignatur für die Codetransformation muss mit cxxctp_callback kompatibel sein:
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;Detaillierte Funktionssignatur:
all_funcs_with_args (siehe unten)parsed_func - interface und foo_with_args . Denken Sie an den Funktionsnamen als einen von __VA_ARGS__ von
# define $apply(...)
__attribute__ ((annotate( " {gen};{funccall}; " #__VA_ARGS__))) Beispiel, wo make_interface und make_removefuncbody - zwei Funktionsnamen:
$apply(make_interface;
make_removefuncbody)Wenn Sie Codegenerierung benötigen:
.cxtpl ). Erstellen Sie Ihre Datei mit cxtpl_tool https://github.com/blockspacer/cxtplstd::string cxtpl_output , die das Ergebnis der Vorlage -Rendering mit einigen Argumenten speichert..cxtpl ) in Ihre Funktion ein. .cxtpl .cxtpl ist die Dateierweiterung für die C ++ - Template Engine https://github.com/blockspacer/cxtpl
.cxtpl bei Compile-Time (CMAKE) hinzu Fügen Sie Ihre .cxtpl -Datei in Codegen_files.cmake hinzu
HINWEIS: Im Dev -Modus (wie Codegen_files.cmake Klammermodus) kann es eine gute Idee sein, Dateien aus Vorlagen mit CXTPL_TOOL https://github.com/blockspacer/cxtpl zu generieren.
HINWEIS: Vergessen Sie nicht, sowohl .cxtpl als auch .cxtpl.h -Dateien mit gemeinsam genutzten CodeGen -Regeln (zum Versionskontrollsystem hinzufügen) anzugeben.
.cxtpl zur Laufzeit mit KlammerSie haben zwei Optionen:
.cxtpl und geben Sie sie in das CLIGING C ++ -Skript ein. Ähnlich wie bei Compile-Time, aber Sie können Dateien ohne Programm-Neukompilation neu generieren oder ändern. Beachten Sie, dass es möglich ist, Dateien zu generieren und in Ihr Skript aufzunehmen. Teilen Sie das Skript einfach in mehrere Einschlüsse auf..cxtpl und führen Sie sie dann in einem separaten Haftinterpreter aus. In den meisten Fällen verwenden Sie die erste Option. .cxtpl mit CXXCTPÜbergeben Sie Reflexionsdaten in die Template Engine.
Generieren Sie Dateien aus Vorlagen mit cxtpl_tool https://github.com/blockspacer/cxtpl
In CXXCTP -Skript ( .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);
} In .cxtpl -Vorlage:
const auto arguments = std::any_cast<Arguments>(cxtpl_params.at( " Arguments " ));
std::cout << arguments.arg1; Siehe resources/cxtpl/enum_gen_hpp.cxtpl als Beispiel.
CXXCTP_TOOL WIRD LIBTOOLING, um benutzerdefinierte Befehlszeilenoptionen hinzuzufügen.
Optionen im Zusammenhang mit Libtooling (Typ -Help oder -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 pathOptionen in Bezug auf cxxctp_tool (Typ -Help, nicht -help):
ctp_scripts_paths - Liste der Pfade, bei denen Toll nach CTP_Scripts -Unterordner sucht
Hinweis: ctp_scripts_paths erfordert -DENABLE_CLING=TRUE
-L .=DBG9
Beispiel für die Protokollkonfiguration, die sowohl in den Datei- als auch in den Konsolenstrom eingeschrieben wird:
./build/bin/CXXCTP_tool -L " .:=INFO:default:console; default=file:path=y.log,async=true,sync_level=DBG9;console=stream:stream=stderr " --srcdir , um den aktuellen Dateisystempfad für Eingabedateien zu ändern.
--resdir , um den aktuellen Dateisystempfad für Ausgabedateien zu ändern.
Beispiel (benutzerdefinierte Ausgabe 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_scriptsEntfernen Sie alte Build -Artefakte und generierte Dateien.
Bündeln Sie Ihre Skripte mit CXXCTP_tool über -DBUNDLE_EXAMPLE_SCRIPTS=TRUE .
Stellen Sie sicher, dass Ihre Skripte (Plugins) zu CXXCTP_tool über custom_plugins.cmake.example hinzugefügt werden.
Deaktivieren Sie pro -project scripts -DALLOW_PER_PROJECT_CTP_SCRIPTS=FALSE .
Überprüfen Sie, ob Ihre Skripte (Plugins) in build/tool/CXXCTP_tool --plugins sind
Überprüfen Sie, ob die systeminstallierte Version von CXXCTP_tool mit build/tool/CXXCTP_tool (nach Datum/Datei-Hash) übereinstimmt.
Führen Sie CXXCTP_tool manuell unter gdb aus:
gdb -ex " r " -ex " bt " --args build/tool/CXXCTP_tool ......... Überprüfen Sie, ob alle erforderlichen Pfade in -extra-arg= sind.
Erstellen Sie ein Protokoll zur Datei im DBG9 -Modus und überprüfen Sie .log -Dateien.
CXXCTP verwendet libtooling, um C ++ zu analysieren und zu ändern.
Libtooling ist eine Bibliothek, in der das Schreiben von eigenständigen Tools basierend auf Clang unterstützt wird.
Nützliche Links:
CXXCTP verwendet CLING, um C ++ zur Kompilierungszeit auszuführen.
Sie können CLINGE für Heißcode -Reload / Repl / Fast C ++ Prototyping / Skriptmotor / JIT / usw. verwenden.
Nützliche Links:
sudo apt install clang-format Ausführen basierend auf .clang-format Datei:
find . -regex ' .*.(cpp|hpp|cu|c|h) ' -exec clang-format -style=file -i {} ;Nützliche Links:
.clang-format Datei https://leimao.github.io/blog/clang-format-quick-tutorial/Bitte lesen Sie unsere beitragenden Richtlinien, bevor Sie Ihre Pull -Anfrage stellen.
Bitte beachten Sie, dass dieses Projekt mit einem Verhaltenskodex veröffentlicht wird. Durch die Teilnahme an diesem Projekt erklären Sie sich damit einverstanden, sich an seine Bedingungen einzuhalten.
Dieses Projekt ist aufgrund des autoprogrammer von Flexferrum möglich.
Artikel über autoprogrammer von Flexferum in den Medien:
Alle Open -Source -Komponenten werden unter ihren zugehörigen Open -Source -Lizenzen verwendet.
Verwendete Open -Source -Komponenten:
Siehe Lizenzdateien
CMAKE-Dateien passieren Stilprüfungen und können durch Ausführen von run-cmake-format.py vom Stammerwesen des Repositorys ausgeführt werden. Dies erfordert Python 3 und CMake_Format (Hinweis: Dies funktioniert derzeit nicht unter Windows)
cmake-format.py run-cmake-format.py
pip3 install cmake_format
python3 run-cmake-format.pyVerwenden Sie CMake-format für eine bestimmte Datei cmakelists.txt in der Befehlszeile ausgeführt
python3 -m cmake_format -c cmake-format.py -i CMakeLists.txtEs gibt eine offizielle Visual Studio -Erweiterung, von denen hier Details gefunden werden können.
Folgen Sie CMake StyleGuide https://github.com/ruslo/0
.cxtpl verwenden