project(tcc C) cmake_minimum_required(VERSION 2.6) enable_testing() set(CMAKE_USE_RELATIVE_PATHS ON) if(WIN32) set(BUILD_SHARED_LIBS ON) if(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM") set(TCC_TARGET_DEFAULT "WinCE") elseif(CMAKE_SIZEOF_VOID_P EQUAL 8) set(TCC_TARGET_DEFAULT "Win64") else() set(TCC_TARGET_DEFAULT "Win32") endif() else() if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm") set(TCC_TARGET_DEFAULT "ARM") if(CMAKE_SYSTEM_PROCESSOR MATCHES "^armv5") set(TCC_ARM_VERSION_DEFAULT 5) elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^armv6") set(TCC_ARM_VERSION_DEFAULT 6) elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^armv7") set(TCC_ARM_VERSION_DEFAULT 7) else() set(TCC_ARM_VERSION_DEFAULT 4) endif() elseif(CMAKE_SIZEOF_VOID_P EQUAL 8) set(TCC_TARGET_DEFAULT "x86_64") else() set(TCC_TARGET_DEFAULT "i386") endif() endif() set(TCC_TARGET_LIST "Win32" "Win64" "WinCE" "i386" "x86_64" "ARM" "C67") set(TCC_TARGET ${TCC_TARGET_DEFAULT} CACHE STRING "Target OS") set_property(CACHE TCC_TARGET PROPERTY STRINGS ${TCC_TARGET_LIST}) set(TCC_ARM_VERSION ${TCC_ARM_VERSION_DEFAULT} CACHE STRING "ARM target CPU version") set_property(CACHE TCC_ARM_VERSION PROPERTY STRINGS 4 5 6 7) set(TCC_ARM_EABI OFF CACHE BOOL "Enable EABI on ARM") set(TCC_ARM_VFP OFF CACHE BOOL "Enable VFP on ARM") set(TCC_ARM_HARDFLOAT OFF CACHE BOOL "Enable hardware floating point on ARM") set(I386_SOURCES i386-gen.c i386-asm.c i386-asm.h i386-tok.h) set(X86_64_SOURCES x86_64-gen.c i386-asm.c x86_64-asm.h) if(TCC_TARGET STREQUAL "Win32") set(TCC_TARGET_FLAGS -DTCC_TARGET_I386 -DTCC_TARGET_PE) set(LIBTCC_TARGET_SOURCES ${I386_SOURCES} tccpe.c) elseif(TCC_TARGET STREQUAL "Win64") set(TCC_TARGET_FLAGS -DTCC_TARGET_X86_64 -DTCC_TARGET_PE) set(LIBTCC_TARGET_SOURCES ${X86_64_SOURCES} tccpe.c) elseif(TCC_TARGET STREQUAL "WinCE") set(TCC_TARGET_FLAGS -DTCC_TARGET_ARM -DTCC_ARM_VERSION=${TCC_ARM_VERSION}) set(LIBTCC_TARGET_SOURCES arm-gen.c tccpe.c) elseif(TCC_TARGET STREQUAL "i386") set(TCC_TARGET_FLAGS -DTCC_TARGET_I386) set(LIBTCC_TARGET_SOURCES ${I386_SOURCES}) elseif(TCC_TARGET STREQUAL "x86-64") set(TCC_TARGET_FLAGS -DTCC_TARGET_X86_64) set(LIBTCC_TARGET_SOURCES ${X86_64_SOURCES}) elseif(TCC_TARGET STREQUAL "ARM") set(TCC_TARGET_FLAGS -DTCC_TARGET_ARM -DTCC_ARM_VERSION=${TCC_ARM_VERSION} -DTCC_ARM_EABI=${TCC_ARM_EABI} -DTCC_ARM_VFP=${TCC_ARM_VFP} -DTCC_ARM_HARDFLOAT=${TCC_ARM_HARDFLOAT}) set(LIBTCC_TARGET_SOURCES arm-gen.c) elseif(TCC_TARGET STREQUAL "C67") set(TCC_TARGET_FLAGS -DTCC_TARGET_C67) set(LIBTCC_TARGET_SOURCES c67-gen.c tcccoff.c) else() message(FATAL_ERROR "Unrecognised target in TCC_TARGET, must be one of ${TCC_TARGET_LIST}") endif() add_definitions(${TCC_TARGET_FLAGS}) file(STRINGS "VERSION" TCC_VERSION) list(GET TCC_VERSION 0 TCC_VERSION) include_directories(${CMAKE_BINARY_DIR}) configure_file(config.h.in config.h) add_library(libtcc libtcc.c tccpp.c tccgen.c tccelf.c tccasm.c tccrun.c tcc.h config.h libtcc.h tcctok.h ${LIBTCC_TARGET_SOURCES} ) set_target_properties(libtcc PROPERTIES PREFIX "") add_executable(tcc tcc.c) target_link_libraries(tcc libtcc) set(TCC_CFLAGS -I${CMAKE_SOURCE_DIR}/include ${CMAKE_C_FLAGS}) if(TCC_TARGET MATCHES "^Win") set(TCC_CFLAGS ${TCC_CFLAGS} -I${CMAKE_SOURCE_DIR}/win32/include) endif() add_executable(tiny_impdef win32/tools/tiny_impdef.c) add_executable(tiny_libmaker win32/tools/tiny_libmaker.c) set(LIBTCC1_I386_SOURCES lib/alloca86.S lib/alloca86-bt.S lib/bcheck.c) set(LIBTCC1_WIN_SOURCES win32/lib/crt1.c win32/lib/wincrt1.c win32/lib/dllcrt1.c win32/lib/dllmain.c win32/lib/chkstk.S) if(TCC_TARGET STREQUAL "Win32") set(LIBTCC1_SOURCES ${LIBTCC1_I386_SOURCES} ${LIBTCC1_WIN_SOURCES}) elseif(TCC_TARGET STREQUAL "Win64") set(LIBTCC1_SOURCES lib/alloca86_64.S ${LIBTCC1_WIN_SOURCES}) elseif(TCC_TARGET STREQUAL "i386") set(LIBTCC1_SOURCES ${LIBTCC1_I386_SOURCES}) elseif(TCC_TARGET STREQUAL "x86-64") set(LIBTCC1_SOURCES lib/alloca86_64.S) endif() if (TCC_TARGET MATCHES "^Win") set(XCC tcc ${TCC_CFLAGS} ${TCC_TARGET_FLAGS} -B${CMAKE_SOURCE_DIR}/win32) set(XAR tiny_libmaker${CMAKE_EXECUTABLE_SUFFIX}) set(XDEPENDS tiny_libmaker) endif() if(LIBTCC1_SOURCES) list(APPEND LIBTCC1_SOURCES lib/libtcc1.c) foreach(LIBTCC1_C ${LIBTCC1_SOURCES}) string(REGEX MATCH "[^/]+$" LIBTCC1_O ${LIBTCC1_C}) string(REGEX MATCH "^[^.]+" LIBTCC1_O ${LIBTCC1_O}) set(LIBTCC1_O ${LIBTCC1_O}.o) add_custom_command(OUTPUT ${LIBTCC1_O} COMMAND ${XCC} -c ${CMAKE_SOURCE_DIR}/${LIBTCC1_C} -o ${LIBTCC1_O} DEPENDS ${CMAKE_SOURCE_DIR}/${LIBTCC1_C}) list(APPEND LIBTCC1_OBJECTS ${LIBTCC1_O}) endforeach() add_custom_command(OUTPUT libtcc1.a COMMAND ${XAR} libtcc1.a ${LIBTCC1_OBJECTS} DEPENDS ${LIBTCC1_OBJECTS} ${XDEPENDS}) add_custom_target(libtcc1 ALL DEPENDS libtcc1.a) endif() add_subdirectory(tests)