From 95c1b872829a6046b5f1272c4406295a83e2ca27 Mon Sep 17 00:00:00 2001 From: eyck Date: Mon, 6 Apr 2020 15:52:53 +0200 Subject: [PATCH] add tiny-c compiler package --- TCC/build.py | 9 +++ TCC/conanfile.py | 41 ++++++++++++++ TCC/test_package/CMakeLists.txt | 13 +++++ TCC/test_package/conanfile.py | 23 ++++++++ TCC/test_package/example.cpp | 97 +++++++++++++++++++++++++++++++++ 5 files changed, 183 insertions(+) create mode 100755 TCC/build.py create mode 100644 TCC/conanfile.py create mode 100644 TCC/test_package/CMakeLists.txt create mode 100644 TCC/test_package/conanfile.py create mode 100644 TCC/test_package/example.cpp diff --git a/TCC/build.py b/TCC/build.py new file mode 100755 index 0000000..c818acc --- /dev/null +++ b/TCC/build.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python3 +from conan.packager import ConanMultiPackager + +if __name__ == "__main__": + builder = ConanMultiPackager(username="minres") + types = ['Debug','Release'] + for t in types: + builder.add(settings={"build_type":t}, options={}, env_vars={}, build_requires={}) + builder.run() diff --git a/TCC/conanfile.py b/TCC/conanfile.py new file mode 100644 index 0000000..ade0615 --- /dev/null +++ b/TCC/conanfile.py @@ -0,0 +1,41 @@ +from conans import ConanFile, AutoToolsBuildEnvironment, tools +import os + +class TccConan(ConanFile): + name = "tcc" + version = "0.9.27" + license = "GNU Lesser General Public License" + author = "Eyck Jentzsch " + url = "https://github.com/Minres/conan-recipes/tree/master/TCC" + description = "TinyCC (aka TCC) is a small but hyper fast C compiler. Unlike other C compilers, it is meant to be self-relying: you do not need an external assembler or linker because TCC does that for you." + topics = ("compiler", "c") + settings = "os", "compiler", "build_type", "arch" + default_options = {} + + source_tar = "http://download.savannah.gnu.org/releases/tinycc/tcc-%s.tar.bz2" % version + #generators = "cmake" + sub_folder = "tcc-%s" % version + exports_sources = "tcc-%s/*" % version + + def source(self): + self.output.info("Downloading %s" %self.source_tar) + tools.download(self.source_tar, "tcc.tar.bz2") + tools.unzip("tcc.tar.bz2") + os.remove("tcc.tar.bz2") + + def configure(self): + del self.settings.compiler.libcxx + + def build(self): + autotools = AutoToolsBuildEnvironment(self) + autotools.fpic = True + with tools.chdir("%s/%s" % (self.source_folder, self.sub_folder)): + autotools.configure() + autotools.make() + autotools.make(target="install") + + def package(self): + pass + + def package_info(self): + self.cpp_info.libs = ["tcc"] diff --git a/TCC/test_package/CMakeLists.txt b/TCC/test_package/CMakeLists.txt new file mode 100644 index 0000000..ebeeaed --- /dev/null +++ b/TCC/test_package/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 2.8.12) +project(PackageTest CXX) + +include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) +conan_basic_setup() + +add_executable(example example.cpp) +target_link_libraries(example ${CONAN_LIBS} ${CMAKE_DL_LIBS}) +# CTest is a testing tool that can be used to test your project. +# enable_testing() +# add_test(NAME example +# WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/bin +# COMMAND example) diff --git a/TCC/test_package/conanfile.py b/TCC/test_package/conanfile.py new file mode 100644 index 0000000..ddfd09a --- /dev/null +++ b/TCC/test_package/conanfile.py @@ -0,0 +1,23 @@ +import os + +from conans import ConanFile, CMake, tools + + +class TccTestConan(ConanFile): + settings = "os", "compiler", "build_type", "arch" + generators = "cmake" + + def build(self): + cmake = CMake(self) + cmake.configure() + cmake.build() + + def imports(self): + self.copy("*.dll", dst="bin", src="bin") + self.copy("*.dylib*", dst="bin", src="lib") + self.copy('*.so*', dst='bin', src='lib') + + def test(self): + if not tools.cross_building(self.settings): + os.chdir("bin") + self.run(".%sexample" % os.sep) \ No newline at end of file diff --git a/TCC/test_package/example.cpp b/TCC/test_package/example.cpp new file mode 100644 index 0000000..c74a83c --- /dev/null +++ b/TCC/test_package/example.cpp @@ -0,0 +1,97 @@ +/* + * Simple Test program for libtcc + * + * libtcc can be useful to use tcc as a "backend" for a code generator. + */ +#include +#include +#include + +#include "libtcc.h" + + +/* this function is called by the generated code */ +int add(int a, int b) +{ + return a + b; +} + +/* this strinc is referenced by the generated code */ +const char hello[] = "Hello World!"; + +char my_program[] = +"#include \n" /* include the "Simple libc header for TCC" */ +"extern int add(int a, int b);\n" +"#ifdef _WIN32\n" /* dynamically linked data needs 'dllimport' */ +" __attribute__((dllimport))\n" +"#endif\n" +"extern const char hello[];\n" +"int fib(int n)\n" +"{\n" +" if (n <= 2)\n" +" return 1;\n" +" else\n" +" return fib(n-1) + fib(n-2);\n" +"}\n" +"\n" +"int foo(int n)\n" +"{\n" +" printf(\"%s\\n\", hello);\n" +" printf(\"fib(%d) = %d\\n\", n, fib(n));\n" +" printf(\"add(%d, %d) = %d\\n\", n, 2 * n, add(n, 2 * n));\n" +" return 0;\n" +"}\n"; + +int main(int argc, char **argv) +{ + TCCState *s; + int i; + int (*func)(int); + + s = tcc_new(); + if (!s) { + fprintf(stderr, "Could not create tcc state\n"); + exit(1); + } + + /* if tcclib.h and libtcc1.a are not installed, where can we find them */ + for (i = 1; i < argc; ++i) { + char *a = argv[i]; + if (a[0] == '-') { + if (a[1] == 'B') + tcc_set_lib_path(s, a+2); + else if (a[1] == 'I') + tcc_add_include_path(s, a+2); + else if (a[1] == 'L') + tcc_add_library_path(s, a+2); + } + } + + /* MUST BE CALLED before any compilation */ + tcc_set_output_type(s, TCC_OUTPUT_MEMORY); + + if (tcc_compile_string(s, my_program) == -1) + return 1; + + /* as a test, we add symbols that the compiled program can use. + You may also open a dll with tcc_add_dll() and use symbols from that */ + tcc_add_symbol(s, "add", reinterpret_cast(add)); + tcc_add_symbol(s, "hello", reinterpret_cast(hello)); + + /* relocate the code */ + if (tcc_relocate(s, TCC_RELOCATE_AUTO) < 0) + return 1; + + /* get entry symbol */ + func = reinterpret_cast(tcc_get_symbol(s, "foo")); + if (!func) + return 1; + + /* run the code */ + func(32); + + /* delete the state */ + tcc_delete(s); + + return 0; +}