64-bit tests now pass (well, nearly).
[tinycc.git] / CMakeLists.txt
blob12fda70d5b89a1cdeb12c3e93c91fbe4f53bb2f2
1 project(tcc C)
2 cmake_minimum_required(VERSION 2.6)
3 enable_testing()
5 set(CMAKE_USE_RELATIVE_PATHS ON)
7 if(WIN32)
8   set(BUILD_SHARED_LIBS ON)
9   if(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM")
10     set(TCC_TARGET_DEFAULT "WinCE")
11   elseif(CMAKE_SIZEOF_VOID_P EQUAL 8)
12     set(TCC_TARGET_DEFAULT "Win64")
13   else()
14     set(TCC_TARGET_DEFAULT "Win32")
15   endif()
16 else()
17   if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
18     set(TCC_TARGET_DEFAULT "ARM")
19     if(CMAKE_SYSTEM_PROCESSOR MATCHES "^armv5")
20       set(TCC_ARM_VERSION_DEFAULT 5)
21     elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^armv6")
22       set(TCC_ARM_VERSION_DEFAULT 6)
23     elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^armv7")
24       set(TCC_ARM_VERSION_DEFAULT 7)
25     else()
26       set(TCC_ARM_VERSION_DEFAULT 4)
27     endif()
28   elseif(CMAKE_SIZEOF_VOID_P EQUAL 8)
29     set(TCC_TARGET_DEFAULT "x86_64")
30   else()
31     set(TCC_TARGET_DEFAULT "i386")
32   endif()
33 endif()
35 set(TCC_TARGET_LIST "Win32" "Win64" "WinCE" "i386" "x86_64" "ARM" "C67")
36 set(TCC_TARGET ${TCC_TARGET_DEFAULT} CACHE STRING "Target OS")
37 set_property(CACHE TCC_TARGET PROPERTY STRINGS ${TCC_TARGET_LIST})
39 set(TCC_ARM_VERSION ${TCC_ARM_VERSION_DEFAULT} CACHE STRING "ARM target CPU version")
40 set_property(CACHE TCC_ARM_VERSION PROPERTY STRINGS 4 5 6 7)
41 set(TCC_ARM_EABI OFF CACHE BOOL "Enable EABI on ARM")
42 set(TCC_ARM_VFP OFF CACHE BOOL "Enable VFP on ARM")
43 set(TCC_ARM_HARDFLOAT OFF CACHE BOOL "Enable hardware floating point on ARM")
45 set(I386_SOURCES i386-gen.c i386-asm.c i386-asm.h i386-tok.h)
46 set(X86_64_SOURCES x86_64-gen.c i386-asm.c x86_64-asm.h)
48 if(TCC_TARGET STREQUAL "Win32")
49   set(TCC_TARGET_FLAGS -DTCC_TARGET_I386 -DTCC_TARGET_PE)
50   set(LIBTCC_TARGET_SOURCES ${I386_SOURCES} tccpe.c)
51 elseif(TCC_TARGET STREQUAL "Win64")
52   set(TCC_TARGET_FLAGS -DTCC_TARGET_X86_64 -DTCC_TARGET_PE)
53   set(LIBTCC_TARGET_SOURCES ${X86_64_SOURCES} tccpe.c)
54 elseif(TCC_TARGET STREQUAL "WinCE")
55   set(TCC_TARGET_FLAGS -DTCC_TARGET_ARM
56     -DTCC_ARM_VERSION=${TCC_ARM_VERSION})
57   set(LIBTCC_TARGET_SOURCES arm-gen.c tccpe.c)
58 elseif(TCC_TARGET STREQUAL "i386")
59   set(TCC_TARGET_FLAGS -DTCC_TARGET_I386)
60   set(LIBTCC_TARGET_SOURCES ${I386_SOURCES})
61 elseif(TCC_TARGET STREQUAL "x86-64")
62   set(TCC_TARGET_FLAGS -DTCC_TARGET_X86_64)
63   set(LIBTCC_TARGET_SOURCES ${X86_64_SOURCES})
64 elseif(TCC_TARGET STREQUAL "ARM")
65   set(TCC_TARGET_FLAGS -DTCC_TARGET_ARM
66     -DTCC_ARM_VERSION=${TCC_ARM_VERSION}
67     -DTCC_ARM_EABI=${TCC_ARM_EABI}
68     -DTCC_ARM_VFP=${TCC_ARM_VFP}
69     -DTCC_ARM_HARDFLOAT=${TCC_ARM_HARDFLOAT})
70   set(LIBTCC_TARGET_SOURCES arm-gen.c)
71 elseif(TCC_TARGET STREQUAL "C67")
72   set(TCC_TARGET_FLAGS -DTCC_TARGET_C67)
73   set(LIBTCC_TARGET_SOURCES c67-gen.c tcccoff.c)
74 else()
75   message(FATAL_ERROR "Unrecognised target in TCC_TARGET, must be one of ${TCC_TARGET_LIST}")
76 endif()
78 add_definitions(${TCC_TARGET_FLAGS})
79 file(STRINGS "VERSION" TCC_VERSION)
80 list(GET TCC_VERSION 0 TCC_VERSION)
81 include_directories(${CMAKE_BINARY_DIR})
82 configure_file(config.h.in config.h)
84 add_library(libtcc
85 libtcc.c tccpp.c tccgen.c tccelf.c tccasm.c tccrun.c
86 tcc.h config.h libtcc.h tcctok.h
87 ${LIBTCC_TARGET_SOURCES}
89 set_target_properties(libtcc PROPERTIES PREFIX "")
91 add_executable(tcc tcc.c)
92 target_link_libraries(tcc libtcc)
93 set(TCC_CFLAGS -I${CMAKE_SOURCE_DIR}/include ${CMAKE_C_FLAGS})
94 if(TCC_TARGET MATCHES "^Win")
95   set(TCC_CFLAGS ${TCC_CFLAGS} -I${CMAKE_SOURCE_DIR}/win32/include)
96 endif()
98 add_executable(tiny_impdef win32/tools/tiny_impdef.c)
99 add_executable(tiny_libmaker win32/tools/tiny_libmaker.c)
101 set(LIBTCC1_I386_SOURCES lib/alloca86.S lib/alloca86-bt.S lib/bcheck.c)
102 set(LIBTCC1_WIN_SOURCES win32/lib/crt1.c win32/lib/wincrt1.c win32/lib/dllcrt1.c win32/lib/dllmain.c win32/lib/chkstk.S)
104 if(TCC_TARGET STREQUAL "Win32")
105   set(LIBTCC1_SOURCES ${LIBTCC1_I386_SOURCES} ${LIBTCC1_WIN_SOURCES})
106 elseif(TCC_TARGET STREQUAL "Win64")
107   set(LIBTCC1_SOURCES lib/alloca86_64.S ${LIBTCC1_WIN_SOURCES})
108 elseif(TCC_TARGET STREQUAL "i386")
109   set(LIBTCC1_SOURCES ${LIBTCC1_I386_SOURCES})
110 elseif(TCC_TARGET STREQUAL "x86-64")
111   set(LIBTCC1_SOURCES lib/alloca86_64.S)
112 endif()
114 if (TCC_TARGET MATCHES "^Win")
115   set(XCC tcc ${TCC_CFLAGS} ${TCC_TARGET_FLAGS} -B${CMAKE_SOURCE_DIR}/win32)
116   set(XAR tiny_libmaker${CMAKE_EXECUTABLE_SUFFIX})
117   set(XDEPENDS tiny_libmaker)
118 endif()
120 if(LIBTCC1_SOURCES)
121   list(APPEND LIBTCC1_SOURCES lib/libtcc1.c)
122   foreach(LIBTCC1_C ${LIBTCC1_SOURCES})
123     string(REGEX MATCH "[^/]+$" LIBTCC1_O ${LIBTCC1_C})
124     string(REGEX MATCH "^[^.]+" LIBTCC1_O ${LIBTCC1_O})
125     set(LIBTCC1_O ${LIBTCC1_O}.o)
126     add_custom_command(OUTPUT ${LIBTCC1_O} COMMAND ${XCC} -c ${CMAKE_SOURCE_DIR}/${LIBTCC1_C} -o ${LIBTCC1_O} DEPENDS ${CMAKE_SOURCE_DIR}/${LIBTCC1_C})
127     list(APPEND LIBTCC1_OBJECTS ${LIBTCC1_O})
128   endforeach()
129   add_custom_command(OUTPUT libtcc1.a COMMAND ${XAR} libtcc1.a ${LIBTCC1_OBJECTS} DEPENDS ${LIBTCC1_OBJECTS} ${XDEPENDS})
130   add_custom_target(libtcc1 ALL DEPENDS libtcc1.a)
131 endif()
133 add_subdirectory(tests)