diff --git a/CMakeLists.txt b/CMakeLists.txt index 7dbeddce..03968f5a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,51 +9,24 @@ endif() if(MSVC14) set(CMAKE_GENERATOR_TOOLSET "v140_xp" CACHE STRING "Name of generator toolset." FORCE) endif() +if(APPLE) + set(CMAKE_MACOSX_RPATH 1) +endif() set(_3DSTOOL_MAJOR 1) set(_3DSTOOL_MINOR 0) set(_3DSTOOL_PATCHLEVEL 19) -if(UNIX) +if(NOT MSVC AND NOT XCODE_VERSION AND NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel." FORCE) endif() option(BUILD64 "Build x86_64(unix only)" ON) set(CMAKE_INSTALL_PREFIX "${PROJECT_SOURCE_DIR}") set(ROOT_SOURCE_DIR "${PROJECT_SOURCE_DIR}") -if(WIN32) - if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(COMMON_INCLUDE_DIR "${ROOT_SOURCE_DIR}/dep/include/windows_x86_64") - if(MSVC14) - set(COMMON_LIBRARY_DIR "${ROOT_SOURCE_DIR}/dep/lib/windows_x86_64_msvc14") - else() - set(COMMON_LIBRARY_DIR "${ROOT_SOURCE_DIR}/dep/lib/windows_x86_64") - endif() - else() - set(COMMON_INCLUDE_DIR "${ROOT_SOURCE_DIR}/dep/include/windows_x86_32") - if(MSVC14) - set(COMMON_LIBRARY_DIR "${ROOT_SOURCE_DIR}/dep/lib/windows_x86_32_msvc14") - else() - set(COMMON_LIBRARY_DIR "${ROOT_SOURCE_DIR}/dep/lib/windows_x86_32") - endif() - endif() -elseif(APPLE) - if(BUILD64) - set(COMMON_INCLUDE_DIR "${ROOT_SOURCE_DIR}/dep/include/macos_x86_64") - set(COMMON_LIBRARY_DIR "${ROOT_SOURCE_DIR}/dep/lib/macos_x86_64") - else() - set(COMMON_INCLUDE_DIR "${ROOT_SOURCE_DIR}/dep/include/macos_x86_32") - set(COMMON_LIBRARY_DIR "${ROOT_SOURCE_DIR}/dep/lib/macos_x86_32") - endif() -elseif(NOT CYGWIN) - if(BUILD64) - set(COMMON_INCLUDE_DIR "${ROOT_SOURCE_DIR}/dep/include/linux_x86_64") - set(COMMON_LIBRARY_DIR "${ROOT_SOURCE_DIR}/dep/lib/linux_x86_64") - else() - set(COMMON_INCLUDE_DIR "${ROOT_SOURCE_DIR}/dep/include/linux_x86_32") - set(COMMON_LIBRARY_DIR "${ROOT_SOURCE_DIR}/dep/lib/linux_x86_32") - endif() -endif() set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${ROOT_SOURCE_DIR}/cmake") +include(AddDep) include(AddTarget) include(AutoFiles) +ADD_DEP_INCLUDE_DIR("${ROOT_SOURCE_DIR}/dep") +ADD_DEP_LIBRARY_DIR("${ROOT_SOURCE_DIR}/dep") if(UNIX) if(CYGWIN) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11") @@ -68,7 +41,7 @@ if(UNIX) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32") endif() endif() -if(WIN32) +if(MSVC OR XCODE_VERSION) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/bin") else() set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/bin/${CMAKE_BUILD_TYPE}") @@ -81,5 +54,7 @@ else() if(NOT APPLE) add_definitions(-Wno-multichar -Wno-unused-result) endif() + set(CMAKE_INSTALL_RPATH .) + set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) endif() add_subdirectory(src) diff --git a/cmake/AddDep.cmake b/cmake/AddDep.cmake new file mode 100644 index 00000000..06a5bcbc --- /dev/null +++ b/cmake/AddDep.cmake @@ -0,0 +1,209 @@ +function(GET_CURRENT_DEP_INCLUDE_PREFIX FOLDER) + set(INCLUDE_PREFIX) + if(WIN32) + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + if(MSVC14) + if(EXISTS "${FOLDER}/include/windows_x86_64_msvc14") + set(INCLUDE_PREFIX "include/windows_x86_64_msvc14") + elseif(EXISTS "${FOLDER}/include/windows_x86_64") + set(INCLUDE_PREFIX "include/windows_x86_64") + elseif(EXISTS "${FOLDER}/include/windows") + set(INCLUDE_PREFIX "include/windows") + elseif(EXISTS "${FOLDER}/include") + set(INCLUDE_PREFIX "include") + else() + set(INCLUDE_PREFIX ".") + endif() + else() + if(EXISTS "${FOLDER}/include/windows_x86_64") + set(INCLUDE_PREFIX "include/windows_x86_64") + elseif(EXISTS "${FOLDER}/include/windows") + set(INCLUDE_PREFIX "include/windows") + elseif(EXISTS "${FOLDER}/include") + set(INCLUDE_PREFIX "include") + else() + set(INCLUDE_PREFIX ".") + endif() + endif() + else() + if(MSVC14) + if(EXISTS "${FOLDER}/include/windows_x86_32_msvc14") + set(INCLUDE_PREFIX "include/windows_x86_32_msvc14") + elseif(EXISTS "${FOLDER}/include/windows_x86_32") + set(INCLUDE_PREFIX "include/windows_x86_32") + elseif(EXISTS "${FOLDER}/include/windows") + set(INCLUDE_PREFIX "include/windows") + elseif(EXISTS "${FOLDER}/include") + set(INCLUDE_PREFIX "include") + else() + set(INCLUDE_PREFIX ".") + endif() + else() + if(EXISTS "${FOLDER}/include/windows_x86_32") + set(INCLUDE_PREFIX "include/windows_x86_32") + elseif(EXISTS "${FOLDER}/include/windows") + set(INCLUDE_PREFIX "include/windows") + elseif(EXISTS "${FOLDER}/include") + set(INCLUDE_PREFIX "include") + else() + set(INCLUDE_PREFIX ".") + endif() + endif() + endif() + elseif(APPLE) + if(BUILD64) + if(EXISTS "${FOLDER}/include/macos_x86_64") + set(INCLUDE_PREFIX "include/macos_x86_64") + elseif(EXISTS "${FOLDER}/include/macos") + set(INCLUDE_PREFIX "include/macos") + elseif(EXISTS "${FOLDER}/include") + set(INCLUDE_PREFIX "include") + else() + set(INCLUDE_PREFIX ".") + endif() + else() + if(EXISTS "${FOLDER}/include/macos_x86_32") + set(INCLUDE_PREFIX "include/macos_x86_32") + elseif(EXISTS "${FOLDER}/include/macos") + set(INCLUDE_PREFIX "include/macos") + elseif(EXISTS "${FOLDER}/include") + set(INCLUDE_PREFIX "include") + else() + set(INCLUDE_PREFIX ".") + endif() + endif() + else() + if(BUILD64) + if(EXISTS "${FOLDER}/include/linux_x86_64") + set(INCLUDE_PREFIX "include/linux_x86_64") + elseif(EXISTS "${FOLDER}/include/linux") + set(INCLUDE_PREFIX "include/linux") + elseif(EXISTS "${FOLDER}/include") + set(INCLUDE_PREFIX "include") + else() + set(INCLUDE_PREFIX ".") + endif() + else() + if(EXISTS "${FOLDER}/include/linux_x86_32") + set(INCLUDE_PREFIX "include/linux_x86_32") + elseif(EXISTS "${FOLDER}/include/linux") + set(INCLUDE_PREFIX "include/linux") + elseif(EXISTS "${FOLDER}/include") + set(INCLUDE_PREFIX "include") + else() + set(INCLUDE_PREFIX ".") + endif() + endif() + endif() + set(CURRENT_DEP_INCLUDE_PREFIX ${CURRENT_DEP_INCLUDE_PREFIX} ${INCLUDE_PREFIX} PARENT_SCOPE) +endfunction() + +function(ADD_DEP_INCLUDE_DIR FOLDER) + GET_CURRENT_DEP_INCLUDE_PREFIX(${FOLDER}) + set(DEP_INCLUDE_DIR ${DEP_INCLUDE_DIR} "${FOLDER}/${CURRENT_DEP_INCLUDE_PREFIX}" PARENT_SCOPE) +endfunction() + +function(GET_CURRENT_DEP_LIBRARY_PREFIX FOLDER) + set(LIBRARY_PREFIX) + if(WIN32) + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + if(MSVC14) + if(EXISTS "${FOLDER}/lib/windows_x86_64_msvc14") + set(LIBRARY_PREFIX "lib/windows_x86_64_msvc14") + elseif(EXISTS "${FOLDER}/lib/windows_x86_64") + set(LIBRARY_PREFIX "lib/windows_x86_64") + elseif(EXISTS "${FOLDER}/lib/windows") + set(LIBRARY_PREFIX "lib/windows") + elseif(EXISTS "${FOLDER}/lib") + set(LIBRARY_PREFIX "lib") + else() + set(LIBRARY_PREFIX ".") + endif() + else() + if(EXISTS "${FOLDER}/lib/windows_x86_64") + set(LIBRARY_PREFIX "lib/windows_x86_64") + elseif(EXISTS "${FOLDER}/lib/windows") + set(LIBRARY_PREFIX "lib/windows") + elseif(EXISTS "${FOLDER}/lib") + set(LIBRARY_PREFIX "lib") + else() + set(LIBRARY_PREFIX ".") + endif() + endif() + else() + if(MSVC14) + if(EXISTS "${FOLDER}/lib/windows_x86_32_msvc14") + set(LIBRARY_PREFIX "lib/windows_x86_32_msvc14") + elseif(EXISTS "${FOLDER}/lib/windows_x86_32") + set(LIBRARY_PREFIX "lib/windows_x86_32") + elseif(EXISTS "${FOLDER}/lib/windows") + set(LIBRARY_PREFIX "lib/windows") + elseif(EXISTS "${FOLDER}/lib") + set(LIBRARY_PREFIX "lib") + else() + set(LIBRARY_PREFIX ".") + endif() + else() + if(EXISTS "${FOLDER}/lib/windows_x86_32") + set(LIBRARY_PREFIX "lib/windows_x86_32") + elseif(EXISTS "${FOLDER}/lib/windows") + set(LIBRARY_PREFIX "lib/windows") + elseif(EXISTS "${FOLDER}/lib") + set(LIBRARY_PREFIX "lib") + else() + set(LIBRARY_PREFIX ".") + endif() + endif() + endif() + elseif(APPLE) + if(BUILD64) + if(EXISTS "${FOLDER}/lib/macos_x86_64") + set(LIBRARY_PREFIX "lib/macos_x86_64") + elseif(EXISTS "${FOLDER}/lib/macos") + set(LIBRARY_PREFIX "lib/macos") + elseif(EXISTS "${FOLDER}/lib") + set(LIBRARY_PREFIX "lib") + else() + set(LIBRARY_PREFIX ".") + endif() + else() + if(EXISTS "${FOLDER}/lib/macos_x86_32") + set(LIBRARY_PREFIX "lib/macos_x86_32") + elseif(EXISTS "${FOLDER}/lib/macos") + set(LIBRARY_PREFIX "lib/macos") + elseif(EXISTS "${FOLDER}/lib") + set(LIBRARY_PREFIX "lib") + else() + set(LIBRARY_PREFIX ".") + endif() + endif() + else() + if(BUILD64) + if(EXISTS "${FOLDER}/lib/linux_x86_64") + set(LIBRARY_PREFIX "lib/linux_x86_64") + elseif(EXISTS "${FOLDER}/lib/linux") + set(LIBRARY_PREFIX "lib/linux") + elseif(EXISTS "${FOLDER}/lib") + set(LIBRARY_PREFIX "lib") + else() + set(LIBRARY_PREFIX ".") + endif() + else() + if(EXISTS "${FOLDER}/lib/linux_x86_32") + set(LIBRARY_PREFIX "lib/linux_x86_32") + elseif(EXISTS "${FOLDER}/lib/linux") + set(LIBRARY_PREFIX "lib/linux") + elseif(EXISTS "${FOLDER}/lib") + set(LIBRARY_PREFIX "lib") + else() + set(LIBRARY_PREFIX ".") + endif() + endif() + endif() + set(CURRENT_DEP_LIBRARY_PREFIX ${CURRENT_DEP_LIBRARY_PREFIX} ${LIBRARY_PREFIX} PARENT_SCOPE) +endfunction() + +function(ADD_DEP_LIBRARY_DIR FOLDER) + GET_CURRENT_DEP_LIBRARY_PREFIX(${FOLDER}) + set(DEP_LIBRARY_DIR ${DEP_LIBRARY_DIR} "${FOLDER}/${CURRENT_DEP_LIBRARY_PREFIX}" PARENT_SCOPE) +endfunction() diff --git a/cmake/AddTarget.cmake b/cmake/AddTarget.cmake index d86ff43b..f8b7d3f5 100644 --- a/cmake/AddTarget.cmake +++ b/cmake/AddTarget.cmake @@ -1,17 +1,14 @@ function(ADD_SHARED NAME SOURCE) add_library(${NAME} SHARED ${SOURCE}) - set_target_properties(${NAME} PROPERTIES - DEBUG_POSTFIX "_d") + set_target_properties(${NAME} PROPERTIES DEBUG_POSTFIX "_d") endfunction() function(ADD_STATIC NAME SOURCE) add_library(${NAME} STATIC ${SOURCE}) - set_target_properties(${NAME} PROPERTIES - DEBUG_POSTFIX "_d") + set_target_properties(${NAME} PROPERTIES DEBUG_POSTFIX "_d") endfunction() function(ADD_EXE NAME SOURCE) add_executable(${NAME} ${SOURCE}) - set_target_properties(${NAME} PROPERTIES - DEBUG_POSTFIX "_d") + set_target_properties(${NAME} PROPERTIES DEBUG_POSTFIX "_d") endfunction() diff --git a/cmake/AutoFiles.cmake b/cmake/AutoFiles.cmake index d4fe0188..e629419b 100644 --- a/cmake/AutoFiles.cmake +++ b/cmake/AutoFiles.cmake @@ -1,28 +1,38 @@ function(AUTO_FILES FOLDER FILTER PATTERN) + get_filename_component(FOLDER "${FOLDER}" ABSOLUTE) + file(RELATIVE_PATH FOLDER "${CMAKE_CURRENT_SOURCE_DIR}" "${FOLDER}") + if("${FOLDER}" STREQUAL "") + set(FOLDER ".") + endif() if(ARGC GREATER 3) set(AUTO_FILES_EXCLUDE ${ARGN}) else() set(AUTO_FILES_EXCLUDE) endif() - file(GLOB AUTO_FILES_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "${FOLDER}/*") + file(GLOB AUTO_FILES_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${FOLDER}/*") set(AUTO_FILES_FOLDER_FILES) foreach(AUTO_FILES_FILE ${AUTO_FILES_FILES}) if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${AUTO_FILES_FILE}") - AUTO_FILES(${AUTO_FILES_FILE} ${FILTER} ${PATTERN} ${AUTO_FILES_EXCLUDE}) + AUTO_FILES("${AUTO_FILES_FILE}" "${FILTER}" "${PATTERN}" ${AUTO_FILES_EXCLUDE}) elseif("${AUTO_FILES_FILE}" MATCHES "${PATTERN}") if(NOT AUTO_FILES_EXCLUDE) - list(APPEND AUTO_FILES_FOLDER_FILES ${AUTO_FILES_FILE}) + list(APPEND AUTO_FILES_FOLDER_FILES "${AUTO_FILES_FILE}") elseif(NOT "${AUTO_FILES_FILE}" MATCHES "${AUTO_FILES_EXCLUDE}") - list(APPEND AUTO_FILES_FOLDER_FILES ${AUTO_FILES_FILE}) + list(APPEND AUTO_FILES_FOLDER_FILES "${AUTO_FILES_FILE}") endif() endif() endforeach() - string(REPLACE "./" "" AUTO_FILES_FILTER ${FOLDER}) - string(REPLACE "/" "\\" AUTO_FILES_FILTER ${AUTO_FILES_FILTER}) + string(REPLACE "../" "..\\" AUTO_FILES_FILTER "${FOLDER}") + string(REPLACE "./" "" AUTO_FILES_FILTER "${AUTO_FILES_FILTER}") + string(REPLACE "/" "\\" AUTO_FILES_FILTER "${AUTO_FILES_FILTER}") + string(REPLACE "..\\" "../" AUTO_FILES_FILTER "${AUTO_FILES_FILTER}") + if("${AUTO_FILES_FILTER}" STREQUAL "../") + set(AUTO_FILES_FILTER "..") + endif() if("${AUTO_FILES_FILTER}" STREQUAL ".") - source_group(${FILTER} FILES ${AUTO_FILES_FOLDER_FILES}) + source_group("${FILTER}" FILES ${AUTO_FILES_FOLDER_FILES}) else() - source_group(${FILTER}\\${AUTO_FILES_FILTER} FILES ${AUTO_FILES_FOLDER_FILES}) + source_group("${FILTER}\\${AUTO_FILES_FILTER}" FILES ${AUTO_FILES_FOLDER_FILES}) endif() set(src ${src} ${AUTO_FILES_FOLDER_FILES} PARENT_SCOPE) endfunction() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a94c184f..10f23b90 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,7 +1,7 @@ AUTO_FILES(".." "src" "README\\.md") AUTO_FILES("." "src" "\\.(cpp|h)$") -include_directories(${COMMON_INCLUDE_DIR}) -link_directories(${COMMON_LIBRARY_DIR}) +include_directories(${DEP_INCLUDE_DIR}) +link_directories(${DEP_LIBRARY_DIR}) add_definitions(-DCURL_STATICLIB) if(WIN32) set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd") diff --git a/src/utility.h b/src/utility.h index 69140840..67460260 100644 --- a/src/utility.h +++ b/src/utility.h @@ -118,10 +118,10 @@ typedef uint64_t u64; #endif #if _3DSTOOL_COMPILER_VERSION < 1600 typedef wchar_t Char16_t; -typedef std::wstring U16String; +typedef wstring U16String; #elif _3DSTOOL_COMPILER_VERSION >= 1900 typedef u16 Char16_t; -typedef std::basic_string U16String; +typedef basic_string U16String; #else typedef char16_t Char16_t; typedef u16string U16String;