Blob Blame Raw
cmake_minimum_required(VERSION 2.8.11)

set(CMAKE_BUILD_TYPE_INIT Release)

project(OpenToonz)


#-----------------------------------------------------------------------------
# Platform Specific Defaults

# list of var-names
set(_init_vars)

#-----------------------------------------------------------------------------
# Select build target
set(BUILD_TARGET_WIN       OFF)
set(BUILD_TARGET_APPLE     OFF)
set(BUILD_TARGET_UNIX      OFF)
if(WIN32)
    set(BUILD_TARGET_WIN    ON)
    message(STATUS "Target system is WIN")
elseif(APPLE)
    set(BUILD_TARGET_APPLE  ON)
    message(STATUS "Target system is APPLE")
elseif(UNIX)
    set(BUILD_TARGET_UNIX   ON)
    message(STATUS "Target system is UNIX")
else()
    set(BUILD_TARGET_UNIX   ON)
    message(WARNING "Target system unknown, set UNIX by default")
    message(STATUS "Target system is UNIX (actually unknown)")
endif()

#-----------------------------------------------------------------------------
# Select build environment

set(BUILD_ENV_MSVC     OFF)
set(BUILD_ENV_APPLE    OFF)
set(BUILD_ENV_UNIXLIKE OFF)
if(MSVC)
    set(BUILD_ENV_MSVC ON)
    if(NOT BUILD_TARGET_WIN)
        message(WARNING "Build environment is MSVC, but target system is not WIN")
    endif()
    message(STATUS "Build environment is MSVC")
elseif(CMAKE_HOST_APPLE)
    set(BUILD_ENV_APPLE ON)
    if(NOT BUILD_TARGET_APPLE)
        message(WARNING "Build environment is APPLE, but target system is not APPLE")
    endif()
    message(STATUS "Build environment is APPLE")
elseif(CMAKE_HOST_UNIX OR CMAKE_COMPILER_IS_GNUCC)
    set(BUILD_ENV_UNIXLIKE ON)
    if(NOT BUILD_TARGET_UNIX AND NOT BUILD_TARGET_WIN)
        message(WARNING "Build environment is UNIXLIKE, but target system is not UNIX or WIN")
    endif()
    message(STATUS "Build environment is UNIXLIKE")
else()
    message(ERROR "Unsupported build environment, only MSVC, APPLE and UNIXLIKE are supported")
endif()


# initialize to ON
macro(option_defaults_init)
    foreach(_var ${ARGV})
        set(${_var} ON)
        list(APPEND _init_vars "${_var}")
    endforeach()
    unset(_var)
endmacro()

# remove from namespace
macro(option_defaults_clear)
    foreach(_var ${_init_vars})
        unset(${_var})
    endforeach()
    unset(_var)
    unset(_init_vars)
endmacro()

# values to initialize WITH_****
option_defaults_init(
    _init_SYSTEM_LZO
)

# customize...
if(BUILD_ENV_MSVC)
    set(_init_SYSTEM_LZO                     OFF)
    set(_init_SYSTEM_SUPERLU                 OFF)
elseif(BUILD_ENV_APPLE)
    set(_init_SYSTEM_LZO                     OFF)
    set(_init_SYSTEM_SUPERLU                 OFF)
elseif(BUILD_ENV_UNIXLIKE)
    set(_init_SYSTEM_LZO                     ON)
    set(_init_SYSTEM_SUPERLU                 ON)
endif()


#-----------------------------------------------------------------------------
# Build Options

option(WITH_SYSTEM_LZO "Use the system LZO library instead of 'thirdpary'" ${_init_SYSTEM_LZO})
option(WITH_SYSTEM_SUPERLU "Use the system SuperLU library instead of 'thirdpary'" ${_init_SYSTEM_SUPERLU})
option(WITH_CANON "Build with Canon DSLR support - Requires Canon SDK" OFF)
option(WITH_TRANSLATION "Generate translation projects as well" ON)
option(WITH_WINTAB "(Windows only) Build with customized Qt with WinTab support. https://github.com/shun-iwasawa/qt5/releases/tag/v5.15.2_wintab" OFF)

# avoid using again
option_defaults_clear()

# end option(...)

#-----------------------------------------------------------------------------
# Platform Architecture

if(BUILD_ENV_APPLE)
    if(NOT PLATFORM)
        set(PLATFORM 64)
    endif()
else() # Windows and Linux case
    if(CMAKE_SIZEOF_VOID_P EQUAL 8)
        set(PLATFORM 64)
        set(PLATFORM2 _64)
    elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
        set(PLATFORM 32)
        set(PLATFORM2)
    else()
        message("Warning : CMAKE_SIZEOF_VOID_P = ${CMAKE_SIZEOF_VOID_P}")
        set(PLATFORM 64)
        set(PLATFORM2 _64)
    endif()
endif()
message("PLATFORM:" ${PLATFORM})

#-----------------------------------------------------------------------------
# Third Party & System Libs

include(${CMAKE_SOURCE_DIR}/../cmake/util_compiler.cmake)

get_filename_component(SDKROOT ../../thirdparty/ ABSOLUTE)
message(STATUS "SDK Root:" ${SDKROOT})
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/../cmake")
if(BUILD_ENV_APPLE)
    set(THIRDPARTY_LIBS_HINTS "/usr/local/Cellar/" "/opt/include" ${SDKROOT})
elseif(BUILD_ENV_MSVC OR BUILD_ENV_UNIXLIKE)
    set(THIRDPARTY_LIBS_HINTS ${SDKROOT})
endif()

message(STATUS "Thirdpary Library Search path:" ${THIRDPARTY_LIBS_HINTS})

if(BUILD_ENV_MSVC)
    set(QT_PATH "C:/Qt/5.15.2/msvc2019${PLATFORM2}" CACHE PATH "Qt installation directory")
    if(NOT EXISTS ${QT_PATH})
        message("Specify QT_PATH properly")
        return()
    endif()
    set(QT_LIB_PATH ${QT_PATH})
    set(CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH};${QT_PATH}/lib/cmake/")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4251")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4251")
    add_definitions(
        -DVC_EXTRALEAN
        -DNOMINMAX
        -D_USE_MATH_DEFINES
    )
elseif(BUILD_ENV_APPLE)
    set(QT_PATH "~/Qt5.9.2/5.9.2/clang_${PLATFORM}/lib" CACHE PATH "Qt installation directory")
    set(QT_LIB_PATH "${QT_PATH}/")
    set(CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH};${QT_LIB_PATH}cmake/")
    foreach(path ${CMAKE_PREFIX_PATH})
      message("CMAKE_PREFIX_PATH: " ${path})
    endforeach(path)
    add_definitions(
        -DMACOSX
        -Di386
        -D__MACOS__
    )
    if(PLATFORM EQUAL 64)
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64 -std=c++11 -stdlib=libc++ -fno-implicit-templates")
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m64")
    elseif(PLATFORM EQUAL 32)
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32 -std=c++11 -stdlib=libc++ -fno-implicit-templates -D HAS_QUICKDRAW")
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32")
        set(CMAKE_LINKER_FLAGS "${CMAKE_LINKER_FLAGS} -m32")
    else()
        message(FATAL_ERROR "Invalid PLATFORM:" ${PLATFORM} ". 'PLATFORM' must be 32 or 64.")
    endif()
elseif(BUILD_ENV_UNIXLIKE)
    # Needed for correct Qt detection
    cmake_minimum_required(VERSION 2.8.12)
    set(PRELOAD_VARIABLE "LD_LIBRARY_PATH")
    if(CMAKE_SYSTEM_NAME MATCHES "Linux")
        add_definitions(-DLINUX)
    elseif(CMAKE_SYSTEM_NAME MATCHES "Haiku")
        add_definitions(-DHAIKU)
        set(PRELOAD_VARIABLE "LIBRARY_PATH")
    elseif(CMAKE_SYSTEM_NAME MATCHES "^.*BSD$|DragonFly")
        set(BUILD_TARGET_BSD ON)
        add_definitions(-D_BSD_SOURCE -DFREEBSD)
        include_directories("/usr/local/include/")
        message(STATUS "Configuring for BSD system")
    elseif(NOT BUILD_TARGET_WIN)
        message(WARNING "Support for generic Unix (Not Apple or Linux) isn't yet working!")
    endif()

    set(CMAKE_CXX_STANDARD 11)

    find_package(Qt5Widgets)

    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
    if (NOT (CMAKE_CXX_COMPILER_ID STREQUAL "Clang"))
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lstdc++")
    endif()
endif()

add_definitions(
    -DQT_GUI_LIB
    -DQT_NETWORK_LIB
    -DQT_CORE_LIB
    -DQT_SHARED
)

# Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)

if(BUILD_ENV_APPLE)
    set(CMAKE_MACOSX_RPATH ON)
    set(CMAKE_SKIP_BUILD_RPATH FALSE)
    set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
    set(CMAKE_INSTALL_RPATH ${QT_LIB_PATH})
    set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
    set(CMAKE_FIND_FRAMEWORK LAST)
    list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${QT_LIB_PATH}" isSystemDir)
    if("${isSystemDir}" STREQUAL "-1")
        set(CMAKE_INSTALL_RPATH "${QT_LIB_PATH}")
    endif()
endif()

include_directories(
    include
)

# Find the QtWidgets library
find_package(Qt5 REQUIRED
    Core
    Gui
    Network
    OpenGL
    Svg
    Xml
    Script
    Widgets
    PrintSupport
    LinguistTools
    Multimedia
    MultimediaWidgets
    SerialPort
    UiTools
)

set(QT_MINIMUM_VERSION 5.5.0)
if(Qt5Core_VERSION VERSION_LESS QT_MINIMUM_VERSION)
    MESSAGE(FATAL_ERROR "Minimum supported Qt version: ${QT_MINIMUM_VERSION}.
    Installed version: ${Qt5Core_VERSION}")
endif()
unset(QT_MINIMUM_VERSION)

if(BUILD_ENV_MSVC)
    include_directories(
        SYSTEM
        ${SDKROOT}/glut/3.7.6/include
        ${SDKROOT}/zlib-1.2.8
        #${SDKROOT}/LibJPEG/jpeg-9
        ${SDKROOT}/libjpeg-turbo/include
    )
    add_definitions(
        -DGLUT_NO_LIB_PRAGMA
    )
endif()


if(PLATFORM EQUAL 64)
    if(BUILD_ENV_UNIXLIKE)
        find_package(OpenCV REQUIRED)
    else() # Windows and MacOS case
        find_package(OpenCV 4.1 REQUIRED)
    endif()
    #include_directories(
    #    ${SDKROOT}/libjpeg-turbo64/include
    #)
    if(WITH_CANON)
        include_directories(
            ${SDKROOT}/canon/Header
        )
    endif()
endif()

get_target_property(QtCore_location Qt5::Core LOCATION)
get_target_property(QtWidget_location Qt5::Widgets LOCATION)
message(STATUS "Qt Core Location:" ${QtCore_location})

macro(_find_toonz_library OUT_LIB_LIST IN_LIB_LIST)
    set(OUTLIST "")
    foreach(arg ${IN_LIB_LIST})
        unset(COREPATH CACHE)
        # find しても cmake が走るときにはできていないので完全なパス名を生成して返すだけ
        if(BUILD_ENV_APPLE)
            set(LIBPATH "\$<TARGET_FILE:${arg}>")
        else()
            set(LIBPATH ${arg})
        endif()
        set(OUTLIST ${OUTLIST} ${LIBPATH})
    endforeach()
    set(${OUT_LIB_LIST} ${OUTLIST})
endmacro()

set(TNZSTDFX_Location)
set(TFARM_Location)

set(QT_LIB)  # avoid warning

if(BUILD_ENV_MSVC)
    set(MSVC_LIB_VERSION 2015)

    set(GLUT_LIB ${SDKROOT}/glut/3.7.6/lib/glut${PLATFORM}.lib)
    set(GL_LIB opengl32.lib)
    set(Z_LIB
        optimized ${SDKROOT}/zlib-1.2.8/lib/zlib-1.2.8_${MSVC_LIB_VERSION}${PLATFORM2}.lib
        debug ${SDKROOT}/zlib-1.2.8/lib/zlib-1.2.8_${MSVC_LIB_VERSION}${PLATFORM2}d.lib
    )
    #set(JPEG_LIB ${SDKROOT}/LibJPEG/jpeg-9/lib/LibJPEG-9_${MSVC_LIB_VERSION}${PLATFORM2}.lib)
    set(JPEG_LIB ${SDKROOT}/libjpeg-turbo/lib/jpeg-static_${MSVC_LIB_VERSION}${PLATFORM2}.lib)
    set(TURBOJPEG_LIB ${SDKROOT}/libjpeg-turbo/lib/turbojpeg-static_${MSVC_LIB_VERSION}${PLATFORM2}.lib)
    set(TIFF_INCLUDE_DIR ${SDKROOT}/tiff-4.0.3/libtiff)
    set(TIFF_LIB
        optimized ${SDKROOT}/tiff-4.0.3/lib/LibTIFF-4.0.3_${MSVC_LIB_VERSION}${PLATFORM2}.lib
        debug  ${SDKROOT}/tiff-4.0.3/lib/LibTIFF-4.0.3_${MSVC_LIB_VERSION}${PLATFORM2}d.lib
    )
    set(PNG_LIB
        optimized ${SDKROOT}/libpng-1.6.21/lib/libpng16_${MSVC_LIB_VERSION}${PLATFORM2}.lib
        debug  ${SDKROOT}/libpng-1.6.21/lib/libpng16_${MSVC_LIB_VERSION}${PLATFORM2}d.lib
    )
    set(GLEW_LIB ${SDKROOT}/glew/glew-1.9.0/lib/glew${PLATFORM}.lib)
    set(LZ4_LIB ${SDKROOT}/Lz4/Lz4_131/lz4_${PLATFORM}.lib)
    set(SUPERLU_LIB ${SDKROOT}/superlu/SuperLU_${MSVC_LIB_VERSION}_${PLATFORM}.lib)
    set(OPENBLAS_LIB ${SDKROOT}/openblas/libopenblas_${PLATFORM}.lib)
    set(USB_LIB)  # unused
    
    if(PLATFORM EQUAL 32)
        set(QT_LIB ${SDKROOT}/quicktime/QT73SDK/Libraries/QTMLClient.lib)
    endif()
    set(MYPAINT_LIB_INCLUDE_DIRS ${SDKROOT}/libmypaint/dist/${PLATFORM}/include/libmypaint)
    set(MYPAINT_LIB_LDFLAGS ${SDKROOT}/libmypaint/dist/${PLATFORM}/libmypaint.lib)

    if(PLATFORM EQUAL 64)
        if (WITH_CANON)
            set(CANON_LIB ${SDKROOT}/canon/library/EDSDK.lib)
        endif()
    endif()
elseif(BUILD_ENV_APPLE)
    find_library(GLUT_LIB GLUT)
    find_library(GL_LIB OpenGL)
    find_library(Z_LIB z)

    find_package(TIFF REQUIRED)
    set(TIFF_LIB ${TIFF_LIBRARY})
    # the libraries have not .pc nor preferred Find*.cmake. use custom modules.
    find_package(PNG REQUIRED)
    message("******* libpng:" ${PNG_LIBRARY})
    set(PNG_LIB ${PNG_LIBRARY})
    find_package(GLEW)

    find_package(SuperLU REQUIRED)
    set(SUPERLU_INCLUDE_DIR ${SUPERLU_INCLUDE_DIR}/superlu)
    set(SUPERLU_LIB ${SUPERLU_LIBRARY})
    message("SuperLU:" ${SUPERLU_INCLUDE_DIR})

    find_package(JPEG REQUIRED)

    # the libraries have .pc
    find_package(PkgConfig)
    if(GLEW-NOTFOUND)
        pkg_check_modules(GLEW REQUIRED glew)
    endif()
    if (TARGET GLEW::GLEW)
      set(GLEW_LIB GLEW::GLEW)
    else()
      set(GLEW_LIB ${GLEW_LIBRARIES})
    endif()

    pkg_check_modules(LZ4_LIB REQUIRED liblz4)

    message("**************** lz4 lib:" ${LZ4_LIB_INCLUDE_DIRS})
    find_path(LZ4_STATIC lz4frame_static.h PATH ${LZ4_LIB_INCLUDE_DIRS})
    if(LZ4_STATIC-FOUND)
        add_definitions(-DLZ4_STATIC)
    endif()

    pkg_check_modules(USB_LIB REQUIRED libusb-1.0)
    set(OPENBLAS_LIB) # unused?
    if(PLATFORM EQUAL 32)
        find_library(QT_LIB QuickTime)
    endif()

    set(JPEG_LIB ${JPEG_LIBRARY})
    set(LZ4_LIB ${LZ4_LIB_LDFLAGS})

    find_package(LZO REQUIRED)
    message("LZO:" ${LZO_INCLUDE_DIR})

    pkg_check_modules(MYPAINT_LIB REQUIRED libmypaint)

    if(PLATFORM EQUAL 64)
    	pkg_check_modules(TURBOJPEG REQUIRED libturbojpeg)
        find_library(TURBOJPEG_LIB turbojpeg ${TURBOJPEG_LIBRARY_DIRS})
        message("**************** turbojpeg lib:" ${TURBOJPEG_LIB})

        if (WITH_CANON)
            set(CANON_LIB ${SDKROOT}/canon/Framework/EDSDK.framework)
        endif()
    endif()

elseif(BUILD_ENV_UNIXLIKE)
    if(BUILD_TARGET_WIN)
        find_library(GL_LIB opengl32)
        find_library(GLU_LIB glu32)
        find_library(GLUT_LIB NAMES glut freeglut)
    else()
        find_library(GL_LIB GL)
        find_library(GLU_LIB GLU)
        find_library(GLUT_LIB glut)
    endif()
    find_library(Z_LIB z)

    if(NOT BUILD_TARGET_BSD)
        find_package(TIFF REQUIRED)
    endif()
    find_package(PNG REQUIRED)
    set(PNG_LIB ${PNG_LIBRARY})
    message("******* libpng:" ${PNG_LIB})
    find_package(GLEW)

    find_package(SuperLU REQUIRED)
    set(SUPERLU_LIB ${SUPERLU_LIBRARY})

    find_package(JPEG REQUIRED)

    # the libraries have .pc
    find_package(PkgConfig)

    # This is not required for OpenToonz itself, but libtiff will pick it up if
    # present and libimage won't be aware causing linker to fail
    pkg_check_modules(LZMA liblzma)
    set(TIFF_LIB ${TIFF_LIBRARY} ${LZMA_LIBRARIES})

    if(GLEW-NOTFOUND)
        pkg_check_modules(GLEW REQUIRED glew)
    endif()
    set(GLEW_LIB ${GLEW_LIBRARIES})

    pkg_check_modules(LZ4_LIB REQUIRED liblz4)

    message("**************** lz4 lib:" ${LZ4_LIB_INCLUDE_DIRS})
    find_path(LZ4_STATIC lz4frame_static.h PATH ${LZ4_LIB_INCLUDE_DIRS})
    if(LZ4_STATIC-FOUND)
        add_definitions(-DLZ4_STATIC)
    endif()

    # TODO: check for them properly in some sane order with pkg-config
    find_library(OPENBLAS_LIB NAMES cblas gslcblas openblas blas)
    message("OpenBLAS:" ${OPENBLAS_LIB})

    set(JPEG_LIB ${JPEG_LIBRARY})
    set(LZ4_LIB ${LZ4_LIB_LDFLAGS})

    find_package(LZO REQUIRED)
    message("LZO:" ${LZO_INCLUDE_DIR})

    if(BUILD_TARGET_BSD OR HAIKU)
        find_library(EXECINFO_LIBRARY execinfo)
    endif()
    find_library(PTHREAD_LIBRARY pthread)

    if(NOT BUILD_TARGET_WIN)
        pkg_check_modules(USB_LIB REQUIRED libusb-1.0)
        pkg_check_modules(FREETYPE REQUIRED freetype2)
    endif()
    # Can be 'libmypaint' or 'libmypaint-1.x'
    pkg_search_module(MYPAINT_LIB REQUIRED libmypaint libmypaint-1.3>=1.3)
    
    if(PLATFORM EQUAL 64)
        find_library(TURBOJPEG_LIB turbojpeg)
        message("**************** turbojpeg lib:" ${TURBOJPEG_LIB})
    endif()
endif()


include(TestBigEndian)
test_big_endian(_SYSTEM_BIG_ENDIAN)
if(_SYSTEM_BIG_ENDIAN)
    add_definitions(-DTNZ_LITTLE_ENDIAN=0)
else()
    add_definitions(-DTNZ_LITTLE_ENDIAN=1)
endif()
unset(_SYSTEM_BIG_ENDIAN)


set(C_WARNINGS)
set(CXX_WARNINGS)

if(CMAKE_COMPILER_IS_GNUCC)
    ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_WRITE_STRINGS -Wwrite-strings)
    ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_UNDEF -Wundef)
    ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_MISSING_DECLARATIONS -Wmissing-declarations)

    ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_WRITE_STRINGS -Wwrite-strings)
    ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_UNDEF -Wundef)
    ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_MISSING_DECLARATIONS -Wmissing-declarations)
endif()


include_directories(
    SYSTEM
    BEFORE
    ${TIFF_INCLUDE_DIR}
    ${PNG_INCLUDE_DIRS}
)

if(BUILD_ENV_MSVC OR BUILD_ENV_APPLE)
    find_path(
        BOOST_ROOT
            include/boost
            boost
        HINTS
            ${THIRDPARTY_LIBS_HINTS}
        PATH_SUFFIXES
            boost/boost_1_75_0/
            boost/boost_1_74_0/
            boost/boost_1_73_0/
            boost/boost_1_72_0/
    )
    find_package(Boost 1.55 REQUIRED)
else()
    find_package(Boost)
endif()

include_directories(
    SYSTEM
    ${Boost_INCLUDE_DIR}
    ${LZ4_LIB_INCLUDE_DIRS}
    ${USB_LIB_INCLUDE_DIRS}
    ${SUPERLU_INCLUDE_DIR}
    ${JPEG_INCLUDE_DIR}
    ${MYPAINT_LIB_INCLUDE_DIRS}
)

if(PLATFORM EQUAL 64)
    add_definitions(-Dx64)
endif()

if(BUILD_ENV_MSVC)
    # place Toonz.exe and dlls in the same directory
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
    # use secure functions by defaualt
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1")
elseif(BUILD_ENV_APPLE)
    # pass
elseif(BUILD_ENV_UNIXLIKE)
    set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)

    # Mirror relative bin/lib location for installation
    # so the generated shell script works in both cases.
    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib/opentoonz)
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib/opentoonz)
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

    if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
        set(CMAKE_INSTALL_PREFIX "/opt/opentoonz" CACHE PATH "OpenToonz install prefix" FORCE)
    endif()
endif()

if(BUILD_ENV_MSVC AND MSVC_VERSION EQUAL 1800)
    # Visual C++ 2013 cannot handle UTF-8 without BOM
    # Non-ascii characters in comments would not be a problem
    add_compile_options("/wd4819")
endif()

if(WITH_TRANSLATION)
    # generate Qt translations and messages
    set(LANGUAGES japanese italian french spanish chinese german russian korean czech)

    function(add_translation module)
        set(translation)
        foreach(lang ${LANGUAGES})
            set(name "${CMAKE_SOURCE_DIR}/translations/${lang}/${module}.ts")
            list(APPEND translation ${name})
            set_source_files_properties(${name} PROPERTIES
                OUTPUT_LOCATION "${CMAKE_BINARY_DIR}/loc/${lang}"
            )
        endforeach()

        qt5_create_translation(message ${translation} ${ARGN})

        add_custom_target("translation_${module}" DEPENDS ${message})
        set_target_properties("translation_${module}" PROPERTIES
            EXCLUDE_FROM_DEFAULT_BUILD TRUE
        )
    endfunction()
endif()

set(CMAKE_C_FLAGS "${C_WARNINGS} ${CMAKE_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CXX_WARNINGS} ${CMAKE_CXX_FLAGS}")

add_subdirectory(tnzcore)
add_subdirectory(tnzbase)
add_subdirectory(tnzext)
add_subdirectory(toonzlib)
add_subdirectory(toonzfarm/tfarm)
add_subdirectory(stdfx)
add_subdirectory(sound)
add_subdirectory(colorfx)
add_subdirectory(image)
add_subdirectory(toonzqt)
add_subdirectory(tnztools)

add_subdirectory(${SDKROOT}/lzo/driver lzodriver)

add_subdirectory(toonz)
add_subdirectory(tcleanupper)
add_subdirectory(tcomposer)
add_subdirectory(tconverter)
add_subdirectory(toonzfarm)

if(BUILD_ENV_APPLE)
    add_subdirectory(mousedragfilter)
endif()

if((PLATFORM EQUAL 32) AND ((BUILD_TARGET_WIN AND BUILD_ENV_MSVC) OR BUILD_TARGET_APPLE))
    add_subdirectory(t32bitsrv)
endif()

if(BUILD_ENV_APPLE)
    add_custom_command(TARGET executable
        POST_BUILD COMMAND
        ${CMAKE_INSTALL_NAME_TOOL} -add_rpath ${CMAKE_INSTALL_RPATH}
        $<TARGET_FILE:executable>
    )
    # add capability for retina displays
    set_target_properties(OpenToonz PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/../cmake/BundleInfo.plist.in)
endif()

if(BUILD_ENV_UNIXLIKE AND NOT BUILD_TARGET_WIN)
    add_subdirectory(xdg-data)
endif()