aboutsummaryrefslogtreecommitdiff
path: root/scripts/ports.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/ports.cmake')
-rw-r--r--scripts/ports.cmake85
1 files changed, 85 insertions, 0 deletions
diff --git a/scripts/ports.cmake b/scripts/ports.cmake
new file mode 100644
index 000000000..51afc8d61
--- /dev/null
+++ b/scripts/ports.cmake
@@ -0,0 +1,85 @@
+cmake_minimum_required(VERSION 3.5)
+get_filename_component(VCPKG_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR} DIRECTORY)
+
+string(REGEX REPLACE "([^-]*)-([^-]*)" "\\1" TRIPLET_SYSTEM_ARCH ${TARGET_TRIPLET})
+string(REGEX REPLACE "([^-]*)-([^-]*)" "\\2" TRIPLET_SYSTEM_NAME ${TARGET_TRIPLET})
+
+if(NOT EXISTS ${VCPKG_ROOT_DIR}/triplets/${TARGET_TRIPLET}.cmake)
+ message(FATAL_ERROR "Unsupported target triplet. Toolchain file does not exist: ${VCPKG_ROOT_DIR}/triplets/${TARGET_TRIPLET}.cmake")
+endif()
+
+set(CMAKE_TOOLCHAIN_FILE ${VCPKG_ROOT_DIR}/triplets/${TARGET_TRIPLET}.cmake)
+list(APPEND CMAKE_MODULE_PATH ${VCPKG_ROOT_DIR}/scripts/cmake)
+set(CURRENT_INSTALLED_DIR ${VCPKG_ROOT_DIR}/installed/${TARGET_TRIPLET} CACHE PATH "Location to install final packages")
+set(DOWNLOADS ${VCPKG_ROOT_DIR}/downloads CACHE PATH "Location to download sources and tools")
+set(PACKAGES_DIR ${VCPKG_ROOT_DIR}/packages CACHE PATH "Location to store package images")
+set(BUILDTREES_DIR ${VCPKG_ROOT_DIR}/buildtrees CACHE PATH "Location to perform actual extract+config+build")
+
+if(PORT)
+ set(CURRENT_BUILDTREES_DIR ${BUILDTREES_DIR}/${PORT})
+ set(CURRENT_PACKAGES_DIR ${PACKAGES_DIR}/${PORT}_${TARGET_TRIPLET})
+endif()
+
+macro(debug_message)
+ if(DEFINED PORT_DEBUG AND PORT_DEBUG)
+ message(STATUS "[DEBUG] ${ARGN}")
+ endif()
+endmacro()
+
+if(CMD MATCHES "^SCAFFOLD$")
+ if(EXISTS ports/${PORT}/portfile.cmake)
+ message(FATAL_ERROR "Portfile already exists: '${VCPKG_ROOT_DIR}/ports/${PORT}/portfile.cmake'")
+ endif()
+ if(NOT FILENAME)
+ get_filename_component(FILENAME "${URL}" NAME)
+ endif()
+ string(REGEX REPLACE "(\\.(zip|gz|tar|tgz|bz2))+\$" "" ROOT_NAME ${FILENAME})
+ if(EXISTS ${DOWNLOADS}/${FILENAME})
+ message(STATUS "Using pre-downloaded: ${DOWNLOADS}/${FILENAME}")
+ message(STATUS "If this is not desired, delete the file and ${VCPKG_ROOT_DIR}/ports/${PORT}/portfile.cmake")
+ else()
+ include(vcpkg_download_distfile)
+ file(DOWNLOAD ${URL} ${DOWNLOADS}/${FILENAME} STATUS error_code)
+ if(NOT error_code MATCHES "0;")
+ message(FATAL_ERROR "Error downloading file: ${error_code}")
+ endif()
+ endif()
+ file(MD5 ${DOWNLOADS}/${FILENAME} MD5)
+
+ file(MAKE_DIRECTORY ports/${PORT})
+ configure_file(scripts/templates/portfile.in.cmake ports/${PORT}/portfile.cmake @ONLY)
+
+ message(STATUS "Generated portfile: ${VCPKG_ROOT_DIR}/ports/${PORT}/portfile.cmake")
+elseif(CMD MATCHES "^BUILD$")
+ if(NOT DEFINED CURRENT_PORT_DIR)
+ message(FATAL_ERROR "CURRENT_PORT_DIR was not defined")
+ endif()
+ set(TO_CMAKE_PATH "${CURRENT_PORT_DIR}" CURRENT_PORT_DIR)
+ if(NOT EXISTS ${CURRENT_PORT_DIR})
+ message(FATAL_ERROR "Cannot find port: ${PORT}\n Directory does not exist: ${CURRENT_PORT_DIR}")
+ endif()
+ if(NOT EXISTS ${CURRENT_PORT_DIR}/portfile.cmake)
+ message(FATAL_ERROR "Port is missing portfile: ${CURRENT_PORT_DIR}/portfile.cmake")
+ endif()
+ if(NOT EXISTS ${CURRENT_PORT_DIR}/CONTROL)
+ message(FATAL_ERROR "Port is missing control file: ${CURRENT_PORT_DIR}/CONTROL")
+ endif()
+
+ message(STATUS "CURRENT_INSTALLED_DIR=${CURRENT_INSTALLED_DIR}")
+ message(STATUS "DOWNLOADS=${DOWNLOADS}")
+
+ message(STATUS "CURRENT_PACKAGES_DIR=${CURRENT_PACKAGES_DIR}")
+ message(STATUS "CURRENT_BUILDTREES_DIR=${CURRENT_BUILDTREES_DIR}")
+ message(STATUS "CURRENT_PORT_DIR=${CURRENT_PORT_DIR}")
+
+ unset(PACKAGES_DIR)
+ unset(BUILDTREES_DIR)
+
+ file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR})
+ if(EXISTS ${CURRENT_PACKAGES_DIR})
+ message(FATAL_ERROR "Unable to remove directory: ${CURRENT_PACKAGES_DIR}\n Files are likely in use.")
+ endif()
+ file(MAKE_DIRECTORY ${CURRENT_BUILDTREES_DIR} ${CURRENT_PACKAGES_DIR})
+
+ include(${CURRENT_PORT_DIR}/portfile.cmake)
+endif()