add tiny-c compiler package

This commit is contained in:
Eyck Jentzsch 2020-04-06 15:52:53 +02:00
parent f472e5d76e
commit 95c1b87282
5 changed files with 183 additions and 0 deletions

9
TCC/build.py Executable file
View File

@ -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()

41
TCC/conanfile.py Normal file
View File

@ -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 <eyck@minres.com>"
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"]

View File

@ -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)

View File

@ -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)

View File

@ -0,0 +1,97 @@
/*
* Simple Test program for libtcc
*
* libtcc can be useful to use tcc as a "backend" for a code generator.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#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 <tcclib.h>\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<const void*>(add));
tcc_add_symbol(s, "hello", reinterpret_cast<const void*>(hello));
/* relocate the code */
if (tcc_relocate(s, TCC_RELOCATE_AUTO) < 0)
return 1;
/* get entry symbol */
func = reinterpret_cast<int (*)(int)>(tcc_get_symbol(s, "foo"));
if (!func)
return 1;
/* run the code */
func(32);
/* delete the state */
tcc_delete(s);
return 0;
}