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