add tiny-c compiler package
This commit is contained in:
parent
f472e5d76e
commit
95c1b87282
|
@ -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()
|
|
@ -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"]
|
|
@ -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)
|
|
@ -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)
|
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue