From 692fe1f3ffc8f4364b39c14aa7d90cec2ff5c0a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20K=C3=A4fer?= Date: Fri, 3 Jun 2016 18:05:04 +0200 Subject: [PATCH] [build] switch to CMake This is very much a work in progress. --- .gitignore | 1 + .mason | 2 +- .travis.yml | 69 +-- CMakeLists.txt | 53 ++ Makefile | 413 +++++++--------- benchmark/benchmark.gypi | 87 ---- bin/glfw.gypi | 61 --- bin/offline.gypi | 40 -- bin/render.gypi | 40 -- binding.gyp | 107 ---- cmake/core-files.cmake | 465 ++++++++++++++++++ cmake/core.cmake | 52 ++ cmake/glfw.cmake | 27 + cmake/loop-darwin.cmake | 18 + cmake/loop-uv.cmake | 19 + cmake/mason.cmake | 117 +++++ cmake/mbgl.cmake | 50 ++ cmake/node.cmake | 52 ++ cmake/npm.cmake | 20 + cmake/offline.cmake | 21 + cmake/render.cmake | 21 + cmake/shaders.cmake | 29 ++ cmake/test-files.cmake | 100 ++++ cmake/test.cmake | 35 ++ configure | 140 ------ docker/Dockerfile | 2 +- .../george-edison55-precise-backports.gpg.key | 13 + docker/george-edison55-precise-backports.list | 2 + docker/launchpad.gpg.key | 13 - docker/llvm-snapshot.gpg.key | 52 -- docker/llvm.list | 2 - docker/ubuntu-toolchain-r.gpg.key | 13 + docker/ubuntu-toolchain-r.list | 2 +- mbgl.gypi | 341 ------------- package.json | 5 +- platform/android/bitrise.yml | 2 +- platform/android/platform.gyp | 166 ------- platform/android/scripts/configure.sh | 22 - platform/ios/WorkspaceSettings.xcsettings | 10 +- platform/ios/bitrise.yml | 1 + platform/ios/config.cmake | 60 +++ platform/ios/ios.xcodeproj/project.pbxproj | 88 +--- .../ios.xcworkspace/contents.xcworkspacedata | 2 +- platform/ios/platform.gyp | 149 ------ platform/ios/scripts/configure.sh | 17 - platform/ios/scripts/package.sh | 8 +- platform/ios/toolchain.cmake | 136 +++++ platform/linux/config.cmake | 105 ++++ platform/linux/ninja | Bin 0 -> 175240 bytes platform/linux/platform.gyp | 125 ----- platform/linux/scripts/configure.sh | 33 -- platform/macos/WorkspaceSettings.xcsettings | 10 +- platform/macos/bitrise.yml | 1 + platform/macos/config.cmake | 113 +++++ .../macos/macos.xcodeproj/project.pbxproj | 78 ++- .../contents.xcworkspacedata | 2 +- .../xcschemes/mbgl-offline.xcscheme | 92 ---- platform/macos/ninja | Bin 0 -> 171356 bytes platform/macos/platform.gyp | 104 ---- platform/macos/scripts/configure.sh | 21 - platform/macos/scripts/create_scheme.sh | 40 ++ .../executable.xcscheme} | 44 +- .../library.xcscheme} | 48 +- platform/macos/scripts/macostest.xcscheme | 56 --- .../{node => macos}/scripts/node.xcscheme | 26 +- platform/macos/scripts/package.sh | 2 +- platform/node/bitrise.yml | 1 + platform/node/scripts/create_node_scheme.sh | 8 - platform/qt/app/qmapboxgl.gypi | 58 --- platform/qt/bitrise-qt4.yml | 1 + platform/qt/bitrise-qt5.yml | 1 + platform/qt/platform.gyp | 237 --------- platform/qt/qmlapp/qquickmapboxgl.gypi | 60 --- platform/qt/qt.gypi | 20 - platform/qt/scripts/configure.sh | 92 ---- scripts/clang-tools.sh | 6 +- scripts/generate-core-files.sh | 20 + scripts/generate-test-files.sh | 20 + scripts/travis_setup.sh | 4 + test/src/main.cpp | 15 + test/src/mbgl/test/util.cpp | 17 +- test/src/mbgl/test/util.hpp | 2 +- test/test.gypi | 169 ------- 83 files changed, 2009 insertions(+), 2767 deletions(-) create mode 100644 CMakeLists.txt delete mode 100644 benchmark/benchmark.gypi delete mode 100644 bin/glfw.gypi delete mode 100644 bin/offline.gypi delete mode 100644 bin/render.gypi delete mode 100644 binding.gyp create mode 100644 cmake/core-files.cmake create mode 100644 cmake/core.cmake create mode 100644 cmake/glfw.cmake create mode 100644 cmake/loop-darwin.cmake create mode 100644 cmake/loop-uv.cmake create mode 100644 cmake/mason.cmake create mode 100644 cmake/mbgl.cmake create mode 100644 cmake/node.cmake create mode 100644 cmake/npm.cmake create mode 100644 cmake/offline.cmake create mode 100644 cmake/render.cmake create mode 100644 cmake/shaders.cmake create mode 100644 cmake/test-files.cmake create mode 100644 cmake/test.cmake delete mode 100755 configure create mode 100644 docker/george-edison55-precise-backports.gpg.key create mode 100644 docker/george-edison55-precise-backports.list delete mode 100644 docker/launchpad.gpg.key delete mode 100644 docker/llvm-snapshot.gpg.key delete mode 100644 docker/llvm.list create mode 100644 docker/ubuntu-toolchain-r.gpg.key delete mode 100644 mbgl.gypi delete mode 100644 platform/android/platform.gyp delete mode 100644 platform/android/scripts/configure.sh create mode 100644 platform/ios/config.cmake delete mode 100644 platform/ios/platform.gyp delete mode 100644 platform/ios/scripts/configure.sh create mode 100644 platform/ios/toolchain.cmake create mode 100644 platform/linux/config.cmake create mode 100755 platform/linux/ninja delete mode 100644 platform/linux/platform.gyp delete mode 100644 platform/linux/scripts/configure.sh create mode 100644 platform/macos/config.cmake delete mode 100644 platform/macos/macos.xcworkspace/xcshareddata/xcschemes/mbgl-offline.xcscheme create mode 100755 platform/macos/ninja delete mode 100644 platform/macos/platform.gyp delete mode 100644 platform/macos/scripts/configure.sh create mode 100755 platform/macos/scripts/create_scheme.sh rename platform/macos/{macos.xcworkspace/xcshareddata/xcschemes/test.xcscheme => scripts/executable.xcscheme} (68%) rename platform/macos/{macos.xcworkspace/xcshareddata/xcschemes/mbgl-render.xcscheme => scripts/library.xcscheme} (59%) delete mode 100644 platform/macos/scripts/macostest.xcscheme rename platform/{node => macos}/scripts/node.xcscheme (79%) delete mode 100755 platform/node/scripts/create_node_scheme.sh delete mode 100644 platform/qt/app/qmapboxgl.gypi delete mode 100644 platform/qt/platform.gyp delete mode 100644 platform/qt/qmlapp/qquickmapboxgl.gypi delete mode 100644 platform/qt/qt.gypi delete mode 100644 platform/qt/scripts/configure.sh create mode 100755 scripts/generate-core-files.sh create mode 100755 scripts/generate-test-files.sh delete mode 100644 test/test.gypi diff --git a/.gitignore b/.gitignore index 16fd24510..626ee2a3a 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,4 @@ xcuserdata /platform/ios/benchmark/assets/tiles/mapbox.mapbox-terrain-v2,mapbox.mapbox-streets-v6 **/token /platform/macos/macos.xcworkspace/xcshareddata/macos.xcscmblueprint +/platform/ios/pkg diff --git a/.mason b/.mason index fc590c762..3ddc419c0 160000 --- a/.mason +++ b/.mason @@ -1 +1 @@ -Subproject commit fc590c762474eae5bb78c3c825247face0aed9aa +Subproject commit 3ddc419c01ba94f3122dda05e8ec83dac1f27b02 diff --git a/.travis.yml b/.travis.yml index 211a6f9f8..8dda5e5e2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,31 +5,32 @@ git: addons_shortcuts: addons_clang35: &clang35 apt: - sources: [ 'ubuntu-toolchain-r-test' ] - packages: [ 'clang-3.5', 'libstdc++-4.9-dev', 'libstdc++6', 'libllvm3.4', + sources: [ 'ubuntu-toolchain-r-test', 'george-edison55-precise-backports' ] + packages: [ 'clang-3.5', 'libstdc++-4.9-dev', 'libstdc++6', 'libllvm3.4', 'cmake', 'cmake-data', 'mesa-utils', 'libxi-dev', 'libglu1-mesa-dev', 'x11proto-randr-dev', 'x11proto-xext-dev', 'libxrandr-dev', 'x11proto-xf86vidmode-dev', 'libxxf86vm-dev', 'libxcursor-dev', 'libxinerama-dev' ] addons_gcc5: &gcc5 apt: - sources: [ 'ubuntu-toolchain-r-test' ] - packages: [ 'gdb', 'g++-5', 'gcc-5', + sources: [ 'ubuntu-toolchain-r-test', 'george-edison55-precise-backports' ] + packages: [ 'gdb', 'g++-5', 'gcc-5', 'cmake', 'cmake-data', 'mesa-utils', 'libxi-dev', 'libglu1-mesa-dev', 'x11proto-randr-dev', 'x11proto-xext-dev', 'libxrandr-dev', 'x11proto-xf86vidmode-dev', 'libxxf86vm-dev', 'libxcursor-dev', 'libxinerama-dev' ] addons_qt4: &qt4 apt: - sources: [ 'ubuntu-toolchain-r-test' ] - packages: [ 'g++-5', 'gcc-5', 'libjemalloc-dev', + sources: [ 'ubuntu-toolchain-r-test', 'george-edison55-precise-backports' ] + packages: [ 'g++-5', 'gcc-5', 'libjemalloc-dev', 'cmake', 'cmake-data', 'mesa-utils', 'qt4-default' ] addons_qt5: &qt5 apt: - sources: [ 'ubuntu-toolchain-r-test' ] - packages: [ 'g++-5', 'gcc-5', + sources: [ 'ubuntu-toolchain-r-test', 'george-edison55-precise-backports' ] + packages: [ 'g++-5', 'gcc-5', 'cmake', 'cmake-data', 'mesa-utils', 'libc6-dbg', 'qt5-default', 'libqt5opengl5-dev', 'qtdeclarative5-dev', 'qtpositioning5-dev', 'qtlocation5-dev' ] env: global: - TERM: dumb - CCACHE: 1 + - CCACHE_MAXSIZE: 384M # AWS - secure: "MZHblLZXG/jWf2w0ZFlxCLDwx2qtGgRDODQyg1BR7JIuMz6AtWv8XR/sUczWLbiABCL0a/NzJF1g4v2pI7X69IntcjOdIABBgTh7++6+1TJ0Kp8viEltb55nQG3lHy/R6fOaI7Pj9tuCX0PCRtGA5C/fGnodLGEjy3RVOJ09ln0=" - secure: "KaSQbhgjtV7ZCkesHmvrNsbQVjk5SPfGKB1VkWenRGYhLF45HpSRNwSxMQddZ566Pg7qIFgF1iWl/B0QW3B6AWL5WmzQ5AOJgwS876pNIc/UT7ubMPtgAtjpvw1bQvQP3B8MrB+3OE5c6tD+a3LhR9krV//dOsfErR5Yy+3Mbkc=" @@ -41,6 +42,7 @@ install: - source ./scripts/travis_setup.sh before_script: - ccache --zero-stats + - cmake --version script: - make linux - make test-linux @@ -119,37 +121,38 @@ matrix: script: - make tidy - # Qt 4 - Release - - os: linux - sudo: required - dist: trusty - language: cpp - compiler: "qt4-gcc5-release" - env: BUILDTYPE=Release _CXX=g++-5 _CC=gcc-5 - addons: *qt4 - script: - - make qt-app - - LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so make test-qt-Memory.*:*.Load + # # Qt 4 - Release + # - os: linux + # sudo: required + # dist: trusty + # language: cpp + # compiler: "qt4-gcc5-release" + # env: BUILDTYPE=Release _CXX=g++-5 _CC=gcc-5 + # addons: *qt4 + # script: + # - make qt-app + # - LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so make test-qt-Memory.*:*.Load - # Qt 5 - Release - - os: linux - sudo: required - dist: trusty - language: cpp - compiler: "qt5-gcc5-release" - env: BUILDTYPE=Release _CXX=g++-5 _CC=gcc-5 - addons: *qt5 - script: - - make qt-app - - make qt-qml-app - - make test-valgrind-qt--*.Load + # # Qt 5 - Release + # - os: linux + # sudo: required + # dist: trusty + # language: cpp + # compiler: "qt5-gcc5-release" + # env: BUILDTYPE=Release _CXX=g++-5 _CC=gcc-5 + # addons: *qt5 + # script: + # - make qt-app + # - make qt-qml-app + # - make test-valgrind-qt--*.Load cache: directories: - $HOME/.ccache - $HOME/.cache/pip - - $HOME/build/mapbox/mapbox-gl-native/.binaries - - $HOME/build/mapbox/mapbox-gl-native/.scripts + - .mason + - node_modules + - mason_packages/.binaries notifications: slack: diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000..e81bfe2e5 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,53 @@ +cmake_minimum_required(VERSION 3.2) +project(mbgl LANGUAGES CXX C) +include(cmake/npm.cmake) +include(cmake/mason.cmake) +include(cmake/mbgl.cmake) + +mason_use(geometry 0.8.0) +mason_use(variant 1.1.0) +mason_use(unique_resource dev) +mason_use(rapidjson 1.0.2) +mason_use(boost 1.60.0) +mason_use(geojson 0.1.4) +mason_use(geojsonvt 6.1.2) +mason_use(supercluster 0.2.0) +mason_use(kdbush 0.1.1) +mason_use(earcut 0.11) +mason_use(protozero 1.3.0) +mason_use(gtest 1.7.0) +mason_use(pixelmatch 0.9.0) + +set(CMAKE_CONFIGURATION_TYPES Debug Release) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -Wall -Wextra -Wshadow -Wno-variadic-macros -Wno-unknown-pragmas") + +if(NOT EXISTS ${CMAKE_SOURCE_DIR}/platform/${MBGL_PLATFORM}/config.cmake) + message(ERROR "Can't find config.cmake file for platform ${MBGL_PLATFORM}") +endif() + +include(platform/${MBGL_PLATFORM}/config.cmake) + +include(cmake/core-files.cmake) +include(cmake/shaders.cmake) +include(cmake/core.cmake) + +if(COMMAND mbgl_platform_test) + include(cmake/test-files.cmake) + include(cmake/test.cmake) +endif() + +if(COMMAND mbgl_platform_glfw) + include(cmake/glfw.cmake) +endif() + +if(COMMAND mbgl_platform_render) + include(cmake/render.cmake) +endif() + +if(COMMAND mbgl_platform_offline) + include(cmake/offline.cmake) +endif() + +if(COMMAND mbgl_platform_node) + include(cmake/node.cmake) +endif() diff --git a/Makefile b/Makefile index fff56794d..b447cfc4d 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,11 @@ export BUILDTYPE ?= Debug +ifeq ($(BUILDTYPE), Release) +else ifeq ($(BUILDTYPE), Debug) +else + $(error BUILDTYPE must be Debug or Release) +endif + ifeq ($(shell uname -s), Darwin) HOST_PLATFORM = macos HOST_PLATFORM_VERSION = $(shell uname -m) @@ -30,6 +36,7 @@ else export XCPRETTY ?= | xcpretty endif +.PHONY: default default: test-$(BUILD_PLATFORM) ifneq (,$(wildcard .git/.)) @@ -43,55 +50,96 @@ endif node_modules: package.json npm update # Install dependencies but don't run our own install script. -GYP = deps/run_gyp --depth=. -Goutput_dir=. - -CONFIG_DEPENDENCIES = .mason/mason configure - -# Depend on gyp includes plus directories, so that projects are regenerated when -# files are added or removed. -GYP_DEPENDENCIES = mbgl.gypi test/test.gypi benchmark/benchmark.gypi bin/*.gypi $(shell find src include -type d) node_modules +BUILD_DEPS += .mason/mason +BUILD_DEPS += Makefile +BUILD_DEPS += node_modules #### macOS targets ############################################################## +ifeq ($(HOST_PLATFORM), macos) + +export PATH := $(shell pwd)/platform/macos:$(PATH) + MACOS_OUTPUT_PATH = build/macos -MACOS_PROJ_PATH = $(MACOS_OUTPUT_PATH)/platform/macos/platform.xcodeproj +MACOS_PROJ_PATH = $(MACOS_OUTPUT_PATH)/mbgl.xcodeproj MACOS_WORK_PATH = platform/macos/macos.xcworkspace MACOS_USER_DATA_PATH = $(MACOS_WORK_PATH)/xcuserdata/$(USER).xcuserdatad +MACOS_COMPDB_PATH = $(MACOS_OUTPUT_PATH)/compdb/$(BUILDTYPE) -$(MACOS_OUTPUT_PATH)/config.gypi: platform/macos/scripts/configure.sh $(CONFIG_DEPENDENCIES) - ./configure $< $@ macos - -$(MACOS_OUTPUT_PATH)/mbgl.xcconfig: $(MACOS_OUTPUT_PATH)/config.gypi - ./scripts/export-xcconfig.py $< $@ - -$(MACOS_PROJ_PATH): platform/macos/platform.gyp $(MACOS_OUTPUT_PATH)/config.gypi $(MACOS_OUTPUT_PATH)/mbgl.xcconfig $(GYP_DEPENDENCIES) - $(GYP) -f xcode --generator-output=$(MACOS_OUTPUT_PATH) $< - -macos: $(MACOS_PROJ_PATH) - set -o pipefail && xcodebuild \ +MACOS_XCODEBUILD = xcodebuild \ -derivedDataPath $(MACOS_OUTPUT_PATH) \ -configuration $(BUILDTYPE) \ - -workspace $(MACOS_WORK_PATH) -scheme CI build $(XCPRETTY) + -workspace $(MACOS_WORK_PATH) -xproj: $(MACOS_PROJ_PATH) $(MACOS_WORK_PATH) + +MACOS_XCSCHEMES += platform/macos/scripts/executable.xcscheme +MACOS_XCSCHEMES += platform/macos/scripts/library.xcscheme +MACOS_XCSCHEMES += platform/macos/scripts/node.xcscheme + +$(MACOS_PROJ_PATH): $(BUILD_DEPS) $(MACOS_USER_DATA_PATH)/WorkspaceSettings.xcsettings $(MACOS_XCSCHEMES) + mkdir -p $(MACOS_OUTPUT_PATH) + (cd $(MACOS_OUTPUT_PATH) && cmake -G Xcode ../..) + + @# Create Xcode schemes so that we can use xcodebuild from the command line. CMake doesn't + @# create these automatically. + SCHEME_NAME=mbgl-test SCHEME_TYPE=executable platform/macos/scripts/create_scheme.sh + SCHEME_NAME=mbgl-render SCHEME_TYPE=executable platform/macos/scripts/create_scheme.sh + SCHEME_NAME=mbgl-offline SCHEME_TYPE=executable platform/macos/scripts/create_scheme.sh + SCHEME_NAME=mbgl-glfw SCHEME_TYPE=executable platform/macos/scripts/create_scheme.sh + SCHEME_NAME=mbgl-core SCHEME_TYPE=library BUILDABLE_NAME=libmbgl-core.a BLUEPRINT_NAME=mbgl-core platform/macos/scripts/create_scheme.sh + SCHEME_NAME=mbgl-node SCHEME_TYPE=library BUILDABLE_NAME=mbgl-node.node BLUEPRINT_NAME=mbgl-node platform/macos/scripts/create_scheme.sh + + @# Create schemes for running node tests. These have all of the environment variables set to + @# launch in the correct location. + SCHEME_NAME="node tests" SCHEME_TYPE=node BUILDABLE_NAME=mbgl-node.node BLUEPRINT_NAME=mbgl-node NODE_ARGUMENT="`npm bin tape`/tape platform/node/test/js/**/*.test.js" platform/macos/scripts/create_scheme.sh + SCHEME_NAME="node render tests" SCHEME_TYPE=node BUILDABLE_NAME=mbgl-node.node BLUEPRINT_NAME=mbgl-node NODE_ARGUMENT="platform/node/test/render.test.js" platform/macos/scripts/create_scheme.sh + SCHEME_NAME="node query tests" SCHEME_TYPE=node BUILDABLE_NAME=mbgl-node.node BLUEPRINT_NAME=mbgl-node NODE_ARGUMENT="platform/node/test/query.test.js" platform/macos/scripts/create_scheme.sh + +$(MACOS_USER_DATA_PATH)/WorkspaceSettings.xcsettings: platform/macos/WorkspaceSettings.xcsettings mkdir -p "$(MACOS_USER_DATA_PATH)" - cp platform/macos/WorkspaceSettings.xcsettings "$(MACOS_USER_DATA_PATH)/WorkspaceSettings.xcsettings" + cp platform/macos/WorkspaceSettings.xcsettings "$@" + +.PHONY: macos +macos: $(MACOS_PROJ_PATH) + set -o pipefail && $(MACOS_XCODEBUILD) -scheme 'CI' build $(XCPRETTY) + +.PHONY: xproj +xproj: $(MACOS_PROJ_PATH) open $(MACOS_WORK_PATH) -test-macos: macos node_modules - ulimit -c unlimited && ($(MACOS_OUTPUT_PATH)/Build/Products/$(BUILDTYPE)/test & pid=$$! && wait $$pid \ +.PHONY: test-macos +test-macos: $(MACOS_PROJ_PATH) + set -o pipefail && $(MACOS_XCODEBUILD) -scheme 'mbgl-test' build $(XCPRETTY) + ulimit -c unlimited && ($(MACOS_OUTPUT_PATH)/$(BUILDTYPE)/mbgl-test & pid=$$! && wait $$pid \ || (lldb -c /cores/core.$$pid --batch --one-line 'thread backtrace all' --one-line 'quit' && exit 1)) - set -o pipefail && xcodebuild \ - -derivedDataPath $(MACOS_OUTPUT_PATH) \ - -configuration $(BUILDTYPE) \ - -workspace $(MACOS_WORK_PATH) -scheme CI test $(XCPRETTY) + set -o pipefail && $(MACOS_XCODEBUILD) -scheme 'CI' test $(XCPRETTY) +.PHONY: glfw-app +glfw-app: $(MACOS_PROJ_PATH) + set -o pipefail && $(MACOS_XCODEBUILD) -scheme 'mbgl-glfw' build $(XCPRETTY) + "$(MACOS_OUTPUT_PATH)/$(BUILDTYPE)/mbgl-glfw" + +.PHONY: render +render: $(MACOS_PROJ_PATH) + set -o pipefail && $(MACOS_XCODEBUILD) -scheme 'mbgl-render' build $(XCPRETTY) + +.PHONY: offline +offline: $(MACOS_PROJ_PATH) + set -o pipefail && $(MACOS_XCODEBUILD) -scheme 'mbgl-offline' build $(XCPRETTY) + +.PHONY: node +node: $(MACOS_PROJ_PATH) + set -o pipefail && $(MACOS_XCODEBUILD) -scheme 'mbgl-node' build $(XCPRETTY) + +.PHONY: xpackage xpackage: $(MACOS_PROJ_PATH) SYMBOLS=$(SYMBOLS) ./platform/macos/scripts/package.sh +.PHONY: xdocument xdocument: OUTPUT=$(OUTPUT) ./platform/macos/scripts/document.sh +.PHONY: genstrings genstrings: genstrings -u -o platform/macos/sdk/Base.lproj platform/darwin/src/*.{m,mm} genstrings -u -o platform/macos/sdk/Base.lproj platform/macos/src/*.{m,mm} @@ -100,279 +148,195 @@ genstrings: textutil -convert txt -extension strings -inputencoding UTF-16 -encoding UTF-8 {} \; mv platform/macos/sdk/Base.lproj/Foundation.strings platform/darwin/resources/Base.lproj/ +$(MACOS_COMPDB_PATH)/Makefile: + mkdir -p $(MACOS_COMPDB_PATH) + (cd $(MACOS_COMPDB_PATH) && cmake ../../../.. \ + -DCMAKE_BUILD_TYPE=$(BUILDTYPE) \ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON) + +.PHONY: +compdb: $(BUILD_DEPS) $(TEST_DEPS) $(MACOS_COMPDB_PATH)/Makefile + @$(MAKE) -C $(MACOS_COMPDB_PATH) cmake_check_build_system + +.PHONY: clang-tools +clang-tools: compdb + if test -z $(CLANG_TIDY); then .mason/mason install clang-tidy 3.8.0; fi + if test -z $(CLANG_FORMAT); then .mason/mason install clang-format 3.8.0; fi + $(MAKE) -C $(MACOS_COMPDB_PATH) mbgl-headers + +.PHONY: tidy +tidy: clang-tools + scripts/clang-tools.sh $(MACOS_OUTPUT_PATH)/$(BUILDTYPE) + +.PHONY: check +check: clang-tools + scripts/clang-tools.sh $(MACOS_OUTPUT_PATH)/$(BUILDTYPE) --diff + +endif + #### iOS targets ############################################################## +ifeq ($(HOST_PLATFORM), macos) + IOS_OUTPUT_PATH = build/ios -IOS_PROJ_PATH = $(IOS_OUTPUT_PATH)/platform/ios/platform.xcodeproj +IOS_PROJ_PATH = $(IOS_OUTPUT_PATH)/mbgl.xcodeproj IOS_WORK_PATH = platform/ios/ios.xcworkspace IOS_USER_DATA_PATH = $(IOS_WORK_PATH)/xcuserdata/$(USER).xcuserdatad -$(IOS_OUTPUT_PATH)/config.gypi: platform/ios/scripts/configure.sh $(CONFIG_DEPENDENCIES) - ./configure $< $@ ios - -$(IOS_OUTPUT_PATH)/mbgl.xcconfig: $(IOS_OUTPUT_PATH)/config.gypi - ./scripts/export-xcconfig.py $< $@ - -$(IOS_PROJ_PATH): platform/ios/platform.gyp $(IOS_OUTPUT_PATH)/config.gypi $(IOS_OUTPUT_PATH)/mbgl.xcconfig $(GYP_DEPENDENCIES) - $(GYP) -f xcode --generator-output=$(IOS_OUTPUT_PATH) $< - -ios: $(IOS_PROJ_PATH) - set -o pipefail && xcodebuild \ +IOS_XCODEBUILD_SIM = xcodebuild \ ARCHS=x86_64 ONLY_ACTIVE_ARCH=YES \ -derivedDataPath $(IOS_OUTPUT_PATH) \ -configuration $(BUILDTYPE) -sdk iphonesimulator \ -destination 'platform=iOS Simulator,name=iPhone 6,OS=latest' \ - -workspace $(IOS_WORK_PATH) -scheme CI build $(XCPRETTY) + -workspace $(IOS_WORK_PATH) -iproj: $(IOS_PROJ_PATH) +$(IOS_PROJ_PATH): $(IOS_USER_DATA_PATH)/WorkspaceSettings.xcsettings $(BUILD_DEPS) + mkdir -p $(IOS_OUTPUT_PATH) + (cd $(IOS_OUTPUT_PATH) && cmake -G Xcode ../.. \ + -DCMAKE_TOOLCHAIN_FILE=../../platform/ios/toolchain.cmake \ + -DMBGL_PLATFORM=ios) + +$(IOS_USER_DATA_PATH)/WorkspaceSettings.xcsettings: platform/ios/WorkspaceSettings.xcsettings mkdir -p "$(IOS_USER_DATA_PATH)" - cp platform/ios/WorkspaceSettings.xcsettings "$(IOS_USER_DATA_PATH)/WorkspaceSettings.xcsettings" + cp platform/ios/WorkspaceSettings.xcsettings "$@" + +.PHONY: ios +ios: $(IOS_PROJ_PATH) + set -o pipefail && $(IOS_XCODEBUILD_SIM) -scheme 'CI' build $(XCPRETTY) + +.PHONY: iproj +iproj: $(IOS_PROJ_PATH) open $(IOS_WORK_PATH) -test-ios: ios - ios-sim start --devicetypeid 'com.apple.CoreSimulator.SimDeviceType.iPhone-6,9.3' - ios-sim launch $(IOS_OUTPUT_PATH)/Build/Products/$(BUILDTYPE)-iphonesimulator/ios-test.app --verbose --devicetypeid 'com.apple.CoreSimulator.SimDeviceType.iPhone-6,9.3' - set -o pipefail && xcodebuild \ - ARCHS=x86_64 ONLY_ACTIVE_ARCH=YES \ - -derivedDataPath $(IOS_OUTPUT_PATH) \ - -configuration $(BUILDTYPE) -sdk iphonesimulator \ - -destination 'platform=iOS Simulator,name=iPhone 6,OS=latest' \ - -workspace $(IOS_WORK_PATH) -scheme CI test $(XCPRETTY) +.PHONY: test-ios +test-ios: $(IOS_PROJ_PATH) + set -o pipefail && $(IOS_XCODEBUILD_SIM) -scheme 'CI' test $(XCPRETTY) +.PHONY: ipackage ipackage: $(IOS_PROJ_PATH) FORMAT=$(FORMAT) BUILD_DEVICE=$(BUILD_DEVICE) SYMBOLS=$(SYMBOLS) \ ./platform/ios/scripts/package.sh +.PHONY: ipackage-strip ipackage-strip: $(IOS_PROJ_PATH) FORMAT=$(FORMAT) BUILD_DEVICE=$(BUILD_DEVICE) SYMBOLS=NO \ ./platform/ios/scripts/package.sh +.PHONY: ipackage-sim ipackage-sim: $(IOS_PROJ_PATH) BUILDTYPE=Debug FORMAT=dynamic BUILD_DEVICE=false SYMBOLS=$(SYMBOLS) \ ./platform/ios/scripts/package.sh +.PHONY: iframework iframework: $(IOS_PROJ_PATH) FORMAT=dynamic BUILD_DEVICE=$(BUILD_DEVICE) SYMBOLS=$(SYMBOLS) \ ./platform/ios/scripts/package.sh +.PHONY: ifabric ifabric: $(IOS_PROJ_PATH) FORMAT=static BUILD_DEVICE=$(BUILD_DEVICE) SYMBOLS=NO SELF_CONTAINED=YES \ ./platform/ios/scripts/package.sh +.PHONY: idocument idocument: OUTPUT=$(OUTPUT) ./platform/ios/scripts/document.sh -#### Android targets ##################################################### - -ANDROID_ENV = platform/android/scripts/toolchain.sh -ANDROID_ABIS = arm-v5 arm-v7 arm-v8 x86 x86-64 mips - -style-code-android: - node platform/android/scripts/generate-style-code.js - -define ANDROID_RULES -build/android-$1/config.gypi: platform/android/scripts/configure.sh $(CONFIG_DEPENDENCIES) - $$(shell $(ANDROID_ENV) $1) ./configure $$< $$@ android $1 - -build/android-$1/Makefile: platform/android/platform.gyp build/android-$1/config.gypi $(GYP_DEPENDENCIES) - $$(shell $(ANDROID_ENV) $1) $(GYP) -f make-android -I build/android-$1/config.gypi \ - --generator-output=build/android-$1 $$< - -android-lib-$1: build/android-$1/Makefile - $$(shell $(ANDROID_ENV) $1) $(MAKE) -j$(JOBS) -C build/android-$1 all - -android-$1: android-lib-$1 style-code-android - cd platform/android && ./gradlew --parallel --max-workers=$(JOBS) assemble$(BUILDTYPE) - -apackage: android-lib-$1 -endef - -$(foreach abi,$(ANDROID_ABIS),$(eval $(call ANDROID_RULES,$(abi)))) - -android: android-arm-v7 - -test-android: - cd platform/android && ./gradlew testReleaseUnitTest --continue - -apackage: - cd platform/android && ./gradlew --parallel-threads=$(JOBS) assemble$(BUILDTYPE) - -#### Node targets ##################################################### - -NODE_PRE_GYP = $(shell npm bin)/node-pre-gyp -NODE_OUTPUT_PATH = build/node-$(BUILD_PLATFORM)-$(BUILD_PLATFORM_VERSION) - -ifeq ($(BUILDTYPE), Debug) - NODE_DEBUG = "--debug" endif -$(NODE_OUTPUT_PATH)/config.gypi: platform/$(BUILD_PLATFORM)/scripts/configure.sh $(CONFIG_DEPENDENCIES) - ./configure $< $@ $(BUILD_PLATFORM) $(BUILD_PLATFORM_VERSION) - -node: $(NODE_OUTPUT_PATH)/config.gypi node_modules $(GYP_DEPENDENCIES) - $(NODE_PRE_GYP) configure --clang $(NODE_DEBUG) -- -I$< \ - -Dcoverage= -Dlibuv_cflags= -Dlibuv_ldflags= -Dlibuv_static_libs= - $(NODE_PRE_GYP) build --clang - -xnode: $(NODE_OUTPUT_PATH)/config.gypi $(GYP_DEPENDENCIES) - $(NODE_PRE_GYP) configure --clang -- -I$< \ - -Dcoverage= -Dlibuv_cflags= -Dlibuv_ldflags= -Dlibuv_static_libs= \ - -f xcode - ./platform/node/scripts/create_node_scheme.sh "node test" "`npm bin tape`/tape platform/node/test/js/**/*.test.js" - ./platform/node/scripts/create_node_scheme.sh "npm run test-suite" "platform/node/test/render.test.js" - open ./build/binding.xcodeproj - -.PHONY: test-node -test-node: node - npm test - npm run test-memory - npm run test-suite - -#### Qt targets ##################################################### - -QT_OUTPUT_PATH = build/qt-$(BUILD_PLATFORM)-$(BUILD_PLATFORM_VERSION) -QT_MAKEFILE = $(QT_OUTPUT_PATH)/Makefile - -# Cross compilation support -QT_ENV = $(shell MASON_PLATFORM_VERSION=$(BUILD_PLATFORM_VERSION) ./platform/qt/scripts/toolchain.sh) - -$(QT_OUTPUT_PATH)/config.gypi: platform/qt/scripts/configure.sh $(CONFIG_DEPENDENCIES) - $(QT_ENV) ./configure $< $@ $(BUILD_PLATFORM) $(BUILD_PLATFORM_VERSION) - -GYP_FLAVOR = make -ifneq ($(HOST_PLATFORM),$(BUILD_PLATFORM)) - ifeq ($(BUILD_PLATFORM), linux) - GYP_FLAVOR = make-linux - else ifeq ($(BUILD_PLATFORM), macos) - GYP_FLAVOR = make-mac - endif -endif - -$(QT_MAKEFILE): platform/qt/platform.gyp $(QT_OUTPUT_PATH)/config.gypi $(GYP_DEPENDENCIES) - $(QT_ENV) $(GYP) -f $(GYP_FLAVOR) -I $(QT_OUTPUT_PATH)/config.gypi \ - --generator-output=$(QT_OUTPUT_PATH) $< - -qt-lib: $(QT_MAKEFILE) - $(QT_ENV) $(MAKE) -j$(JOBS) -C $(QT_OUTPUT_PATH) qt-lib - -qt-app: $(QT_MAKEFILE) - $(QT_ENV) $(MAKE) -j$(JOBS) -C $(QT_OUTPUT_PATH) qt-app - -qt-qml-app: $(QT_MAKEFILE) - $(QT_ENV) $(MAKE) -j$(JOBS) -C $(QT_OUTPUT_PATH) qt-qml-app - -test-qt-%: $(QT_MAKEFILE) node_modules - $(QT_ENV) $(MAKE) -j$(JOBS) -C $(QT_OUTPUT_PATH) test - $(GDB) $(QT_OUTPUT_PATH)/$(BUILDTYPE)/test --gtest_catch_exceptions=0 --gtest_filter=$* - -test-qt: test-qt-* - -run-qt-app: qt-app - cd $(QT_OUTPUT_PATH)/$(BUILDTYPE) && ./qmapboxgl - -run-qt-qml-app: qt-qml-app - cd $(QT_OUTPUT_PATH)/$(BUILDTYPE) && ./qquickmapboxgl - -test-valgrind-qt-%: $(QT_MAKEFILE) node_modules - $(QT_ENV) $(MAKE) -j$(JOBS) -C $(QT_OUTPUT_PATH) test - .mason/mason install valgrind latest - ./scripts/valgrind.sh $(QT_OUTPUT_PATH)/$(BUILDTYPE)/test --gtest_catch_exceptions=0 --gtest_filter=$* - -test-valgrind-qt: test-valgrind-qt-* - -run-valgrind-qt-app: qt-app - .mason/mason install valgrind latest - ./scripts/valgrind.sh $(QT_OUTPUT_PATH)/$(BUILDTYPE)/qmapboxgl --test -platform offscreen - #### Linux targets ##################################################### -LINUX_OUTPUT_PATH = build/linux-$(BUILD_PLATFORM_VERSION) -LINUX_MAKEFILE = $(LINUX_OUTPUT_PATH)/Makefile +ifeq ($(HOST_PLATFORM), linux) -$(LINUX_OUTPUT_PATH)/config.gypi: platform/linux/scripts/configure.sh $(CONFIG_DEPENDENCIES) - ./configure $< $@ linux $(BUILD_PLATFORM_VERSION) +export PATH := $(shell pwd)/platform/linux:$(PATH) +export LINUX_OUTPUT_PATH = build/linux-$(shell uname -m)/$(BUILDTYPE) +LINUX_BUILD = $(LINUX_OUTPUT_PATH)/build.ninja +NINJA = platform/linux/ninja -$(LINUX_MAKEFILE): platform/linux/platform.gyp $(LINUX_OUTPUT_PATH)/config.gypi $(GYP_DEPENDENCIES) - $(GYP) -f make -I $(LINUX_OUTPUT_PATH)/config.gypi \ - --generator-output=$(LINUX_OUTPUT_PATH) $< +$(LINUX_BUILD): $(BUILD_DEPS) + mkdir -p $(LINUX_OUTPUT_PATH) + (cd $(LINUX_OUTPUT_PATH) && cmake -G Ninja ../../.. \ + -DCMAKE_BUILD_TYPE=$(BUILDTYPE) \ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON) +.PHONY: linux linux: glfw-app render offline -test-linux: node_modules test-* +test-linux: run-test-* -render: $(LINUX_MAKEFILE) - $(MAKE) -j$(JOBS) -C $(LINUX_OUTPUT_PATH) mbgl-render +.PHONY: linux-render +render: $(LINUX_BUILD) + $(NINJA) -j$(JOBS) -C $(LINUX_OUTPUT_PATH) mbgl-render -offline: $(LINUX_MAKEFILE) - $(MAKE) -j$(JOBS) -C $(LINUX_OUTPUT_PATH) mbgl-offline +.PHONY: linux-offline +offline: $(LINUX_BUILD) + $(NINJA) -j$(JOBS) -C $(LINUX_OUTPUT_PATH) mbgl-offline -glfw-app: $(LINUX_MAKEFILE) - $(MAKE) -j$(JOBS) -C $(LINUX_OUTPUT_PATH) glfw-app +.PHONY: glfw-app +glfw-app: $(LINUX_BUILD) + $(NINJA) -j$(JOBS) -C $(LINUX_OUTPUT_PATH) mbgl-glfw -test: $(LINUX_MAKEFILE) - $(MAKE) -j$(JOBS) -C $(LINUX_OUTPUT_PATH) test +.PHONY: test +test: $(LINUX_BUILD) + $(NINJA) -j$(JOBS) -C $(LINUX_OUTPUT_PATH) mbgl-test +.PHONY: run-glfw-app run-glfw-app: glfw-app - cd $(LINUX_OUTPUT_PATH)/$(BUILDTYPE) && ./mapbox-glfw + cd $(LINUX_OUTPUT_PATH) && ./mbgl-glfw + +.PHONY: node +node: $(LINUX_BUILD) + $(NINJA) -j$(JOBS) -C $(LINUX_OUTPUT_PATH) mbgl-node ifneq (,$(shell which gdb)) GDB = gdb -batch -return-child-result -ex 'set print thread-events off' -ex 'run' -ex 'thread apply all bt' --args endif -test-%: test - $(GDB) $(LINUX_OUTPUT_PATH)/$(BUILDTYPE)/test --gtest_catch_exceptions=0 --gtest_filter=$* +run-test-%: test + $(GDB) $(LINUX_OUTPUT_PATH)/mbgl-test --gtest_catch_exceptions=0 --gtest_filter=$* +.PHONY: coverage coverage: test - scripts/collect-coverage.sh $(LINUX_OUTPUT_PATH)/$(BUILDTYPE) + scripts/collect-coverage.sh $(LINUX_OUTPUT_PATH) -# Generates a compilation database with ninja for use in clang tooling -compdb: node_modules compdb-$(BUILD_PLATFORM) +.PHONY: compdb +compdb: $(LINUX_BUILD) + # Ninja generator already outputs the file at the right location -compdb-linux: platform/linux/platform.gyp $(LINUX_OUTPUT_PATH)/config.gypi - $(GYP) -f ninja -I $(LINUX_OUTPUT_PATH)/config.gypi \ - --generator-output=$(LINUX_OUTPUT_PATH) $< - deps/ninja/ninja-linux -C $(LINUX_OUTPUT_PATH)/$(BUILDTYPE) \ - -t compdb cc cc_s cxx objc objcxx > $(LINUX_OUTPUT_PATH)/$(BUILDTYPE)/compile_commands.json +.PHONY: tidy +tidy: compdb + $(NINJA) -j$(JOBS) -C $(LINUX_OUTPUT_PATH) mbgl-headers + scripts/clang-tidy.sh $(LINUX_OUTPUT_PATH) -compdb-macos: platform/macos/platform.gyp $(MACOS_OUTPUT_PATH)/config.gypi - $(GYP) -f ninja -I $(MACOS_OUTPUT_PATH)/config.gypi \ - --generator-output=$(MACOS_OUTPUT_PATH) $< - deps/ninja/ninja-macos -C $(MACOS_OUTPUT_PATH)/$(BUILDTYPE) \ - -t compdb cc cc_s cxx objc objcxx > $(MACOS_OUTPUT_PATH)/$(BUILDTYPE)/compile_commands.json - -tidy: compdb tidy-$(BUILD_PLATFORM) - -clang-tools-linux: +.PHONY: clang-tools +clang-tools: if test -z $(CLANG_TIDY); then .mason/mason install clang-tidy 3.8.0; fi if test -z $(CLANG_FORMAT); then .mason/mason install clang-format 3.8.0; fi - deps/ninja/ninja-linux -C $(LINUX_OUTPUT_PATH)/$(BUILDTYPE) headers + deps/ninja/ninja-linux -C $(LINUX_OUTPUT_PATH) headers -tidy-linux: clang-tools-linux - scripts/clang-tools.sh $(LINUX_OUTPUT_PATH)/$(BUILDTYPE) +.PHONY: tidy +tidy: clang-tools + scripts/clang-tools.sh $(LINUX_OUTPUT_PATH) -clang-tools-macos: - if test -z $(CLANG_TIDY); then .mason/mason install clang-tidy 3.8.0; fi - if test -z $(CLANG_FORMAT); then .mason/mason install clang-format 3.8.0; fi - deps/ninja/ninja-macos -C $(MACOS_OUTPUT_PATH)/$(BUILDTYPE) headers +.PHONY: check +check: compdb clang-tools + scripts/clang-tools.sh $(LINUX_OUTPUT_PATH) --diff -tidy-macos: clang-tools-macos - scripts/clang-tools.sh $(MACOS_OUTPUT_PATH)/$(BUILDTYPE) +endif -check: compdb check-$(BUILD_PLATFORM) +#### Node targets ############################################################## -check-linux: clang-tools-linux - scripts/clang-tools.sh $(LINUX_OUTPUT_PATH)/$(BUILDTYPE) --diff - -check-macos: clang-tools-macos - scripts/clang-tools.sh $(MACOS_OUTPUT_PATH)/$(BUILDTYPE) --diff +.PHONY: test-node +test-node: node + npm test + npm run test-suite #### Miscellaneous targets ##################################################### style-code: node scripts/generate-style-code.js +.PHONY: clean clean: - -find ./deps/gyp -name "*.pyc" -exec rm {} \; -rm -rf ./build \ ./platform/android/MapboxGLAndroidSDK/build \ ./platform/android/MapboxGLAndroidSDKTestApp/build \ @@ -380,6 +344,7 @@ clean: ./platform/android/MapboxGLAndroidSDKTestApp/src/main/jniLibs \ ./platform/android/MapboxGLAndroidSDK/src/main/assets +.PHONY: distclean distclean: clean -rm -rf ./mason_packages -rm -rf ./node_modules diff --git a/benchmark/benchmark.gypi b/benchmark/benchmark.gypi deleted file mode 100644 index 011ac1658..000000000 --- a/benchmark/benchmark.gypi +++ /dev/null @@ -1,87 +0,0 @@ -{ - 'targets': [ - { - 'target_name': 'benchmark-lib', - 'type': 'static_library', - 'standalone_static_library': 1, - 'hard_dependency': 1, - 'dependencies': [ - 'core', - ], - - 'include_dirs': [ - '../include', - '../src', - '../platform/default', - 'include', - 'src', - ], - - 'sources': [ - 'parse/filter.cpp', - - - 'src/mbgl/benchmark/benchmark.cpp' - ], - - 'variables': { - 'cflags_cc': [ - '<@(benchmark_cflags)', - '<@(rapidjson_cflags)', - ], - 'ldflags': [ - '<@(benchmark_ldflags)', - ], - 'libraries': [ - '<@(benchmark_static_libs)', - ], - }, - - 'conditions': [ - ['OS == "mac"', { - 'xcode_settings': { - 'OTHER_CPLUSPLUSFLAGS': [ '<@(cflags_cc)' ], - }, - }, { - 'cflags_cc': [ '<@(cflags_cc)' ], - }], - ], - 'link_settings': { - 'conditions': [ - ['OS == "mac"', { - 'libraries': [ '<@(libraries)' ], - 'xcode_settings': { 'OTHER_LDFLAGS': [ '<@(ldflags)' ] } - }, { - 'libraries': [ '<@(libraries)', '<@(ldflags)' ], - }] - ], - }, - - 'direct_dependent_settings': { - 'include_dirs': [ - 'include', - ], - - # Force the linker to include all the objects from the lib-benchmark archive. Otherwise they'd - # be discarded because there are no undefined symbols to pull them in, and the resulting - # executable would run zero tests. - - 'conditions': [ - ['OS == "mac"', { - 'xcode_settings': { - 'OTHER_LDFLAGS': [ - '-Wl,-force_load,<(PRODUCT_DIR)/libbenchmark-lib.a', - ], - } - }, { - 'link_settings': { - 'ldflags': [ - '-Wl,-whole-archive <(PRODUCT_DIR)/libbenchmark-lib.a -Wl,-no-whole-archive', - ], - }, - }], - ], - }, - }, - ] -} diff --git a/bin/glfw.gypi b/bin/glfw.gypi deleted file mode 100644 index dbf73e5ab..000000000 --- a/bin/glfw.gypi +++ /dev/null @@ -1,61 +0,0 @@ -{ - 'targets': [ - { - 'target_name': 'glfw-app', - 'product_name': 'mapbox-glfw', - 'type': 'executable', - - 'dependencies': [ - 'core', - 'platform-lib', - 'copy_certificate_bundle', - ], - - 'include_dirs': [ - '../platform/default', - '../include', - '../src', - ], - - 'sources': [ - 'glfw.cpp', - '../platform/default/settings_json.cpp', - '../platform/default/glfw_view.hpp', - '../platform/default/glfw_view.cpp', - '../platform/default/log_stderr.cpp', - ], - - 'variables': { - 'cflags_cc': [ - '<@(glfw_cflags)', - ], - 'ldflags': [ - '<@(glfw_ldflags)', - ], - 'libraries': [ - '<@(glfw_static_libs)', - ], - }, - - 'conditions': [ - ['OS == "mac"', { - 'xcode_settings': { - 'OTHER_CPLUSPLUSFLAGS': [ '<@(cflags_cc)' ], - }, - }, { - 'cflags_cc': [ '<@(cflags_cc)' ], - }], - ], - 'link_settings': { - 'conditions': [ - ['OS == "mac"', { - 'libraries': [ '<@(libraries)' ], - 'xcode_settings': { 'OTHER_LDFLAGS': [ '<@(ldflags)' ] } - }, { - 'libraries': [ '<@(libraries)', '<@(ldflags)' ], - }] - ], - }, - }, - ], -} diff --git a/bin/offline.gypi b/bin/offline.gypi deleted file mode 100644 index 295cbd0a0..000000000 --- a/bin/offline.gypi +++ /dev/null @@ -1,40 +0,0 @@ -{ - 'targets': [ - { - 'target_name': 'mbgl-offline', - 'product_name': 'mbgl-offline', - 'type': 'executable', - - 'dependencies': [ - 'core', - 'platform-lib', - 'copy_certificate_bundle', - ], - - 'include_dirs': [ - '../include', - '../src', - ], - - 'sources': [ - 'offline.cpp', - ], - - 'cflags_cc': [ - '<@(boost_cflags)', - ], - - 'link_settings': { - 'libraries': [ - '<@(boost_libprogram_options_static_libs)' - ], - }, - - 'xcode_settings': { - 'OTHER_CPLUSPLUSFLAGS': [ - '<@(boost_cflags)', - ], - } - }, - ], -} diff --git a/bin/render.gypi b/bin/render.gypi deleted file mode 100644 index b6ae66898..000000000 --- a/bin/render.gypi +++ /dev/null @@ -1,40 +0,0 @@ -{ - 'targets': [ - { - 'target_name': 'mbgl-render', - 'product_name': 'mbgl-render', - 'type': 'executable', - - 'dependencies': [ - 'core', - 'platform-lib', - 'copy_certificate_bundle', - ], - - 'include_dirs': [ - '../include', - '../src', - ], - - 'sources': [ - 'render.cpp', - ], - - 'cflags_cc': [ - '<@(boost_cflags)', - ], - - 'link_settings': { - 'libraries': [ - '<@(boost_libprogram_options_static_libs)' - ], - }, - - 'xcode_settings': { - 'OTHER_CPLUSPLUSFLAGS': [ - '<@(boost_cflags)', - ], - } - }, - ], -} diff --git a/binding.gyp b/binding.gyp deleted file mode 100644 index acd812926..000000000 --- a/binding.gyp +++ /dev/null @@ -1,107 +0,0 @@ -{ - 'variables': { - 'loop_lib': 'uv', - 'headless_lib': 'glx', - }, - 'conditions': [ - ['OS == "mac"', { - 'variables': { - 'headless_lib': 'cgl', - } - }], - ], - 'includes': [ - 'mbgl.gypi', - ], - 'targets': [ - { - 'target_name': '<(module_name)', - 'dependencies': [ - 'core', - ], - - 'include_dirs': [ - '<(node_root_dir)/include/node', - " ${CMAKE_SOURCE_DIR}/lib/mapbox-gl-native.node +) + +mbgl_platform_node() diff --git a/cmake/npm.cmake b/cmake/npm.cmake new file mode 100644 index 000000000..bb456666e --- /dev/null +++ b/cmake/npm.cmake @@ -0,0 +1,20 @@ +function(cache_executable_path name variable) + # Obtain paths to node and npm and cache it, so when e.g. Xcode reruns CMake, we still have the + # variables from the original invocation + if(NOT ${variable}) + set(_which_output) + execute_process( + COMMAND which ${name} + OUTPUT_VARIABLE _which_output + OUTPUT_STRIP_TRAILING_WHITESPACE) + if(_which_output STREQUAL "") + message(STATUS "Using cached ${name}: ${${variable}}") + else() + set(${variable} "${_which_output}" CACHE PATH "Path to ${name} executable") + message(STATUS "Using ${name}: ${${variable}}") + endif() + endif() +endfunction() + +cache_executable_path(node _node) +cache_executable_path(npm _npm) diff --git a/cmake/offline.cmake b/cmake/offline.cmake new file mode 100644 index 000000000..c2959e749 --- /dev/null +++ b/cmake/offline.cmake @@ -0,0 +1,21 @@ +add_executable(mbgl-offline + bin/offline.cpp +) + +target_compile_options(mbgl-offline + PRIVATE -fvisibility-inlines-hidden +) + +target_include_directories(mbgl-offline + PRIVATE include + PRIVATE src # TODO: eliminate +) + +target_link_libraries(mbgl-offline + PRIVATE mbgl-core +) + +target_add_mason_package(mbgl-offline PRIVATE boost) +target_add_mason_package(mbgl-offline PRIVATE boost_libprogram_options) + +mbgl_platform_offline() diff --git a/cmake/render.cmake b/cmake/render.cmake new file mode 100644 index 000000000..3cf79cc0c --- /dev/null +++ b/cmake/render.cmake @@ -0,0 +1,21 @@ +add_executable(mbgl-render + bin/render.cpp +) + +target_compile_options(mbgl-render + PRIVATE -fvisibility-inlines-hidden +) + +target_include_directories(mbgl-render + PRIVATE include + PRIVATE src # TODO: eliminate +) + +target_link_libraries(mbgl-render + PRIVATE mbgl-core +) + +target_add_mason_package(mbgl-render PRIVATE boost) +target_add_mason_package(mbgl-render PRIVATE boost_libprogram_options) + +mbgl_platform_render() diff --git a/cmake/shaders.cmake b/cmake/shaders.cmake new file mode 100644 index 000000000..5a16fa682 --- /dev/null +++ b/cmake/shaders.cmake @@ -0,0 +1,29 @@ +function(add_shader VAR name) + set(shader_build_cmd ${CMAKE_SOURCE_DIR}/scripts/build-shaders.py) + set(shader_file_prefix ${CMAKE_SOURCE_DIR}/node_modules/mapbox-gl-shaders/src) + set(shader_source_prefix ${MBGL_GENERATED}/include/mbgl/shader) + + add_custom_command( + OUTPUT ${shader_source_prefix}/${name}.vertex.hpp ${shader_source_prefix}/${name}.fragment.hpp + COMMAND ${shader_build_cmd} ${shader_file_prefix}/${name}.vertex.glsl ${shader_source_prefix}/${name}.vertex.hpp + COMMAND ${shader_build_cmd} ${shader_file_prefix}/${name}.fragment.glsl ${shader_source_prefix}/${name}.fragment.hpp + DEPENDS ${shader_file_prefix}/${name}.vertex.glsl + DEPENDS ${shader_file_prefix}/${name}.fragment.glsl + VERBATIM + ) + set(${VAR} ${${VAR}} ${shader_source_prefix}/${name}.vertex.hpp ${shader_source_prefix}/${name}.fragment.hpp PARENT_SCOPE) +endfunction() + +add_shader(MBGL_SHADER_FILES circle) +add_shader(MBGL_SHADER_FILES collisionbox) +add_shader(MBGL_SHADER_FILES debug) +add_shader(MBGL_SHADER_FILES fill) +add_shader(MBGL_SHADER_FILES icon) +add_shader(MBGL_SHADER_FILES line) +add_shader(MBGL_SHADER_FILES linepattern) +add_shader(MBGL_SHADER_FILES linesdfpattern) +add_shader(MBGL_SHADER_FILES outline) +add_shader(MBGL_SHADER_FILES outlinepattern) +add_shader(MBGL_SHADER_FILES pattern) +add_shader(MBGL_SHADER_FILES raster) +add_shader(MBGL_SHADER_FILES sdf) diff --git a/cmake/test-files.cmake b/cmake/test-files.cmake new file mode 100644 index 000000000..d6c621529 --- /dev/null +++ b/cmake/test-files.cmake @@ -0,0 +1,100 @@ +# Do not edit. Regenerate this with ./scripts/generate-test-files.sh + +set(MBGL_TEST_FILES + # algorithm + test/algorithm/covered_by_children.cpp + test/algorithm/generate_clip_ids.cpp + test/algorithm/mock.hpp + test/algorithm/update_renderables.cpp + + # api + test/api/annotations.cpp + test/api/api_misuse.cpp + test/api/custom_layer.cpp + test/api/render_missing.cpp + test/api/repeated_render.cpp + test/api/set_style.cpp + + # geometry + test/geometry/binpack.cpp + + # gl + test/gl/object.cpp + + # include/mbgl + test/include/mbgl/test.hpp + + # map + test/map/map.cpp + test/map/transform.cpp + + # math + test/math/clamp.cpp + test/math/minmax.cpp + + # sprite + test/sprite/sprite_atlas.cpp + test/sprite/sprite_image.cpp + test/sprite/sprite_parser.cpp + test/sprite/sprite_store.cpp + + # src + test/src/main.cpp + + # src/mbgl/test + test/src/mbgl/test/fixture_log_observer.cpp + test/src/mbgl/test/fixture_log_observer.hpp + test/src/mbgl/test/stub_file_source.cpp + test/src/mbgl/test/stub_file_source.hpp + test/src/mbgl/test/stub_style_observer.hpp + test/src/mbgl/test/test.cpp + test/src/mbgl/test/util.cpp + test/src/mbgl/test/util.hpp + + # storage + test/storage/asset_file_source.cpp + test/storage/default_file_source.cpp + test/storage/headers.cpp + test/storage/http_file_source.cpp + test/storage/offline.cpp + test/storage/offline_database.cpp + test/storage/offline_download.cpp + test/storage/online_file_source.cpp + test/storage/resource.cpp + + # style + test/style/filter.cpp + test/style/functions.cpp + test/style/glyph_store.cpp + test/style/source.cpp + test/style/style.cpp + test/style/style_layer.cpp + test/style/style_parser.cpp + test/style/tile_source.cpp + test/style/variant.cpp + + # text + test/text/quads.cpp + + # tile + test/tile/geometry_tile_data.cpp + test/tile/tile_id.cpp + + # util + test/util/async_task.cpp + test/util/geo.cpp + test/util/image.cpp + test/util/mapbox.cpp + test/util/memory.cpp + test/util/merge_lines.cpp + test/util/number_conversions.cpp + test/util/projection.cpp + test/util/run_loop.cpp + test/util/text_conversions.cpp + test/util/thread.cpp + test/util/thread_local.cpp + test/util/tile_cover.cpp + test/util/timer.cpp + test/util/token.cpp + test/util/work_queue.cpp +) diff --git a/cmake/test.cmake b/cmake/test.cmake new file mode 100644 index 000000000..6cce8d248 --- /dev/null +++ b/cmake/test.cmake @@ -0,0 +1,35 @@ +add_executable(mbgl-test + ${MBGL_TEST_FILES} +) + +cache_executable_path(node _node) + +target_compile_options(mbgl-test + PRIVATE -fvisibility-inlines-hidden +) + +set_source_files_properties(test/src/mbgl/test/util.cpp PROPERTIES COMPILE_FLAGS -DNODE_EXECUTABLE="${_node}") + +target_include_directories(mbgl-test + PRIVATE include + PRIVATE src # TODO: eliminate + PRIVATE test/include + PRIVATE test/src + PRIVATE platform/default +) + +target_link_libraries(mbgl-test + PRIVATE mbgl-core +) + +target_add_mason_package(mbgl-test PRIVATE geometry) +target_add_mason_package(mbgl-test PRIVATE variant) +target_add_mason_package(mbgl-test PRIVATE unique_resource) +target_add_mason_package(mbgl-test PRIVATE rapidjson) +target_add_mason_package(mbgl-test PRIVATE gtest) +target_add_mason_package(mbgl-test PRIVATE pixelmatch) +target_add_mason_package(mbgl-test PRIVATE boost) +target_add_mason_package(mbgl-test PRIVATE geojson) +target_add_mason_package(mbgl-test PRIVATE geojsonvt) + +mbgl_platform_test() diff --git a/configure b/configure deleted file mode 100755 index c3a3ae319..000000000 --- a/configure +++ /dev/null @@ -1,140 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -INPUT_FILE=$1 -OUTPUT_FILE=$2 -export MASON_PLATFORM=$3 -export MASON_PLATFORM_VERSION=${4:-} - -if [ "${MASON_PLATFORM}" = "macos" ]; then - export MASON_PLATFORM=osx -fi - -if [ -z ${INPUT_FILE} ]; then - abort 'You need to specify an input path for the configure.sh file' -fi - -if [ -z ${OUTPUT_FILE} ]; then - abort 'You need to specify an output path for the configuration file' -fi - -# Make sure we clear all colors -trap '>&2 echo -en "\033[0m"' TERM INT - -function abort { >&2 echo -e "\033[1m\033[31m$1\033[0m"; exit 1; } -function info { >&2 echo -e "\033[1m\033[33m$1\033[0m"; } -function warn { >&2 echo -e "\033[1m\033[33m$1\033[0m"; } - -if [ -e "`pwd`/.git" ]; then - export MASON_DIR="`pwd`/.mason" - export PATH="${MASON_DIR}:${PATH}" -else - which mason || abort "You must install mason to build mapbox-gl-native (https://github.com/mapbox/mason)" - export MASON_DIR="$(dirname $(readlink $(which mason)))" -fi - -# You can override the function for a particular set of flags by defining a -# print_XXX_flags function in your dependencies.sh file -function print_flags { - local NAME=$1; shift - if [ "$(type -t print_${NAME}_flags)" = 'function' ]; then - print_${NAME}_flags - else - local VERSION=`echo "${NAME}_VERSION" | tr "[:lower:]-." "[:upper:]__"` - if [ ! -z ${!VERSION:-} ] ; then - mason install ${NAME} ${!VERSION} - for FLAGS in "$@" ; do - flags=$(mason ${FLAGS} ${NAME} ${!VERSION}) || exit 1 - CONFIG+=" '${NAME}_${FLAGS}%': $(quote_flags $flags),"$LN - done - else - warn "* Not using ${NAME}" - for FLAGS in "$@" ; do - CONFIG+=" '${NAME}_${FLAGS}%': [],"$LN - done - fi - fi -} - -function print_default_flags { - : -} - -function print_opengl_flags { - CONFIG+=" 'opengl_cflags%': [],"$LN - CONFIG+=" 'opengl_ldflags%': [],"$LN -} - -function print_qt_flags { - : -} - -# Load dependencies -source ${INPUT_FILE} - -PYTHON=`which python || abort 'Cannot find python'` - ->&2 echo -en "\033[1m\033[32m* Using " ->&2 ${PYTHON} --version ->&2 echo -en "\033[0m"; - -function quote_flags { - ${PYTHON} -c "import sys, re; print filter(None, re.split('(? ${OUTPUT_FILE} -cat ${OUTPUT_FILE} diff --git a/docker/Dockerfile b/docker/Dockerfile index ef98a7143..64f1ca3c8 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -12,5 +12,5 @@ RUN apt-get update -y RUN apt-get install -y git-core python-pip curl automake libtool make cmake pkg-config python-pip \ libc6 libstdc++6 zlib1g-dev libcurl4-openssl-dev libpng-dev libsqlite3-dev \ xvfb libglu1-mesa-dev libxrandr-dev libxinerama-dev libxi-dev libxcursor-dev xutils-dev \ - mesa-utils libxxf86vm-dev x11proto-xf86vidmode-dev && \ + mesa-utils libxxf86vm-dev x11proto-xf86vidmode-dev cmake && \ pip install awscli diff --git a/docker/george-edison55-precise-backports.gpg.key b/docker/george-edison55-precise-backports.gpg.key new file mode 100644 index 000000000..69971cfce --- /dev/null +++ b/docker/george-edison55-precise-backports.gpg.key @@ -0,0 +1,13 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: SKS 1.1.5 +Comment: Hostname: keyserver.ubuntu.com + +mI0ETFYUegEEAMF062ZPYWxX0blpJpLCz/oEXwvxJoQg1Sz4uD4Fs1FCfRwHMlydwbGvEjEr +QG39OXf1y1+lGVI73BLcuDd/n0yBLN9brycDspZKnQ25VaRB6sl8EDR8XM5tiA/diW1EIygS +Ad/NuwXv236e+1E+zvik6faeoxygJbbj0KN67Hx7ABEBAAG0HUxhdW5jaHBhZCBHZW9yZ2Ug +RWRpc29uJ3MgUFBBiLYEEwECACAFAkxWFHoCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK +CRAITs/Fgoq3JpJ0A/9RquDizs5oUhyqqT4t4EHEIH9+ckl/3cQj0peN5APA5TOqAS4iVxic +GO3YB7yY4a+v5qQUalOMNAQRUigi3IwCcOSs94Bt5f7lK6xbU7mIO2D5a7cUCjN36FXe+oWp +4s5odz5+9OZrIVzJw/NOdgneLqh2ts5jWGYmOg7POJk9mQ== +=ItbQ +-----END PGP PUBLIC KEY BLOCK----- diff --git a/docker/george-edison55-precise-backports.list b/docker/george-edison55-precise-backports.list new file mode 100644 index 000000000..2bae784dd --- /dev/null +++ b/docker/george-edison55-precise-backports.list @@ -0,0 +1,2 @@ +deb http://ppa.launchpad.net/george-edison55/precise-backports/ubuntu precise main +deb-src http://ppa.launchpad.net/george-edison55/precise-backports/ubuntu precise main diff --git a/docker/launchpad.gpg.key b/docker/launchpad.gpg.key deleted file mode 100644 index ebe1b1ec3..000000000 --- a/docker/launchpad.gpg.key +++ /dev/null @@ -1,13 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v1 - -mI0ESuBvRwEEAMi4cDba7xlKaaoXjO1n1HX8RKrkW+HEIl79nSOSJyvzysajs7zU -ow/OzCQp9NswqrDmNuH1+lPTTRNAGtK8r2ouq2rnXT1mTl23dpgHZ9spseR73s4Z -BGw/ag4bpU5dNUStvfmHhIjVCuiSpNn7cyy1JSSvSs3N2mxteKjXLBf7ABEBAAG0 -GkxhdW5jaHBhZCBUb29sY2hhaW4gYnVpbGRziLYEEwECACAFAkrgb0cCGwMGCwkI -BwMCBBUCCAMEFgIDAQIeAQIXgAAKCRAek3eiup7yfzGKA/4xzUqNACSlB+k+DxFF -HqkwKa/ziFiAlkLQyyhm+iqz80htRZr7Ls/ZRYZl0aSU56/hLe0V+TviJ1s8qdN2 -lamkKdXIAFfavA04nOnTzyIBJ82EAUT3Nh45skMxo4z4iZMNmsyaQpNl/m/lNtOL -hR64v5ZybofB2EWkMxUzX8D/FQ== -=LcUQ ------END PGP PUBLIC KEY BLOCK----- diff --git a/docker/llvm-snapshot.gpg.key b/docker/llvm-snapshot.gpg.key deleted file mode 100644 index aa6b105aa..000000000 --- a/docker/llvm-snapshot.gpg.key +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v1.4.12 (GNU/Linux) - -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 -bXb5c6gCHESH5PXwPU4jQEE7Ib9J6sbk7ZT2Mw== -=j+4q ------END PGP PUBLIC KEY BLOCK----- diff --git a/docker/llvm.list b/docker/llvm.list deleted file mode 100644 index 2ca079d9d..000000000 --- a/docker/llvm.list +++ /dev/null @@ -1,2 +0,0 @@ -deb http://llvm.org/apt/precise/ llvm-toolchain-precise main -deb-src http://llvm.org/apt/precise/ llvm-toolchain-precise main diff --git a/docker/ubuntu-toolchain-r.gpg.key b/docker/ubuntu-toolchain-r.gpg.key new file mode 100644 index 000000000..854eef852 --- /dev/null +++ b/docker/ubuntu-toolchain-r.gpg.key @@ -0,0 +1,13 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: SKS 1.1.5 +Comment: Hostname: keyserver.ubuntu.com + +mI0ESuBvRwEEAMi4cDba7xlKaaoXjO1n1HX8RKrkW+HEIl79nSOSJyvzysajs7zUow/OzCQp +9NswqrDmNuH1+lPTTRNAGtK8r2ouq2rnXT1mTl23dpgHZ9spseR73s4ZBGw/ag4bpU5dNUSt +vfmHhIjVCuiSpNn7cyy1JSSvSs3N2mxteKjXLBf7ABEBAAG0GkxhdW5jaHBhZCBUb29sY2hh +aW4gYnVpbGRziLYEEwECACAFAkrgb0cCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRAe +k3eiup7yfzGKA/4xzUqNACSlB+k+DxFFHqkwKa/ziFiAlkLQyyhm+iqz80htRZr7Ls/ZRYZl +0aSU56/hLe0V+TviJ1s8qdN2lamkKdXIAFfavA04nOnTzyIBJ82EAUT3Nh45skMxo4z4iZMN +msyaQpNl/m/lNtOLhR64v5ZybofB2EWkMxUzX8D/FQ== +=LcUQ +-----END PGP PUBLIC KEY BLOCK----- \ No newline at end of file diff --git a/docker/ubuntu-toolchain-r.list b/docker/ubuntu-toolchain-r.list index 2ff8535f9..741f4528e 100644 --- a/docker/ubuntu-toolchain-r.list +++ b/docker/ubuntu-toolchain-r.list @@ -1,2 +1,2 @@ deb http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu precise main -deb-src http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu precise main +deb-src http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu precise main \ No newline at end of file diff --git a/mbgl.gypi b/mbgl.gypi deleted file mode 100644 index 7f31d4619..000000000 --- a/mbgl.gypi +++ /dev/null @@ -1,341 +0,0 @@ -{ - 'target_defaults': { - 'default_configuration': 'Release', - 'conditions': [ - ['OS=="mac"', { - 'xcode_settings': { - 'CLANG_CXX_LIBRARY': 'libc++', - 'GCC_VERSION': 'com.apple.compilers.llvm.clang.1_0', - 'GCC_ENABLE_CPP_EXCEPTIONS': 'YES', - 'GCC_ENABLE_CPP_RTTI': 'YES', - 'OTHER_CPLUSPLUSFLAGS': [ - '-std=c++14', - '-Werror', - '-Wall', - '-Wextra', - '-Wshadow', - '-Wno-variadic-macros', - '-frtti', - '-fexceptions', - '${CFLAGS}', - ], - 'GCC_WARN_PEDANTIC': 'YES', - 'GCC_WARN_UNINITIALIZED_AUTOS': 'YES_AGGRESSIVE', - 'MACOSX_DEPLOYMENT_TARGET': '10.10', - 'ALWAYS_SEARCH_USER_PATHS': 'NO', - 'COMBINE_HIDPI_IMAGES': 'YES', - }, - }, { - 'cflags_cc': [ - '-std=c++14', - '-Werror', - '-Wall', - '-Wextra', - '-Wshadow', - '-Wno-variadic-macros', - '-Wno-error=unused-parameter', - '-frtti', - '-fexceptions', - '${CFLAGS}', - ], - }], - ['OS=="linux"', { - 'cflags_cc': [ - '-Wno-unknown-pragmas', # We are using '#pragma mark', but it is only available on Darwin. - ], - }], - ], - 'target_conditions': [ - ['_type == "static_library"', { - 'conditions': [ - ['OS=="mac"', { - 'xcode_settings': { - 'OTHER_CPLUSPLUSFLAGS': [ '-fPIC' ], - 'SKIP_INSTALL': 'YES', - }, - }, { - 'cflags_cc': [ '-fPIC' ], - }], - ], - }], - ], - 'configurations': { - 'Debug': { - 'conditions': [ - ['OS=="mac"', { - 'xcode_settings': { - 'DEBUG_INFORMATION_FORMAT': 'dwarf', - 'GCC_OPTIMIZATION_LEVEL': '0', - 'GCC_GENERATE_DEBUGGING_SYMBOLS': 'YES', - 'GCC_INLINES_ARE_PRIVATE_EXTERN': 'YES', - 'DEAD_CODE_STRIPPING': 'NO', - 'OTHER_CPLUSPLUSFLAGS': [ '-fno-omit-frame-pointer','-fwrapv', '-fstack-protector-all', '-fno-common' ], - 'conditions': [ - ['coverage', { - 'GCC_INSTRUMENT_PROGRAM_FLOW_ARCS': 'YES', - 'GCC_GENERATE_TEST_COVERAGE_FILES': 'YES', - 'OTHER_CPLUSPLUSFLAGS': [ '--coverage' ], - }], - ], - }, - }, { - 'cflags_cc': [ '-g', '-O0', '-fno-omit-frame-pointer','-fwrapv', '-fstack-protector-all', '-fno-common' ], - 'conditions': [ - ['coverage', { 'cflags_cc': [ '--coverage' ] }], - ], - }], - ], - 'defines': [ 'DEBUG' ], - 'target_conditions': [ - ['_type == "executable"', { - 'conditions': [ - ['OS=="mac" and coverage', { - 'xcode_settings': { 'OTHER_LDFLAGS': [ '--coverage' ] }, - }, { - 'ldflags': [ '--coverage' ], - }], - ], - }], - ], - }, - 'Release': { - 'defines': [ 'NDEBUG' ], - 'conditions': [ - ['OS=="mac"', { - 'xcode_settings': { - 'GCC_OPTIMIZATION_LEVEL': '3', - 'GCC_GENERATE_DEBUGGING_SYMBOLS': 'YES', - 'GCC_INLINES_ARE_PRIVATE_EXTERN': 'YES', - 'DEAD_CODE_STRIPPING': 'NO', - }, - }, 'OS=="android"', { - 'cflags_cc': [ '-g', '-Os', '-fvisibility=hidden' ], - }, { - 'cflags_cc': [ '-g', '-O3' ], - }], - ], - }, - }, - }, - 'configurations': { - 'Debug': { - 'xcode_settings': { - 'ENABLE_TESTABILITY': 'YES', - 'ONLY_ACTIVE_ARCH': 'YES', - }, - }, - }, - 'targets': [ - { - 'target_name': 'headers', - 'type': 'none', - - 'sources': [ - ' BuildLocationStyle - UseAppPreferences + CustomLocation + CustomBuildIntermediatesPath + ../../build/ios CustomBuildLocationType - RelativeToDerivedData + RelativeToWorkspace + CustomBuildProductsPath + ../../build/ios DerivedDataCustomLocation - ../../build + ../../build/ios DerivedDataLocationStyle WorkspaceRelativePath IssueFilterStyle diff --git a/platform/ios/bitrise.yml b/platform/ios/bitrise.yml index 6e4771273..f87a97b7d 100644 --- a/platform/ios/bitrise.yml +++ b/platform/ios/bitrise.yml @@ -29,6 +29,7 @@ workflows: - content: |- #!/bin/bash set -eu -o pipefail + brew install cmake brew tap mapbox/homebrew-ios-sim-3 brew install mapbox/homebrew-ios-sim-3/ios-sim gem install xcpretty --no-rdoc --no-ri diff --git a/platform/ios/config.cmake b/platform/ios/config.cmake new file mode 100644 index 000000000..28bef0cfe --- /dev/null +++ b/platform/ios/config.cmake @@ -0,0 +1,60 @@ +macro(mbgl_platform_core) + set_xcode_property(mbgl-core IPHONEOS_DEPLOYMENT_TARGET "8.0") + set_xcode_property(mbgl-core ENABLE_BITCODE "YES") + set_xcode_property(mbgl-core BITCODE_GENERATION_MODE bitcode) + + target_sources(mbgl-core + # Loop + PRIVATE platform/darwin/src/async_task.cpp + PRIVATE platform/darwin/src/run_loop.cpp + PRIVATE platform/darwin/src/timer.cpp + + # File source + PRIVATE platform/darwin/src/http_file_source.mm + PRIVATE platform/default/asset_file_source.cpp + PRIVATE platform/default/default_file_source.cpp + PRIVATE platform/default/online_file_source.cpp + + # Offline + PRIVATE platform/default/mbgl/storage/offline.cpp + PRIVATE platform/default/mbgl/storage/offline_database.cpp + PRIVATE platform/default/mbgl/storage/offline_database.hpp + PRIVATE platform/default/mbgl/storage/offline_download.cpp + PRIVATE platform/default/mbgl/storage/offline_download.hpp + PRIVATE platform/default/sqlite3.cpp + PRIVATE platform/default/sqlite3.hpp + + # Misc + PRIVATE platform/darwin/src/log_nslog.mm + PRIVATE platform/darwin/src/nsthread.mm + PRIVATE platform/darwin/src/reachability.m + PRIVATE platform/darwin/src/string_nsstring.mm + + # Image handling + PRIVATE platform/darwin/src/image.mm + + # Headless view + PRIVATE platform/darwin/src/headless_view_eagl.mm + PRIVATE platform/default/headless_display.cpp + PRIVATE platform/default/headless_view.cpp + ) + + target_compile_options(mbgl-core + PRIVATE -fobjc-arc + ) + + # TODO: Remove this by converting to ARC + set_source_files_properties( + platform/darwin/src/headless_view_eagl.mm + PROPERTIES + COMPILE_FLAGS -fno-objc-arc + ) + + target_include_directories(mbgl-core + PRIVATE platform/default + ) + + target_link_libraries(mbgl-core + PUBLIC -lz + ) +endmacro() \ No newline at end of file diff --git a/platform/ios/ios.xcodeproj/project.pbxproj b/platform/ios/ios.xcodeproj/project.pbxproj index bfd5a5e8a..8fe54e771 100644 --- a/platform/ios/ios.xcodeproj/project.pbxproj +++ b/platform/ios/ios.xcodeproj/project.pbxproj @@ -25,6 +25,7 @@ 40EDA1C21CFE0E0500D9EA68 /* MGLAnnotationContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 40EDA1BE1CFE0D4A00D9EA68 /* MGLAnnotationContainerView.m */; }; 40FDA76B1CCAAA6800442548 /* MBXAnnotationView.m in Sources */ = {isa = PBXBuildFile; fileRef = 40FDA76A1CCAAA6800442548 /* MBXAnnotationView.m */; }; 554180421D2E97DE00012372 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 554180411D2E97DE00012372 /* OpenGLES.framework */; }; + 55D8C9961D0F18CE00F42F10 /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 55D8C9951D0F18CE00F42F10 /* libsqlite3.tbd */; }; DA0CD5901CF56F6A00A5F5A5 /* MGLFeatureTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = DA0CD58F1CF56F6A00A5F5A5 /* MGLFeatureTests.mm */; }; DA17BE301CC4BAC300402C41 /* MGLMapView_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = DA17BE2F1CC4BAC300402C41 /* MGLMapView_Internal.h */; }; DA17BE311CC4BDAA00402C41 /* MGLMapView_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = DA17BE2F1CC4BAC300402C41 /* MGLMapView_Internal.h */; }; @@ -156,7 +157,6 @@ DA88488B1CBB037E00AB86E3 /* SMCalloutView.h in Headers */ = {isa = PBXBuildFile; fileRef = DA8848891CBB037E00AB86E3 /* SMCalloutView.h */; }; DA88488C1CBB037E00AB86E3 /* SMCalloutView.m in Sources */ = {isa = PBXBuildFile; fileRef = DA88488A1CBB037E00AB86E3 /* SMCalloutView.m */; }; DA88488E1CBB047F00AB86E3 /* reachability.h in Headers */ = {isa = PBXBuildFile; fileRef = DA88488D1CBB047F00AB86E3 /* reachability.h */; }; - DA8848901CBB048E00AB86E3 /* reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = DA88488F1CBB048E00AB86E3 /* reachability.m */; }; DA8933A31CCC95B000E68420 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = DA89339F1CCC951200E68420 /* Localizable.strings */; }; DA8933BC1CCD2CA100E68420 /* Foundation.strings in Resources */ = {isa = PBXBuildFile; fileRef = DA8933BA1CCD2CA100E68420 /* Foundation.strings */; }; DA8933BF1CCD2CAD00E68420 /* Foundation.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = DA8933BD1CCD2CAD00E68420 /* Foundation.stringsdict */; }; @@ -200,7 +200,6 @@ DAA4E4291CBB730400178DFB /* NSBundle+MGLAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8848131CBAFA6200AB86E3 /* NSBundle+MGLAdditions.m */; }; DAA4E42A1CBB730400178DFB /* NSProcessInfo+MGLAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8848161CBAFA6200AB86E3 /* NSProcessInfo+MGLAdditions.m */; }; DAA4E42B1CBB730400178DFB /* NSString+MGLAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8848181CBAFA6200AB86E3 /* NSString+MGLAdditions.m */; }; - DAA4E42C1CBB730400178DFB /* reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = DA88488F1CBB048E00AB86E3 /* reachability.m */; }; DAA4E42D1CBB730400178DFB /* MGLAnnotationImage.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8848411CBAFB9800AB86E3 /* MGLAnnotationImage.m */; }; DAA4E42E1CBB730400178DFB /* MGLAPIClient.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8848431CBAFB9800AB86E3 /* MGLAPIClient.m */; }; DAA4E42F1CBB730400178DFB /* MGLCompactCalloutView.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8848451CBAFB9800AB86E3 /* MGLCompactCalloutView.m */; }; @@ -211,7 +210,6 @@ DAA4E4341CBB730400178DFB /* MGLUserLocationAnnotationView.m in Sources */ = {isa = PBXBuildFile; fileRef = DA88484E1CBAFB9800AB86E3 /* MGLUserLocationAnnotationView.m */; }; DAA4E4351CBB730400178DFB /* SMCalloutView.m in Sources */ = {isa = PBXBuildFile; fileRef = DA88488A1CBB037E00AB86E3 /* SMCalloutView.m */; }; DAABF73D1CBC59BB005B1825 /* libmbgl-core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAABF73B1CBC59BB005B1825 /* libmbgl-core.a */; }; - DAABF73E1CBC59BB005B1825 /* libmbgl-platform-ios.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAABF73C1CBC59BB005B1825 /* libmbgl-platform-ios.a */; }; DABCABAC1CB80692000A7C39 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = DABCABAB1CB80692000A7C39 /* main.m */; }; DABCABAF1CB80692000A7C39 /* MBXBenchAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = DABCABAE1CB80692000A7C39 /* MBXBenchAppDelegate.m */; }; DABCABB21CB80692000A7C39 /* MBXBenchViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = DABCABB11CB80692000A7C39 /* MBXBenchViewController.mm */; }; @@ -349,6 +347,8 @@ 40FDA7691CCAAA6800442548 /* MBXAnnotationView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MBXAnnotationView.h; sourceTree = ""; }; 40FDA76A1CCAAA6800442548 /* MBXAnnotationView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MBXAnnotationView.m; sourceTree = ""; }; 554180411D2E97DE00012372 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; + 55D8C9941D0F133500F42F10 /* config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = config.xcconfig; path = ../../build/ios/config.xcconfig; sourceTree = ""; }; + 55D8C9951D0F18CE00F42F10 /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; }; DA0CD58F1CF56F6A00A5F5A5 /* MGLFeatureTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MGLFeatureTests.mm; path = ../../darwin/test/MGLFeatureTests.mm; sourceTree = ""; }; DA17BE2F1CC4BAC300402C41 /* MGLMapView_Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLMapView_Internal.h; sourceTree = ""; }; DA1DC94A1CB6C1C2006E619F /* Mapbox GL.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Mapbox GL.app"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -495,7 +495,6 @@ DAA4E4061CBB5CBF00178DFB /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; DAA4E4131CBB71D400178DFB /* libMapbox.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMapbox.a; sourceTree = BUILT_PRODUCTS_DIR; }; DAABF73B1CBC59BB005B1825 /* libmbgl-core.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libmbgl-core.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - DAABF73C1CBC59BB005B1825 /* libmbgl-platform-ios.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libmbgl-platform-ios.a"; sourceTree = BUILT_PRODUCTS_DIR; }; DABCABA81CB80692000A7C39 /* Bench GL.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Bench GL.app"; sourceTree = BUILT_PRODUCTS_DIR; }; DABCABAB1CB80692000A7C39 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; DABCABAD1CB80692000A7C39 /* MBXBenchAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MBXBenchAppDelegate.h; sourceTree = ""; }; @@ -507,7 +506,6 @@ DABCABBB1CB80692000A7C39 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; DABCABBF1CB80717000A7C39 /* locations.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = locations.cpp; sourceTree = ""; }; DABCABC01CB80717000A7C39 /* locations.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = locations.hpp; sourceTree = ""; }; - DAC07C961CBB2CD6000CB309 /* mbgl.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = mbgl.xcconfig; path = ../../build/ios/mbgl.xcconfig; sourceTree = ""; }; DAC49C621CD07D74009E1AA3 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = en; path = en.lproj/Localizable.stringsdict; sourceTree = ""; }; DAD165691CF41981001FF4B9 /* MGLFeature.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLFeature.h; sourceTree = ""; }; DAD1656A1CF41981001FF4B9 /* MGLFeature_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLFeature_Private.h; sourceTree = ""; }; @@ -539,7 +537,7 @@ buildActionMask = 2147483647; files = ( DAABF73D1CBC59BB005B1825 /* libmbgl-core.a in Frameworks */, - DAABF73E1CBC59BB005B1825 /* libmbgl-platform-ios.a in Frameworks */, + 55D8C9961D0F18CE00F42F10 /* libsqlite3.tbd in Frameworks */, DA27C24E1CBB3811000B0ECD /* GLKit.framework in Frameworks */, DAA4E4051CBB5C9E00178DFB /* ImageIO.framework in Frameworks */, DAA4E4071CBB5CBF00178DFB /* MobileCoreServices.framework in Frameworks */, @@ -643,8 +641,8 @@ 36F1153B1D46080700878E1A /* libmbgl-core.a */, 36F1153C1D46080700878E1A /* libmbgl-platform-ios.a */, 554180411D2E97DE00012372 /* OpenGLES.framework */, + 55D8C9951D0F18CE00F42F10 /* libsqlite3.tbd */, DAABF73B1CBC59BB005B1825 /* libmbgl-core.a */, - DAABF73C1CBC59BB005B1825 /* libmbgl-platform-ios.a */, DAA4E4021CBB5C2F00178DFB /* CoreGraphics.framework */, DA27C24D1CBB3811000B0ECD /* GLKit.framework */, DAA4E4041CBB5C9E00178DFB /* ImageIO.framework */, @@ -848,7 +846,7 @@ isa = PBXGroup; children = ( DA35A2D11CCAB25200E826B2 /* jazzy.yml */, - DAC07C961CBB2CD6000CB309 /* mbgl.xcconfig */, + 55D8C9941D0F133500F42F10 /* config.xcconfig */, ); name = Configuration; sourceTree = ""; @@ -1399,7 +1397,6 @@ DA88488C1CBB037E00AB86E3 /* SMCalloutView.m in Sources */, DA35A2B81CCA9A5D00E826B2 /* MGLClockDirectionFormatter.m in Sources */, DAD1657A1CF4CDFF001FF4B9 /* MGLShapeCollection.m in Sources */, - DA8848901CBB048E00AB86E3 /* reachability.m in Sources */, DA8848211CBAFA6200AB86E3 /* MGLOfflinePack.mm in Sources */, DA8848591CBAFB9800AB86E3 /* MGLMapView.mm in Sources */, DA8848501CBAFB9800AB86E3 /* MGLAnnotationImage.m in Sources */, @@ -1457,7 +1454,6 @@ DAA4E41E1CBB730400178DFB /* MGLMapCamera.mm in Sources */, 4018B1C81CDC287F00F666AF /* MGLAnnotationView.mm in Sources */, DAA4E4341CBB730400178DFB /* MGLUserLocationAnnotationView.m in Sources */, - DAA4E42C1CBB730400178DFB /* reachability.m in Sources */, DAA4E4311CBB730400178DFB /* MGLMapboxEvents.m in Sources */, DAA4E4231CBB730400178DFB /* MGLPolygon.mm in Sources */, DAA4E42A1CBB730400178DFB /* NSProcessInfo+MGLAdditions.m in Sources */, @@ -1703,9 +1699,9 @@ }; DA2E885A1CC036F400F24E7B /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DAC07C961CBB2CD6000CB309 /* mbgl.xcconfig */; + baseConfigurationReference = 55D8C9941D0F133500F42F10 /* config.xcconfig */; buildSettings = { - HEADER_SEARCH_PATHS = ../../include; + HEADER_SEARCH_PATHS = "$(mbgl_core_INCLUDE_DIRECTORIES)"; INFOPLIST_FILE = test/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; @@ -1722,9 +1718,9 @@ }; DA2E885B1CC036F400F24E7B /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DAC07C961CBB2CD6000CB309 /* mbgl.xcconfig */; + baseConfigurationReference = 55D8C9941D0F133500F42F10 /* config.xcconfig */; buildSettings = { - HEADER_SEARCH_PATHS = ../../include; + HEADER_SEARCH_PATHS = "$(mbgl_core_INCLUDE_DIRECTORIES)"; INFOPLIST_FILE = test/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; @@ -1741,7 +1737,7 @@ }; DA8847DB1CBAF91600AB86E3 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DAC07C961CBB2CD6000CB309 /* mbgl.xcconfig */; + baseConfigurationReference = 55D8C9941D0F133500F42F10 /* config.xcconfig */; buildSettings = { BITCODE_GENERATION_MODE = bitcode; CURRENT_PROJECT_VERSION = 1; @@ -1749,11 +1745,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - HEADER_SEARCH_PATHS = ( - ../default, - ../../include, - ../../src, - ); + HEADER_SEARCH_PATHS = "$(mbgl_core_INCLUDE_DIRECTORIES)"; INFOPLIST_FILE = framework/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; @@ -1767,12 +1759,7 @@ "$(geometry_cflags)", "$(geojson_cflags)", ); - OTHER_LDFLAGS = ( - "$(sqlite_ldflags)", - "$(zlib_ldflags)", - "$(opengl_ldflags)", - "$(geojson_static_libs)", - ); + OTHER_LDFLAGS = "$(mbgl_core_LINK_LIBRARIES)"; PRODUCT_BUNDLE_IDENTIFIER = com.mapbox.sdk.ios; PRODUCT_NAME = Mapbox; SKIP_INSTALL = YES; @@ -1783,7 +1770,7 @@ }; DA8847DC1CBAF91600AB86E3 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DAC07C961CBB2CD6000CB309 /* mbgl.xcconfig */; + baseConfigurationReference = 55D8C9941D0F133500F42F10 /* config.xcconfig */; buildSettings = { BITCODE_GENERATION_MODE = bitcode; CURRENT_PROJECT_VERSION = 1; @@ -1791,11 +1778,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - HEADER_SEARCH_PATHS = ( - ../default, - ../../include, - ../../src, - ); + HEADER_SEARCH_PATHS = "$(mbgl_core_INCLUDE_DIRECTORIES)"; INFOPLIST_FILE = framework/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; @@ -1809,12 +1792,7 @@ "$(geometry_cflags)", "$(geojson_cflags)", ); - OTHER_LDFLAGS = ( - "$(sqlite_ldflags)", - "$(zlib_ldflags)", - "$(opengl_ldflags)", - "$(geojson_static_libs)", - ); + OTHER_LDFLAGS = "$(mbgl_core_LINK_LIBRARIES)"; PRODUCT_BUNDLE_IDENTIFIER = com.mapbox.sdk.ios; PRODUCT_NAME = Mapbox; SKIP_INSTALL = YES; @@ -1847,18 +1825,10 @@ }; DAA4E41A1CBB71D500178DFB /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DAC07C961CBB2CD6000CB309 /* mbgl.xcconfig */; + baseConfigurationReference = 55D8C9941D0F133500F42F10 /* config.xcconfig */; buildSettings = { BITCODE_GENERATION_MODE = bitcode; - HEADER_SEARCH_PATHS = ( - ../default, - ../../include, - ../../src, - ); - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/build/Debug-iphoneos", - ); + HEADER_SEARCH_PATHS = "$(mbgl_core_INCLUDE_DIRECTORIES)"; OTHER_CPLUSPLUSFLAGS = ( "$(OTHER_CFLAGS)", "$(sqlite_cflags)", @@ -1870,10 +1840,7 @@ ); OTHER_LDFLAGS = ( "-ObjC", - "$(sqlite_ldflags)", - "$(zlib_ldflags)", - "$(opengl_ldflags)", - "$(geojson_static_libs)", + "$(mbgl_core_LINK_LIBRARIES)", ); PRODUCT_NAME = Mapbox; PUBLIC_HEADERS_FOLDER_PATH = Headers; @@ -1883,18 +1850,10 @@ }; DAA4E41B1CBB71D500178DFB /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DAC07C961CBB2CD6000CB309 /* mbgl.xcconfig */; + baseConfigurationReference = 55D8C9941D0F133500F42F10 /* config.xcconfig */; buildSettings = { BITCODE_GENERATION_MODE = bitcode; - HEADER_SEARCH_PATHS = ( - ../default, - ../../include, - ../../src, - ); - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/build/Debug-iphoneos", - ); + HEADER_SEARCH_PATHS = "$(mbgl_core_INCLUDE_DIRECTORIES)"; OTHER_CPLUSPLUSFLAGS = ( "$(OTHER_CFLAGS)", "$(sqlite_cflags)", @@ -1906,10 +1865,7 @@ ); OTHER_LDFLAGS = ( "-ObjC", - "$(sqlite_ldflags)", - "$(zlib_ldflags)", - "$(opengl_ldflags)", - "$(geojson_static_libs)", + "$(mbgl_core_LINK_LIBRARIES)", ); PRODUCT_NAME = Mapbox; PUBLIC_HEADERS_FOLDER_PATH = Headers; diff --git a/platform/ios/ios.xcworkspace/contents.xcworkspacedata b/platform/ios/ios.xcworkspace/contents.xcworkspacedata index 929ade2fe..08503d2be 100644 --- a/platform/ios/ios.xcworkspace/contents.xcworkspacedata +++ b/platform/ios/ios.xcworkspace/contents.xcworkspacedata @@ -11,6 +11,6 @@ location = "group:uitest/KIF/KIF.xcodeproj"> + location = "group:../../build/ios/mbgl.xcodeproj"> diff --git a/platform/ios/platform.gyp b/platform/ios/platform.gyp deleted file mode 100644 index 4cb26091d..000000000 --- a/platform/ios/platform.gyp +++ /dev/null @@ -1,149 +0,0 @@ -{ - 'variables': { - 'loop_lib': 'darwin', - 'headless_lib': 'eagl', - 'coverage': 0, - }, - 'includes': [ - '../../build/ios/config.gypi', - '../../mbgl.gypi', - '../../test/test.gypi', - ], - 'target_defaults': { - 'target_conditions': [ - ['_type == "static_library"', { - 'xcode_settings': { - 'SDKROOT': 'iphoneos', - 'SUPPORTED_PLATFORMS': 'iphonesimulator iphoneos', - 'IPHONEOS_DEPLOYMENT_TARGET': '7.0', - 'TARGETED_DEVICE_FAMILY': '1,2', - 'GCC_VERSION': 'com.apple.compilers.llvm.clang.1_0', - 'CODE_SIGN_IDENTITY': 'iPhone Developer', - }, - }], - ], - }, - 'targets': [ - { - 'target_name': 'test', - 'type': 'executable', - 'product_name': 'ios-test', - 'product_extension': 'app', - 'mac_bundle': 1, - - 'dependencies': [ - 'test-lib', - 'platform-lib', - ], - - 'sources': [ - '../../test/src/main.mm', -# '../../src/mbgl/util/premultiply.cpp', - ], - - 'xcode_settings': { - 'SDKROOT': 'iphoneos', - 'SUPPORTED_PLATFORMS': 'iphonesimulator iphoneos', - 'INFOPLIST_FILE': '../../test/src/app-info.plist', - 'IPHONEOS_DEPLOYMENT_TARGET': '8.0', - 'TARGETED_DEVICE_FAMILY': '1,2', - 'COPY_PHASE_STRIP': 'NO', - 'CLANG_ENABLE_OBJC_ARC': 'YES', - 'CLANG_ENABLE_MODULES': 'YES', - 'CODE_SIGN_IDENTITY': 'iPhone Developer', - 'PRODUCT_BUNDLE_IDENTIFIER': 'com.mapbox.MapboxGLUnitTest', - }, - - 'copies': [{ - 'destination': '<(PRODUCT_DIR)/$(WRAPPER_NAME)/test', - 'files': [ '../../test/fixtures' ], - }], - - 'link_settings': { - 'libraries': [ - '$(SDKROOT)/System/Library/Frameworks/CoreGraphics.framework', - '$(SDKROOT)/System/Library/Frameworks/GLKit.framework', - '$(SDKROOT)/System/Library/Frameworks/ImageIO.framework', - '$(SDKROOT)/System/Library/Frameworks/MobileCoreServices.framework', - '$(SDKROOT)/System/Library/Frameworks/OpenGLES.framework', - ], - }, - }, - { - 'target_name': 'platform-lib', - 'product_name': 'mbgl-platform-ios', - 'type': 'static_library', - 'standalone_static_library': 1, - 'hard_dependency': 1, - 'dependencies': [ - 'core', - ], - - 'include_dirs': [ - 'include', - '../darwin/include', - '../default', - '../../include', - '../../src', # TODO: eliminate - '<(SHARED_INTERMEDIATE_DIR)/include', - ], - - 'sources': [ - '../default/asset_file_source.cpp', - '../default/default_file_source.cpp', - '../default/online_file_source.cpp', - '../default/mbgl/storage/offline.hpp', - '../default/mbgl/storage/offline.cpp', - '../default/mbgl/storage/offline_database.hpp', - '../default/mbgl/storage/offline_database.cpp', - '../default/mbgl/storage/offline_download.hpp', - '../default/mbgl/storage/offline_download.cpp', - '../default/sqlite3.hpp', - '../default/sqlite3.cpp', - '../darwin/src/http_file_source.mm', - '../darwin/src/log_nslog.mm', - '../darwin/src/string_nsstring.mm', - '../darwin/src/image.mm', - '../darwin/src/nsthread.mm', - '../darwin/src/reachability.m', - ], - - 'variables': { - 'cflags_cc': [ - '<@(sqlite_cflags)', - '<@(zlib_cflags)', - '<@(rapidjson_cflags)', - ], - 'ldflags': [ - '<@(sqlite_ldflags)', - '<@(zlib_ldflags)', - ], - 'libraries': [ - '<@(sqlite_static_libs)', - '<@(zlib_static_libs)', - ], - }, - - 'xcode_settings': { - 'OTHER_CPLUSPLUSFLAGS': [ '<@(cflags_cc)' ], - 'CLANG_ENABLE_OBJC_ARC': 'YES', - 'CLANG_ENABLE_MODULES': 'YES', - }, - - 'conditions': [ - ['OS == "mac"', { - 'xcode_settings': { - 'BITCODE_GENERATION_MODE': 'bitcode', - }, - },], - ], - - 'link_settings': { - 'libraries': [ '<@(libraries)' ], - 'xcode_settings': { - 'OTHER_LDFLAGS': [ '<@(ldflags)' ], - }, - }, - }, - ], -} diff --git a/platform/ios/scripts/configure.sh b/platform/ios/scripts/configure.sh deleted file mode 100644 index 82599f0fe..000000000 --- a/platform/ios/scripts/configure.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash - -UNIQUE_RESOURCE_VERSION=dev -PROTOZERO_VERSION=1.3.0 -BOOST_VERSION=1.60.0 -SQLITE_VERSION=system -ZLIB_VERSION=system -GEOMETRY_VERSION=0.8.0 -GEOJSON_VERSION=0.1.4 -GEOJSONVT_VERSION=6.1.2 -SUPERCLUSTER_VERSION=0.2.0 -KDBUSH_VERSION=0.1.1 -VARIANT_VERSION=1.1.0 -RAPIDJSON_VERSION=1.0.2 -GTEST_VERSION=1.7.0 -PIXELMATCH_VERSION=0.9.0 -EARCUT_VERSION=0.11 diff --git a/platform/ios/scripts/package.sh b/platform/ios/scripts/package.sh index c01293420..b431bd689 100755 --- a/platform/ios/scripts/package.sh +++ b/platform/ios/scripts/package.sh @@ -5,9 +5,9 @@ set -o pipefail set -u NAME=Mapbox -OUTPUT=build/ios/pkg +OUTPUT=platform/ios/pkg DERIVED_DATA=build/ios -PRODUCTS=${DERIVED_DATA}/Build/Products +PRODUCTS=${DERIVED_DATA} BUILDTYPE=${BUILDTYPE:-Debug} BUILD_FOR_DEVICE=${BUILD_DEVICE:-true} @@ -150,7 +150,7 @@ if [[ "${BUILD_FOR_DEVICE}" == true ]]; then ${PRODUCTS}/${BUILDTYPE}-iphonesimulator/${NAME}.framework/${NAME} \ -create -output ${OUTPUT}/dynamic/${NAME}.framework/${NAME} | echo fi - + cp -rv ${PRODUCTS}/${BUILDTYPE}-iphoneos/Settings.bundle ${STATIC_SETTINGS_DIR} else if [[ ${BUILD_STATIC} == true ]]; then @@ -175,7 +175,7 @@ else ${OUTPUT}/dynamic/ fi fi - + cp -rv ${PRODUCTS}/${BUILDTYPE}-iphonesimulator/Settings.bundle ${STATIC_SETTINGS_DIR} fi diff --git a/platform/ios/toolchain.cmake b/platform/ios/toolchain.cmake new file mode 100644 index 000000000..60dbac07c --- /dev/null +++ b/platform/ios/toolchain.cmake @@ -0,0 +1,136 @@ +# From https://github.com/OtherLevels/ios-cmake +# This file is based off of the Platform/Darwin.cmake and Platform/UnixPaths.cmake +# files which are included with CMake 2.8.4 +# It has been altered for iOS development + +# Options: +# +# IOS_PLATFORM = OS (default) or SIMULATOR or SIMULATOR64 +# This decides if SDKS will be selected from the iPhoneOS.platform or iPhoneSimulator.platform folders +# OS - the default, used to build for iPhone and iPad physical devices, which have an arm arch. +# SIMULATOR - used to build for the Simulator platforms, which have an x86 arch. +# +# CMAKE_IOS_DEVELOPER_ROOT = automatic(default) or /path/to/platform/Developer folder +# By default this location is automatcially chosen based on the IOS_PLATFORM value above. +# If set manually, it will override the default location and force the user of a particular Developer Platform +# +# CMAKE_IOS_SDK_ROOT = automatic(default) or /path/to/platform/Developer/SDKs/SDK folder +# By default this location is automatcially chosen based on the CMAKE_IOS_DEVELOPER_ROOT value. +# In this case it will always be the most up-to-date SDK found in the CMAKE_IOS_DEVELOPER_ROOT path. +# If set manually, this will force the use of a specific SDK version + +# Macros: +# +# set_xcode_property (TARGET XCODE_PROPERTY XCODE_VALUE) +# A convenience macro for setting xcode specific properties on targets +# example: set_xcode_property (myioslib IPHONEOS_DEPLOYMENT_TARGET "3.1") +# +# find_host_package (PROGRAM ARGS) +# A macro used to find executable programs on the host system, not within the iOS environment. +# Thanks to the android-cmake project for providing the command + +# Standard settings +set (CMAKE_SYSTEM_NAME Darwin) +set (CMAKE_SYSTEM_VERSION 1) +set (UNIX True) +set (APPLE True) +set (IOS True) + +# Required as of cmake 2.8.10 +set (CMAKE_OSX_DEPLOYMENT_TARGET "" CACHE STRING "Force unset of the deployment target for iOS" FORCE) + +# Determine the cmake host system version so we know where to find the iOS SDKs +find_program (CMAKE_UNAME uname /bin /usr/bin /usr/local/bin) +if (CMAKE_UNAME) + exec_program(uname ARGS -r OUTPUT_VARIABLE CMAKE_HOST_SYSTEM_VERSION) + string (REGEX REPLACE "^([0-9]+)\\.([0-9]+).*$" "\\1" DARWIN_MAJOR_VERSION "${CMAKE_HOST_SYSTEM_VERSION}") +endif (CMAKE_UNAME) + +# Force the compilers to gcc for iOS +include (CMakeForceCompiler) +set(XCODE_TOOLCHAIN /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain) +set(XCODE_BIN ${XCODE_TOOLCHAIN}/usr/bin) +set(CMAKE_C_COMPILER ${XCODE_BIN}/clang) +set(CMAKE_CXX_COMPILER ${XCODE_BIN}/clang++) +set(CMAKE_FIND_ROOT_PATH ${XCODE_TOOLCHAIN_ROOT}) +set(CMAKE_AR ar CACHE FILEPATH "" FORCE) + +# Skip the platform compiler checks for cross compiling +set (CMAKE_CXX_COMPILER_WORKS TRUE) +set (CMAKE_C_COMPILER_WORKS TRUE) + +# All iOS/Darwin specific settings - some may be redundant +set (CMAKE_SHARED_LIBRARY_PREFIX "lib") +set (CMAKE_SHARED_LIBRARY_SUFFIX ".dylib") +set (CMAKE_SHARED_MODULE_PREFIX "lib") +set (CMAKE_SHARED_MODULE_SUFFIX ".so") +set (CMAKE_MODULE_EXISTS 1) +set (CMAKE_DL_LIBS "") + +set (CMAKE_C_OSX_COMPATIBILITY_VERSION_FLAG "-compatibility_version ") +set (CMAKE_C_OSX_CURRENT_VERSION_FLAG "-current_version ") +set (CMAKE_CXX_OSX_COMPATIBILITY_VERSION_FLAG "${CMAKE_C_OSX_COMPATIBILITY_VERSION_FLAG}") +set (CMAKE_CXX_OSX_CURRENT_VERSION_FLAG "${CMAKE_C_OSX_CURRENT_VERSION_FLAG}") + + +# This was required for Other C++ Flags to be set for enabling bitcode in a static lib. +# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fembed-bitcode") + + +set (CMAKE_C_LINK_FLAGS "-Wl,-search_paths_first ${CMAKE_C_LINK_FLAGS}") +set (CMAKE_CXX_LINK_FLAGS "-Wl,-search_paths_first ${CMAKE_CXX_LINK_FLAGS}") + +set (CMAKE_PLATFORM_HAS_INSTALLNAME 1) +set (CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "-dynamiclib -headerpad_max_install_names") +set (CMAKE_SHARED_MODULE_CREATE_C_FLAGS "-bundle -headerpad_max_install_names") +set (CMAKE_SHARED_MODULE_LOADER_C_FLAG "-Wl,-bundle_loader,") +set (CMAKE_SHARED_MODULE_LOADER_CXX_FLAG "-Wl,-bundle_loader,") +set (CMAKE_FIND_LIBRARY_SUFFIXES ".dylib" ".so" ".a") + + +# Point to the latest SDK. +set (CMAKE_OSX_SYSROOT "iphoneos" CACHE string "Sysroot used for iOS support") + + + +set (CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD)" CACHE string "Build architecture for iOS") + +# Set the find root to the iOS developer roots and to user defined paths +set (CMAKE_FIND_ROOT_PATH ${CMAKE_IOS_DEVELOPER_ROOT} ${CMAKE_IOS_SDK_ROOT} ${CMAKE_PREFIX_PATH} CACHE string "iOS find search path root") + +# default to searching for frameworks first +set (CMAKE_FIND_FRAMEWORK FIRST) + +# set up the default search directories for frameworks +set (CMAKE_SYSTEM_FRAMEWORK_PATH + ${CMAKE_IOS_SDK_ROOT}/System/Library/Frameworks + ${CMAKE_IOS_SDK_ROOT}/System/Library/PrivateFrameworks + ${CMAKE_IOS_SDK_ROOT}/Developer/Library/Frameworks +) + +# only search the iOS sdks, not the remainder of the host filesystem +set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY) +set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + + +# This little macro lets you set any XCode specific property +macro (set_xcode_property TARGET XCODE_PROPERTY XCODE_VALUE) + set_property (TARGET ${TARGET} PROPERTY XCODE_ATTRIBUTE_${XCODE_PROPERTY} ${XCODE_VALUE}) +endmacro (set_xcode_property) + + +# This macro lets you find executable programs on the host system +macro (find_host_package) + set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER) + set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER) + set (IOS FALSE) + + find_package(${ARGN}) + + set (IOS TRUE) + set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY) + set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endmacro (find_host_package) diff --git a/platform/linux/config.cmake b/platform/linux/config.cmake new file mode 100644 index 000000000..814a24984 --- /dev/null +++ b/platform/linux/config.cmake @@ -0,0 +1,105 @@ +mason_use(glfw 3.1.2) +mason_use(boost_libprogram_options 1.60.0) +mason_use(sqlite 3.9.1) +mason_use(libuv 1.7.5) +mason_use(nunicode 1.6) +mason_use(libpng 1.6.20) +mason_use(libjpeg-turbo 1.4.2) +mason_use(webp 0.5.0) + +include(cmake/loop-uv.cmake) + +macro(mbgl_platform_core) + target_sources(mbgl-core + # File source + PRIVATE platform/default/asset_file_source.cpp + PRIVATE platform/default/default_file_source.cpp + PRIVATE platform/default/http_file_source.cpp + PRIVATE platform/default/online_file_source.cpp + + # Offline + PRIVATE platform/default/mbgl/storage/offline.cpp + PRIVATE platform/default/mbgl/storage/offline_database.cpp + PRIVATE platform/default/mbgl/storage/offline_database.hpp + PRIVATE platform/default/mbgl/storage/offline_download.cpp + PRIVATE platform/default/mbgl/storage/offline_download.hpp + PRIVATE platform/default/sqlite3.cpp + PRIVATE platform/default/sqlite3.hpp + + # Misc + PRIVATE platform/default/log_stderr.cpp + PRIVATE platform/default/string_stdlib.cpp + PRIVATE platform/default/thread.cpp + + # Image handling + PRIVATE platform/default/image.cpp + PRIVATE platform/default/jpeg_reader.cpp + PRIVATE platform/default/png_reader.cpp + PRIVATE platform/default/webp_reader.cpp + + # Headless view + PRIVATE platform/default/headless_display.cpp + PRIVATE platform/default/headless_view.cpp + PRIVATE platform/default/headless_view_glx.cpp + ) + + target_include_directories(mbgl-core + PRIVATE platform/default + ) + + target_add_mason_package(mbgl-core PUBLIC sqlite) + target_add_mason_package(mbgl-core PUBLIC nunicode) + target_add_mason_package(mbgl-core PUBLIC libpng) + target_add_mason_package(mbgl-core PUBLIC libjpeg-turbo) + target_add_mason_package(mbgl-core PUBLIC webp) + + target_link_libraries(mbgl-core + PUBLIC -lz + PUBLIC -lcurl + PUBLIC -lGL + PUBLIC -lX11 + ) +endmacro() + + +macro(mbgl_platform_glfw) + target_link_libraries(mbgl-glfw + PRIVATE mbgl-loop + ) +endmacro() + + +macro(mbgl_platform_render) + target_link_libraries(mbgl-render + PRIVATE mbgl-loop + ) +endmacro() + + +macro(mbgl_platform_offline) + target_link_libraries(mbgl-offline + PRIVATE mbgl-loop + ) +endmacro() + + +macro(mbgl_platform_test) + target_sources(mbgl-test + PRIVATE test/src/main.cpp + ) + + set_source_files_properties( + test/src/main.cpp + PROPERTIES + COMPILE_FLAGS -DWORK_DIRECTORY="${CMAKE_SOURCE_DIR}" + ) + + target_link_libraries(mbgl-test + PRIVATE mbgl-loop + ) +endmacro() + + +macro(mbgl_platform_node) + # Enabling node module by defining this macro +endmacro() diff --git a/platform/linux/ninja b/platform/linux/ninja new file mode 100755 index 0000000000000000000000000000000000000000..189832fdb4b673ceab7ff59e1cccf4bbd6ea37c6 GIT binary patch literal 175240 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', - }, - 'conditions': [ - ['OS == "mac"', { - 'variables': { - 'headless_lib': 'cgl', - } - }], - ], - 'includes': [ - '../../mbgl.gypi', - '../../test/test.gypi', - '../../benchmark/benchmark.gypi', - '../../bin/glfw.gypi', - '../../bin/render.gypi', - '../../bin/offline.gypi', - ], - 'targets': [ - { - 'target_name': 'test', - 'type': 'executable', - - 'dependencies': [ - 'test-lib', - 'platform-lib', - 'copy_certificate_bundle', - ], - - 'sources': [ - '../../test/src/main.cpp', - ], - }, - { - 'target_name': 'benchmark', - 'type': 'executable', - - 'dependencies': [ - 'benchmark-lib', - 'platform-lib', - ], - - 'sources': [ - '../../benchmark/src/main.cpp', - ], - }, - { - 'target_name': 'platform-lib', - 'product_name': 'mbgl-platform-linux', - 'type': 'static_library', - 'standalone_static_library': 1, - 'hard_dependency': 1, - 'dependencies': [ - 'core', - ], - - 'include_dirs': [ - '../default', - '../../include', - '../../src', # TODO: eliminate - ], - - 'sources': [ - '../default/log_stderr.cpp', - '../default/string_stdlib.cpp', - '../default/thread.cpp', - '../default/image.cpp', - '../default/webp_reader.cpp', - '../default/png_reader.cpp', - '../default/jpeg_reader.cpp', - '../default/asset_file_source.cpp', - '../default/http_file_source.cpp', - '../default/default_file_source.cpp', - '../default/online_file_source.cpp', - '../default/mbgl/storage/offline.hpp', - '../default/mbgl/storage/offline.cpp', - '../default/mbgl/storage/offline_database.hpp', - '../default/mbgl/storage/offline_database.cpp', - '../default/mbgl/storage/offline_download.hpp', - '../default/mbgl/storage/offline_download.cpp', - '../default/sqlite3.hpp', - '../default/sqlite3.cpp', - ], - - 'cflags_cc': [ - '<@(boost_cflags)', - '<@(nunicode_cflags)', - '<@(sqlite_cflags)', - '<@(rapidjson_cflags)', - '<@(libcurl_cflags)', - '<@(libpng_cflags)', - '<@(libjpeg-turbo_cflags)', - '<@(webp_cflags)', - ], - - 'link_settings': { - 'libraries': [ - '<@(nunicode_static_libs)', - '<@(nunicode_ldflags)', - '<@(sqlite_static_libs)', - '<@(sqlite_ldflags)', - '<@(zlib_static_libs)', - '<@(zlib_ldflags)', - '<@(libcurl_static_libs)', - '<@(libcurl_ldflags)', - '<@(libpng_static_libs)', - '<@(libpng_ldflags)', - '<@(libjpeg-turbo_static_libs)', - '<@(libjpeg-turbo_ldflags)', - '<@(webp_static_libs)', - '<@(webp_ldflags)', - ], - }, - - 'direct_dependent_settings': { - 'include_dirs': [ - '../include', - ], - }, - }, - ], -} diff --git a/platform/linux/scripts/configure.sh b/platform/linux/scripts/configure.sh deleted file mode 100644 index 3d3799486..000000000 --- a/platform/linux/scripts/configure.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bash - -CXX11ABI=${CXX11ABI:-$(scripts/check-cxx11abi.sh)} - -UNIQUE_RESOURCE_VERSION=dev -PROTOZERO_VERSION=1.3.0 -BOOST_VERSION=1.60.0 -BOOST_LIBPROGRAM_OPTIONS_VERSION=1.60.0 -LIBCURL_VERSION=system -GLFW_VERSION=3.1.2 -LIBPNG_VERSION=1.6.20 -LIBJPEG_TURBO_VERSION=1.4.2 -SQLITE_VERSION=3.9.1 -LIBUV_VERSION=1.7.5 -ZLIB_VERSION=system -NUNICODE_VERSION=1.6 -GEOMETRY_VERSION=0.8.0 -GEOJSON_VERSION=0.1.4${CXX11ABI:-} -GEOJSONVT_VERSION=6.1.2 -SUPERCLUSTER_VERSION=0.2.0 -KDBUSH_VERSION=0.1.1 -VARIANT_VERSION=1.1.0 -RAPIDJSON_VERSION=1.0.2 -GTEST_VERSION=1.7.0${CXX11ABI:-} -PIXELMATCH_VERSION=0.9.0 -WEBP_VERSION=0.5.0 -EARCUT_VERSION=0.11 -BENCHMARK_VERSION=1.0.0 - -function print_opengl_flags { - CONFIG+=" 'opengl_cflags%': $(quote_flags $(pkg-config gl x11 --cflags)),"$LN - CONFIG+=" 'opengl_ldflags%': $(quote_flags $(pkg-config gl x11 --libs)),"$LN -} diff --git a/platform/macos/WorkspaceSettings.xcsettings b/platform/macos/WorkspaceSettings.xcsettings index a2d959210..88a45c15c 100644 --- a/platform/macos/WorkspaceSettings.xcsettings +++ b/platform/macos/WorkspaceSettings.xcsettings @@ -3,11 +3,15 @@ BuildLocationStyle - UseAppPreferences + CustomLocation + CustomBuildIntermediatesPath + ../../build/macos CustomBuildLocationType - RelativeToDerivedData + RelativeToWorkspace + CustomBuildProductsPath + ../../build/macos DerivedDataCustomLocation - ../../build + ../../build/macos DerivedDataLocationStyle WorkspaceRelativePath IssueFilterStyle diff --git a/platform/macos/bitrise.yml b/platform/macos/bitrise.yml index ce622ef0f..098704943 100644 --- a/platform/macos/bitrise.yml +++ b/platform/macos/bitrise.yml @@ -29,6 +29,7 @@ workflows: - content: |- #!/bin/bash set -eu -o pipefail + brew install cmake gem install xcpretty --no-rdoc --no-ri export BUILDTYPE=Debug make macos diff --git a/platform/macos/config.cmake b/platform/macos/config.cmake new file mode 100644 index 000000000..fcb2c9a3e --- /dev/null +++ b/platform/macos/config.cmake @@ -0,0 +1,113 @@ +mason_use(glfw 3.1.2) +mason_use(boost_libprogram_options 1.60.0) + +include(cmake/loop-darwin.cmake) + +macro(mbgl_platform_core) + target_sources(mbgl-core + # File source + PRIVATE platform/darwin/src/http_file_source.mm + PRIVATE platform/default/asset_file_source.cpp + PRIVATE platform/default/default_file_source.cpp + PRIVATE platform/default/online_file_source.cpp + + # Offline + PRIVATE platform/default/mbgl/storage/offline.cpp + PRIVATE platform/default/mbgl/storage/offline_database.cpp + PRIVATE platform/default/mbgl/storage/offline_database.hpp + PRIVATE platform/default/mbgl/storage/offline_download.cpp + PRIVATE platform/default/mbgl/storage/offline_download.hpp + PRIVATE platform/default/sqlite3.cpp + PRIVATE platform/default/sqlite3.hpp + + # Misc + PRIVATE platform/darwin/src/log_nslog.mm + PRIVATE platform/darwin/src/nsthread.mm + PRIVATE platform/darwin/src/reachability.m + PRIVATE platform/darwin/src/string_nsstring.mm + + # Image handling + PRIVATE platform/darwin/src/image.mm + + # Headless view + PRIVATE platform/darwin/src/headless_view_cgl.cpp + PRIVATE platform/default/headless_display.cpp + PRIVATE platform/default/headless_view.cpp + ) + + target_compile_options(mbgl-core + PRIVATE -fobjc-arc + ) + + target_include_directories(mbgl-core + PRIVATE platform/default + ) + + target_link_libraries(mbgl-core + PUBLIC -lz + ) +endmacro() + + +macro(mbgl_platform_glfw) + target_link_libraries(mbgl-glfw + PRIVATE mbgl-loop + PRIVATE "-lsqlite3" + ) +endmacro() + + +macro(mbgl_platform_render) + target_link_libraries(mbgl-render + PRIVATE mbgl-loop + PRIVATE "-framework Foundation" + PRIVATE "-framework CoreGraphics" + PRIVATE "-framework OpenGL" + PRIVATE "-framework ImageIO" + PRIVATE "-framework CoreServices" + PRIVATE "-lsqlite3" + ) +endmacro() + + +macro(mbgl_platform_offline) + target_link_libraries(mbgl-offline + PRIVATE mbgl-loop + PRIVATE "-framework Foundation" + PRIVATE "-framework CoreGraphics" + PRIVATE "-framework OpenGL" + PRIVATE "-framework ImageIO" + PRIVATE "-framework CoreServices" + PRIVATE "-lsqlite3" + ) +endmacro() + + +macro(mbgl_platform_test) + target_sources(mbgl-test + PRIVATE test/src/main.cpp + ) + + set_source_files_properties( + test/src/main.cpp + PROPERTIES + COMPILE_FLAGS -DWORK_DIRECTORY="${CMAKE_SOURCE_DIR}" + ) + + target_link_libraries(mbgl-test + PRIVATE mbgl-loop + PRIVATE "-framework Foundation" + PRIVATE "-framework CoreGraphics" + PRIVATE "-framework OpenGL" + PRIVATE "-framework ImageIO" + PRIVATE "-framework CoreServices" + PRIVATE "-lsqlite3" + ) +endmacro() + + +macro(mbgl_platform_node) + target_link_libraries(mbgl-node + PRIVATE "-framework Foundation" + ) +endmacro() diff --git a/platform/macos/macos.xcodeproj/project.pbxproj b/platform/macos/macos.xcodeproj/project.pbxproj index ed980294a..25af9015a 100644 --- a/platform/macos/macos.xcodeproj/project.pbxproj +++ b/platform/macos/macos.xcodeproj/project.pbxproj @@ -8,6 +8,10 @@ /* Begin PBXBuildFile section */ 52BECB0A1CC5A26F009CD791 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 52BECB091CC5A26F009CD791 /* SystemConfiguration.framework */; }; + 5548BE781D09E718005DDE81 /* libmbgl-core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAE6C3451CC31D1200DB3429 /* libmbgl-core.a */; }; + 5548BE7D1D0ACCD6005DDE81 /* libmbgl-core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAE6C3451CC31D1200DB3429 /* libmbgl-core.a */; }; + 558F18221D0B13B100123F46 /* libmbgl-loop.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 558F18211D0B13B000123F46 /* libmbgl-loop.a */; }; + 55D9B4B11D005D3900C1CCE2 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 55D9B4B01D005D3900C1CCE2 /* libz.tbd */; }; DA0CD58E1CF56F5800A5F5A5 /* MGLFeatureTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = DA0CD58D1CF56F5800A5F5A5 /* MGLFeatureTests.mm */; }; DA35A2A41CC9EB1A00E826B2 /* MGLCoordinateFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = DA35A2A31CC9EB1A00E826B2 /* MGLCoordinateFormatter.h */; settings = {ATTRIBUTES = (Public, ); }; }; DA35A2A61CC9EB2700E826B2 /* MGLCoordinateFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = DA35A2A51CC9EB2700E826B2 /* MGLCoordinateFormatter.m */; }; @@ -31,7 +35,6 @@ DA8933AE1CCD290700E68420 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = DA8933AB1CCD290700E68420 /* Localizable.strings */; }; DA8933B51CCD2C2500E68420 /* Foundation.strings in Resources */ = {isa = PBXBuildFile; fileRef = DA8933B31CCD2C2500E68420 /* Foundation.strings */; }; DA8933B81CCD2C2D00E68420 /* Foundation.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = DA8933B61CCD2C2D00E68420 /* Foundation.stringsdict */; }; - DAB6924A1CC75A31005AAB54 /* libmbgl-core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAE6C3451CC31D1200DB3429 /* libmbgl-core.a */; }; DAC2ABC51CC6D343006D18C4 /* MGLAnnotationImage_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = DAC2ABC41CC6D343006D18C4 /* MGLAnnotationImage_Private.h */; }; DACC22141CF3D3E200D220D9 /* MGLFeature.h in Headers */ = {isa = PBXBuildFile; fileRef = DACC22121CF3D3E200D220D9 /* MGLFeature.h */; settings = {ATTRIBUTES = (Public, ); }; }; DACC22151CF3D3E200D220D9 /* MGLFeature.mm in Sources */ = {isa = PBXBuildFile; fileRef = DACC22131CF3D3E200D220D9 /* MGLFeature.mm */; }; @@ -46,8 +49,6 @@ DAE6C3321CC30DB200DB3429 /* Mapbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAE6C3281CC30DB200DB3429 /* Mapbox.framework */; }; DAE6C33D1CC30DB200DB3429 /* Mapbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAE6C3281CC30DB200DB3429 /* Mapbox.framework */; }; DAE6C33E1CC30DB200DB3429 /* Mapbox.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DAE6C3281CC30DB200DB3429 /* Mapbox.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - DAE6C3471CC31D1200DB3429 /* libmbgl-core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAE6C3451CC31D1200DB3429 /* libmbgl-core.a */; }; - DAE6C3481CC31D1200DB3429 /* libmbgl-platform-macos.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAE6C3461CC31D1200DB3429 /* libmbgl-platform-macos.a */; }; DAE6C35A1CC31E0400DB3429 /* MGLAccountManager.h in Headers */ = {isa = PBXBuildFile; fileRef = DAE6C34A1CC31E0400DB3429 /* MGLAccountManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; DAE6C35B1CC31E0400DB3429 /* MGLAnnotation.h in Headers */ = {isa = PBXBuildFile; fileRef = DAE6C34B1CC31E0400DB3429 /* MGLAnnotation.h */; settings = {ATTRIBUTES = (Public, ); }; }; DAE6C35C1CC31E0400DB3429 /* MGLGeometry.h in Headers */ = {isa = PBXBuildFile; fileRef = DAE6C34C1CC31E0400DB3429 /* MGLGeometry.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -148,6 +149,11 @@ /* Begin PBXFileReference section */ 52BECB091CC5A26F009CD791 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; + 5548BE791D0ACBB2005DDE81 /* libmbgl-loop-darwin.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libmbgl-loop-darwin.a"; path = "cmake/Debug/libmbgl-loop-darwin.a"; sourceTree = ""; }; + 5548BE7B1D0ACBBD005DDE81 /* libmbgl-loop-darwin.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libmbgl-loop-darwin.a"; path = "cmake/Debug/libmbgl-loop-darwin.a"; sourceTree = ""; }; + 558F18211D0B13B000123F46 /* libmbgl-loop.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libmbgl-loop.a"; path = "../../build/osx/Debug/libmbgl-loop.a"; sourceTree = ""; }; + 55D9B4B01D005D3900C1CCE2 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; + 55FE0E8D1D100A0900FD240B /* config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = config.xcconfig; path = ../../build/macos/config.xcconfig; sourceTree = ""; }; DA0CD58D1CF56F5800A5F5A5 /* MGLFeatureTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MGLFeatureTests.mm; path = ../../darwin/test/MGLFeatureTests.mm; sourceTree = ""; }; DA35A2A31CC9EB1A00E826B2 /* MGLCoordinateFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLCoordinateFormatter.h; sourceTree = ""; }; DA35A2A51CC9EB2700E826B2 /* MGLCoordinateFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGLCoordinateFormatter.m; sourceTree = ""; }; @@ -255,7 +261,6 @@ DAE6C3BB1CC31F2E00DB3429 /* default_marker.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = default_marker.pdf; sourceTree = ""; }; DAE6C3BC1CC31F2E00DB3429 /* mapbox.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = mapbox.pdf; sourceTree = ""; }; DAE6C3C11CC31F4500DB3429 /* Mapbox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Mapbox.h; path = src/Mapbox.h; sourceTree = SOURCE_ROOT; }; - DAE6C3C51CC31F9100DB3429 /* mbgl.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = mbgl.xcconfig; path = ../../build/macos/mbgl.xcconfig; sourceTree = ""; }; DAE6C3C61CC3499100DB3429 /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; }; DAE6C3C81CC34BD800DB3429 /* MGLGeometryTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MGLGeometryTests.mm; path = ../../darwin/test/MGLGeometryTests.mm; sourceTree = ""; }; DAE6C3C91CC34BD800DB3429 /* MGLOfflinePackTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MGLOfflinePackTests.m; path = ../../darwin/test/MGLOfflinePackTests.m; sourceTree = ""; }; @@ -278,9 +283,10 @@ buildActionMask = 2147483647; files = ( 52BECB0A1CC5A26F009CD791 /* SystemConfiguration.framework in Frameworks */, - DAE6C3471CC31D1200DB3429 /* libmbgl-core.a in Frameworks */, - DAE6C3481CC31D1200DB3429 /* libmbgl-platform-macos.a in Frameworks */, + 5548BE781D09E718005DDE81 /* libmbgl-core.a in Frameworks */, + 558F18221D0B13B100123F46 /* libmbgl-loop.a in Frameworks */, DAE6C3C71CC3499100DB3429 /* libsqlite3.tbd in Frameworks */, + 55D9B4B11D005D3900C1CCE2 /* libz.tbd in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -288,8 +294,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - DAB6924A1CC75A31005AAB54 /* libmbgl-core.a in Frameworks */, DAE6C3321CC30DB200DB3429 /* Mapbox.framework in Frameworks */, + 5548BE7D1D0ACCD6005DDE81 /* libmbgl-core.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -451,6 +457,10 @@ DAE6C31E1CC308BC00DB3429 /* Frameworks */ = { isa = PBXGroup; children = ( + 558F18211D0B13B000123F46 /* libmbgl-loop.a */, + 5548BE7B1D0ACBBD005DDE81 /* libmbgl-loop-darwin.a */, + 5548BE791D0ACBB2005DDE81 /* libmbgl-loop-darwin.a */, + 55D9B4B01D005D3900C1CCE2 /* libz.tbd */, 52BECB091CC5A26F009CD791 /* SystemConfiguration.framework */, DAE6C3451CC31D1200DB3429 /* libmbgl-core.a */, DAE6C3461CC31D1200DB3429 /* libmbgl-platform-macos.a */, @@ -538,7 +548,7 @@ DAE6C3C41CC31F7800DB3429 /* Configuration */ = { isa = PBXGroup; children = ( - DAE6C3C51CC31F9100DB3429 /* mbgl.xcconfig */, + 55FE0E8D1D100A0900FD240B /* config.xcconfig */, ); name = Configuration; sourceTree = ""; @@ -924,7 +934,7 @@ MACOSX_DEPLOYMENT_TARGET = 10.10; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; + SYMROOT = "$(PROJECT_DIR)/cmake"; }; name = Debug; }; @@ -961,7 +971,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.10; MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = macosx; + SYMROOT = "$(PROJECT_DIR)/cmake"; }; name = Release; }; @@ -1016,7 +1026,7 @@ }; DAE6C33F1CC30DB200DB3429 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DAE6C3C51CC31F9100DB3429 /* mbgl.xcconfig */; + baseConfigurationReference = 55FE0E8D1D100A0900FD240B /* config.xcconfig */; buildSettings = { COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; @@ -1026,25 +1036,15 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; FRAMEWORK_VERSION = A; HEADER_SEARCH_PATHS = ( - ../default, - ../../include, - ../../src, + "$(mbgl_core_INCLUDE_DIRECTORIES)", + "$(mbgl_loop_INCLUDE_DIRECTORIES)", ); INFOPLIST_FILE = "$(SRCROOT)/sdk/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; - OTHER_CPLUSPLUSFLAGS = ( - "$(OTHER_CFLAGS)", - "$(zlib_cflags)", - "$(rapidjson_cflags)", - "$(variant_cflags)", - "$(geometry_cflags)", - "$(geojson_cflags)", - ); OTHER_LDFLAGS = ( - "$(zlib_ldflags)", - "$(opengl_ldflags)", - "$(geojson_static_libs)", + "$(mbgl_core_LINK_LIBRARIES)", + "$(mbgl_loop_LINK_LIBRARIES)", ); PRODUCT_BUNDLE_IDENTIFIER = com.mapbox.MapboxGL; PRODUCT_NAME = Mapbox; @@ -1056,7 +1056,7 @@ }; DAE6C3401CC30DB200DB3429 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DAE6C3C51CC31F9100DB3429 /* mbgl.xcconfig */; + baseConfigurationReference = 55FE0E8D1D100A0900FD240B /* config.xcconfig */; buildSettings = { COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; @@ -1066,25 +1066,15 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; FRAMEWORK_VERSION = A; HEADER_SEARCH_PATHS = ( - ../default, - ../../include, - ../../src, + "$(mbgl_core_INCLUDE_DIRECTORIES)", + "$(mbgl_loop_INCLUDE_DIRECTORIES)", ); INFOPLIST_FILE = "$(SRCROOT)/sdk/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; - OTHER_CPLUSPLUSFLAGS = ( - "$(OTHER_CFLAGS)", - "$(zlib_cflags)", - "$(rapidjson_cflags)", - "$(variant_cflags)", - "$(geometry_cflags)", - "$(geojson_cflags)", - ); OTHER_LDFLAGS = ( - "$(zlib_ldflags)", - "$(opengl_ldflags)", - "$(geojson_static_libs)", + "$(mbgl_core_LINK_LIBRARIES)", + "$(mbgl_loop_LINK_LIBRARIES)", ); PRODUCT_BUNDLE_IDENTIFIER = com.mapbox.MapboxGL; PRODUCT_NAME = Mapbox; @@ -1096,10 +1086,10 @@ }; DAE6C3411CC30DB200DB3429 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DAE6C3C51CC31F9100DB3429 /* mbgl.xcconfig */; + baseConfigurationReference = 55FE0E8D1D100A0900FD240B /* config.xcconfig */; buildSettings = { COMBINE_HIDPI_IMAGES = YES; - HEADER_SEARCH_PATHS = ../../include; + HEADER_SEARCH_PATHS = "$(mbgl_core_INCLUDE_DIRECTORIES)"; INFOPLIST_FILE = test/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; OTHER_CPLUSPLUSFLAGS = ( @@ -1115,10 +1105,10 @@ }; DAE6C3421CC30DB200DB3429 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DAE6C3C51CC31F9100DB3429 /* mbgl.xcconfig */; + baseConfigurationReference = 55FE0E8D1D100A0900FD240B /* config.xcconfig */; buildSettings = { COMBINE_HIDPI_IMAGES = YES; - HEADER_SEARCH_PATHS = ../../include; + HEADER_SEARCH_PATHS = "$(mbgl_core_INCLUDE_DIRECTORIES)"; INFOPLIST_FILE = test/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; OTHER_CPLUSPLUSFLAGS = ( diff --git a/platform/macos/macos.xcworkspace/contents.xcworkspacedata b/platform/macos/macos.xcworkspace/contents.xcworkspacedata index 67a33490e..65341f19f 100644 --- a/platform/macos/macos.xcworkspace/contents.xcworkspacedata +++ b/platform/macos/macos.xcworkspace/contents.xcworkspacedata @@ -5,6 +5,6 @@ location = "container:macos.xcodeproj"> + location = "group:../../build/macos/mbgl.xcodeproj"> diff --git a/platform/macos/macos.xcworkspace/xcshareddata/xcschemes/mbgl-offline.xcscheme b/platform/macos/macos.xcworkspace/xcshareddata/xcschemes/mbgl-offline.xcscheme deleted file mode 100644 index 90ba9db15..000000000 --- a/platform/macos/macos.xcworkspace/xcshareddata/xcschemes/mbgl-offline.xcscheme +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/platform/macos/ninja b/platform/macos/ninja new file mode 100755 index 0000000000000000000000000000000000000000..64fcacc550c7ef470414b11a746f656d8ee75a0c GIT binary patch literal 171356 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 z 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 literal 0 HcmV?d00001 diff --git a/platform/macos/platform.gyp b/platform/macos/platform.gyp deleted file mode 100644 index 68ab4ce46..000000000 --- a/platform/macos/platform.gyp +++ /dev/null @@ -1,104 +0,0 @@ -{ - 'variables': { - 'loop_lib': 'darwin', - 'headless_lib': 'cgl', - 'coverage': 0, - }, - 'includes': [ - '../../build/macos/config.gypi', - '../../mbgl.gypi', - '../../test/test.gypi', - '../../benchmark/benchmark.gypi', - '../../bin/glfw.gypi', - '../../bin/render.gypi', - '../../bin/offline.gypi', - ], - 'targets': [ - { - 'target_name': 'test', - 'type': 'executable', - - 'dependencies': [ - 'test-lib', - 'platform-lib', - ], - - 'sources': [ - '../../test/src/main.cpp', - ], - }, - { - 'target_name': 'benchmark', - 'type': 'executable', - - 'dependencies': [ - 'benchmark-lib', - 'platform-lib', - ], - - 'sources': [ - '../../benchmark/src/main.cpp', - ], - }, - { - 'target_name': 'platform-lib', - 'product_name': 'mbgl-platform-macos', - 'type': 'static_library', - 'standalone_static_library': 1, - 'hard_dependency': 1, - 'dependencies': [ - 'core', - ], - - 'include_dirs': [ - 'include', - '../darwin/include', - '../default', - '../../include', - '../../src', # TODO: eliminate - '<(SHARED_INTERMEDIATE_DIR)/include', - ], - - 'sources': [ - '../default/asset_file_source.cpp', - '../default/default_file_source.cpp', - '../default/online_file_source.cpp', - '../default/mbgl/storage/offline.hpp', - '../default/mbgl/storage/offline.cpp', - '../default/mbgl/storage/offline_database.hpp', - '../default/mbgl/storage/offline_database.cpp', - '../default/mbgl/storage/offline_download.hpp', - '../default/mbgl/storage/offline_download.cpp', - '../default/sqlite3.hpp', - '../default/sqlite3.cpp', - '../darwin/src/http_file_source.mm', - '../darwin/src/log_nslog.mm', - '../darwin/src/string_nsstring.mm', - '../darwin/src/image.mm', - '../darwin/src/nsthread.mm', - '../darwin/src/reachability.m', - ], - - 'xcode_settings': { - 'OTHER_CPLUSPLUSFLAGS': [ - '<@(sqlite_cflags)', - '<@(zlib_cflags)', - '<@(rapidjson_cflags)', - ], - 'CLANG_ENABLE_OBJC_ARC': 'YES', - 'CLANG_ENABLE_MODULES': 'YES', - }, - - 'link_settings': { - 'libraries': [ - '<@(sqlite_static_libs)', - '<@(zlib_static_libs)', - '$(SDKROOT)/System/Library/Frameworks/Cocoa.framework', - ], - 'xcode_settings': { - 'OTHER_LDFLAGS': [ '<@(zlib_ldflags)' ], - }, - }, - }, - ], -} diff --git a/platform/macos/scripts/configure.sh b/platform/macos/scripts/configure.sh deleted file mode 100644 index d408eef7e..000000000 --- a/platform/macos/scripts/configure.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env bash - -UNIQUE_RESOURCE_VERSION=dev -PROTOZERO_VERSION=1.3.0 -BOOST_VERSION=1.60.0 -BOOST_LIBPROGRAM_OPTIONS_VERSION=1.60.0 -GLFW_VERSION=3.1.2 -SQLITE_VERSION=3.9.1 -ZLIB_VERSION=system -NUNICODE_VERSION=1.6 -GEOMETRY_VERSION=0.8.0 -GEOJSON_VERSION=0.1.4 -GEOJSONVT_VERSION=6.1.2 -SUPERCLUSTER_VERSION=0.2.0 -KDBUSH_VERSION=0.1.1 -VARIANT_VERSION=1.1.0 -RAPIDJSON_VERSION=1.0.2 -GTEST_VERSION=1.7.0 -PIXELMATCH_VERSION=0.9.0 -EARCUT_VERSION=0.11 -BENCHMARK_VERSION=1.0.0 diff --git a/platform/macos/scripts/create_scheme.sh b/platform/macos/scripts/create_scheme.sh new file mode 100755 index 000000000..71f0e0855 --- /dev/null +++ b/platform/macos/scripts/create_scheme.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash + +set -u + +CONTAINER=build/macos/mbgl.xcodeproj +OUTPUT="${CONTAINER}/xcshareddata/xcschemes/${SCHEME_NAME}.xcscheme" + +# Required ENV vars: +# - SCHEME_TYPE: type of the scheme +# - SCHEME_NAME: name of the scheme + +# Optional ENV vars: +# - NODE_ARGUMENT (defaults to "") +# - BUILDABLE_NAME (defaults ot SCHEME_NAME) +# - BLUEPRINT_NAME (defaults ot SCHEME_NAME) + + +# Try to reuse the existing Blueprint ID if the scheme already exists. +if [ -f "${OUTPUT}" ]; then + BLUEPRINT_ID=$(sed -n "s/[ \t]*BlueprintIdentifier *= *\"\([A-Z0-9]\{24\}\)\"/\\1/p" "${OUTPUT}" | head -1) +fi + +NODE_ARGUMENT=${NODE_ARGUMENT:-} +MAPBOX_ACCESS_TOKEN=${MAPBOX_ACCESS_TOKEN:-} +BLUEPRINT_ID=${BLUEPRINT_ID:-$(hexdump -n 12 -v -e '/1 "%02X"' /dev/urandom)} +BUILDABLE_NAME=${BUILDABLE_NAME:-${SCHEME_NAME}} +BLUEPRINT_NAME=${BLUEPRINT_NAME:-${SCHEME_NAME}} + +mkdir -p "${CONTAINER}/xcshareddata/xcschemes" + +sed "\ +s#{{BLUEPRINT_ID}}#${BLUEPRINT_ID}#;\ +s#{{BLUEPRINT_NAME}}#${BLUEPRINT_NAME}#;\ +s#{{BUILDABLE_NAME}}#${BUILDABLE_NAME}#;\ +s#{{CONTAINER}}#${CONTAINER}#;\ +s#{{MAPBOX_ACCESS_TOKEN}}#${MAPBOX_ACCESS_TOKEN}#;\ +s#{{WORKING_DIRECTORY}}#$(pwd)#;\ +s#{{NODE_PATH}}#$(dirname `which node`)#;\ +s#{{NODE_ARGUMENT}}#${NODE_ARGUMENT}#" \ + platform/macos/scripts/${SCHEME_TYPE}.xcscheme > "${OUTPUT}" diff --git a/platform/macos/macos.xcworkspace/xcshareddata/xcschemes/test.xcscheme b/platform/macos/scripts/executable.xcscheme similarity index 68% rename from platform/macos/macos.xcworkspace/xcshareddata/xcschemes/test.xcscheme rename to platform/macos/scripts/executable.xcscheme index bc8a3350f..4353aad84 100644 --- a/platform/macos/macos.xcworkspace/xcshareddata/xcschemes/test.xcscheme +++ b/platform/macos/scripts/executable.xcscheme @@ -1,6 +1,6 @@ + BlueprintIdentifier = "{{BLUEPRINT_ID}}" + BuildableName = "{{BUILDABLE_NAME}}" + BlueprintName = "{{BLUEPRINT_NAME}}" + ReferencedContainer = "container:{{CONTAINER}}"> @@ -32,10 +32,10 @@ + BlueprintIdentifier = "{{BLUEPRINT_ID}}" + BuildableName = "{{BUILDABLE_NAME}}" + BlueprintName = "{{BLUEPRINT_NAME}}" + ReferencedContainer = "container:{{CONTAINER}}"> @@ -46,8 +46,7 @@ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" launchStyle = "0" - useCustomWorkingDirectory = "YES" - customWorkingDirectory = "$(PROJECT_DIR)/../.." + useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" @@ -56,10 +55,10 @@ runnableDebuggingMode = "0"> + BlueprintIdentifier = "{{BLUEPRINT_ID}}" + BuildableName = "{{BUILDABLE_NAME}}" + BlueprintName = "{{BLUEPRINT_NAME}}" + ReferencedContainer = "container:{{CONTAINER}}"> @@ -68,6 +67,13 @@ isEnabled = "NO"> + + + + @@ -81,10 +87,10 @@ runnableDebuggingMode = "0"> + BlueprintIdentifier = "{{BLUEPRINT_ID}}" + BuildableName = "{{BUILDABLE_NAME}}" + BlueprintName = "{{BLUEPRINT_NAME}}" + ReferencedContainer = "container:{{CONTAINER}}"> diff --git a/platform/macos/macos.xcworkspace/xcshareddata/xcschemes/mbgl-render.xcscheme b/platform/macos/scripts/library.xcscheme similarity index 59% rename from platform/macos/macos.xcworkspace/xcshareddata/xcschemes/mbgl-render.xcscheme rename to platform/macos/scripts/library.xcscheme index c17686199..012bc900c 100644 --- a/platform/macos/macos.xcworkspace/xcshareddata/xcschemes/mbgl-render.xcscheme +++ b/platform/macos/scripts/library.xcscheme @@ -1,6 +1,6 @@ + BlueprintIdentifier = "{{BLUEPRINT_ID}}" + BuildableName = "{{BUILDABLE_NAME}}" + BlueprintName = "{{BLUEPRINT_NAME}}" + ReferencedContainer = "container:{{CONTAINER}}"> @@ -29,15 +29,6 @@ shouldUseLaunchSchemeArgsEnv = "YES"> - - - - @@ -46,22 +37,20 @@ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" launchStyle = "0" - useCustomWorkingDirectory = "YES" - customWorkingDirectory = "$(PROJECT_DIR)/../.." + useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" allowLocationSimulation = "YES"> - + + BlueprintIdentifier = "{{BLUEPRINT_ID}}" + BuildableName = "{{BUILDABLE_NAME}}" + BlueprintName = "{{BLUEPRINT_NAME}}" + ReferencedContainer = "container:{{CONTAINER}}"> - + @@ -71,16 +60,15 @@ savedToolIdentifier = "" useCustomWorkingDirectory = "NO" debugDocumentVersioning = "YES"> - + + BlueprintIdentifier = "{{BLUEPRINT_ID}}" + BuildableName = "{{BUILDABLE_NAME}}" + BlueprintName = "{{BLUEPRINT_NAME}}" + ReferencedContainer = "container:{{CONTAINER}}"> - + diff --git a/platform/macos/scripts/macostest.xcscheme b/platform/macos/scripts/macostest.xcscheme deleted file mode 100644 index ba6f6a6f4..000000000 --- a/platform/macos/scripts/macostest.xcscheme +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/platform/node/scripts/node.xcscheme b/platform/macos/scripts/node.xcscheme similarity index 79% rename from platform/node/scripts/node.xcscheme rename to platform/macos/scripts/node.xcscheme index 52a89fb81..361ed58a3 100644 --- a/platform/node/scripts/node.xcscheme +++ b/platform/macos/scripts/node.xcscheme @@ -1,6 +1,6 @@ + BlueprintIdentifier = "{{BLUEPRINT_ID}}" + BuildableName = "{{BUILDABLE_NAME}}" + BlueprintName = "{{BLUEPRINT_NAME}}" + ReferencedContainer = "container:{{CONTAINER}}"> @@ -50,10 +50,10 @@ + BlueprintIdentifier = "{{BLUEPRINT_ID}}" + BuildableName = "{{BUILDABLE_NAME}}" + BlueprintName = "{{BLUEPRINT_NAME}}" + ReferencedContainer = "container:{{CONTAINER}}"> @@ -81,10 +81,10 @@ + BlueprintIdentifier = "{{BLUEPRINT_ID}}" + BuildableName = "{{BUILDABLE_NAME}}" + BlueprintName = "{{BLUEPRINT_NAME}}" + ReferencedContainer = "container:{{CONTAINER}}"> diff --git a/platform/macos/scripts/package.sh b/platform/macos/scripts/package.sh index c2a015b34..603ecd179 100755 --- a/platform/macos/scripts/package.sh +++ b/platform/macos/scripts/package.sh @@ -7,7 +7,7 @@ set -u NAME=Mapbox OUTPUT=build/macos/pkg DERIVED_DATA=build/macos -PRODUCTS=${DERIVED_DATA}/Build/Products +PRODUCTS=${DERIVED_DATA} BUILDTYPE=${BUILDTYPE:-Release} GCC_GENERATE_DEBUGGING_SYMBOLS=${SYMBOLS:-YES} diff --git a/platform/node/bitrise.yml b/platform/node/bitrise.yml index b43b85d69..b96855478 100644 --- a/platform/node/bitrise.yml +++ b/platform/node/bitrise.yml @@ -29,6 +29,7 @@ workflows: - content: |- #!/bin/bash set -eu -o pipefail + brew install cmake brew unlink node brew install awscli homebrew/versions/node4-lts brew link homebrew/versions/node4-lts diff --git a/platform/node/scripts/create_node_scheme.sh b/platform/node/scripts/create_node_scheme.sh deleted file mode 100755 index 5b97918ae..000000000 --- a/platform/node/scripts/create_node_scheme.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -NAME=$1 -shift -CMD=$@ -DIR="build/binding.xcodeproj/xcshareddata/xcschemes" -mkdir -p "${DIR}" - -sed "s#{{NODE_PATH}}#$(dirname `which node`)#;s#{{BLUEPRINT_IDENTIFIER}}#$(hexdump -n 12 -v -e '/1 "%02X"' /dev/urandom)#;s#{{WORKING_DIRECTORY}}#$(pwd)#;s#{{NODE_ARGUMENT}}#${CMD}#" platform/node/scripts/node.xcscheme > "${DIR}/${NAME}.xcscheme" diff --git a/platform/qt/app/qmapboxgl.gypi b/platform/qt/app/qmapboxgl.gypi deleted file mode 100644 index 22b4e1281..000000000 --- a/platform/qt/app/qmapboxgl.gypi +++ /dev/null @@ -1,58 +0,0 @@ -{ - 'targets': [ - { - 'target_name': 'qt-app', - 'product_name': 'qmapboxgl', - 'type': 'executable', - - 'includes': [ - '../qt.gypi', - ], - - 'dependencies': [ - 'qt-lib', - ], - - 'sources': [ - 'main.cpp', - 'mapwindow.cpp', - 'mapwindow.hpp', - 'source.qrc', - ], - - 'include_dirs': [ - '../include', - ], - - 'variables': { - 'cflags': [ - '<@(opengl_cflags)', - '<@(qt_core_cflags)', - '<@(qt_gui_cflags)', - '<@(qt_opengl_cflags)', - '-fPIC', - # Qt4 generates code with unused variables. - '-Wno-unused-variable', - ], - 'ldflags': [ - '<@(opengl_ldflags)', - '<@(qt_core_ldflags)', - '<@(qt_gui_ldflags)', - '<@(qt_opengl_ldflags)', - ], - }, - - 'conditions': [ - ['OS == "mac"', { - 'xcode_settings': { - 'OTHER_CPLUSPLUSFLAGS': [ '<@(cflags)' ], - 'OTHER_LDFLAGS': [ '<@(ldflags)' ], - }, - }, { - 'cflags_cc': [ '<@(cflags)' ], - 'libraries': [ '<@(ldflags)' ], - }], - ], - }, - ], -} diff --git a/platform/qt/bitrise-qt4.yml b/platform/qt/bitrise-qt4.yml index aeff150ee..baa58a030 100644 --- a/platform/qt/bitrise-qt4.yml +++ b/platform/qt/bitrise-qt4.yml @@ -29,6 +29,7 @@ workflows: - content: |- #!/bin/bash set -eu -o pipefail + brew install cmake brew install qt brew link qt brew linkapps qt diff --git a/platform/qt/bitrise-qt5.yml b/platform/qt/bitrise-qt5.yml index a612263e4..9c60e4511 100644 --- a/platform/qt/bitrise-qt5.yml +++ b/platform/qt/bitrise-qt5.yml @@ -29,6 +29,7 @@ workflows: - content: |- #!/bin/bash set -eu -o pipefail + brew install cmake brew install qt5 brew link qt5 --force brew linkapps qt5 diff --git a/platform/qt/platform.gyp b/platform/qt/platform.gyp deleted file mode 100644 index cb46aab07..000000000 --- a/platform/qt/platform.gyp +++ /dev/null @@ -1,237 +0,0 @@ -{ - 'variables': { - 'loop_lib': 'qt', - 'conditions': [ - ['OS == "mac"', { - 'headless_lib': 'cgl', - }, { - 'headless_lib': 'glx', - }] - ], - 'qtlibversion': '1.0.0', - 'coverage': 0, - }, - 'conditions': [ - ['<(qt_version_major) == 5', { - 'includes': [ 'qmlapp/qquickmapboxgl.gypi' ], - }], - ], - 'includes': [ - 'app/qmapboxgl.gypi', - '../../mbgl.gypi', - '../../test/test.gypi', - ], - 'targets': [ - { - 'target_name': 'platform-lib', - 'product_name': 'mbgl-platform-qt', - 'type': 'static_library', - 'standalone_static_library': 1, - 'hard_dependency': 1, - - 'dependencies': [ - 'core', - ], - - 'includes': [ - 'qt.gypi', - ], - - 'sources': [ - '../default/asset_file_source.cpp', - '../default/default_file_source.cpp', - '../default/log_stderr.cpp', - '../default/mbgl/storage/offline.cpp', - '../default/mbgl/storage/offline_database.cpp', - '../default/mbgl/storage/offline_download.cpp', - '../default/online_file_source.cpp', - '../default/sqlite3.cpp', - 'include/qmapbox.hpp', - 'include/qmapboxgl.hpp', - 'include/qquickmapboxgl.hpp', - 'include/qquickmapboxglstyleproperty.hpp', - 'qmapbox.qrc', - 'src/async_task.cpp', - 'src/async_task_impl.hpp', - 'src/http_file_source.cpp', - 'src/http_file_source.hpp', - 'src/http_request.cpp', - 'src/http_request.hpp', - 'src/image.cpp', - 'src/qmapbox.cpp', - 'src/qmapboxgl.cpp', - 'src/qmapboxgl_p.hpp', - 'src/qquickmapboxgl.cpp', - 'src/qquickmapboxglstyleproperty.cpp', - 'src/qquickmapboxglrenderer.cpp', - 'src/qquickmapboxglrenderer.hpp', - 'src/run_loop.cpp', - 'src/run_loop_impl.hpp', - 'src/string_stdlib.cpp', - 'src/timer.cpp', - 'src/timer_impl.hpp', - ], - - 'variables': { - 'cflags': [ - '<@(boost_cflags)', - '<@(geojson_cflags)', - '<@(libjpeg-turbo_cflags)', - '<@(nunicode_cflags)', - '<@(opengl_cflags)', - '<@(qt_core_cflags)', - '<@(qt_gui_cflags)', - '<@(qt_network_cflags)', - '<@(rapidjson_cflags)', - '<@(sqlite_cflags)', - '-fPIC', - ], - 'ldflags': [ - '<@(nunicode_ldflags)', - '<@(opengl_ldflags)', - '<@(qt_core_ldflags)', - '<@(qt_gui_ldflags)', - '<@(qt_network_ldflags)', - '<@(sqlite_ldflags)', - '<@(zlib_ldflags)', - ], - 'libraries': [ - '<@(geojson_static_libs)', - '<@(libjpeg-turbo_static_libs)', - '<@(nunicode_static_libs)', - '<@(sqlite_static_libs)', - '<@(zlib_static_libs)', - ], - }, - - 'include_dirs': [ - 'include', - '../default', - '../../include', - '../../src', # TODO: eliminate - ], - - 'conditions': [ - ['<(qt_image_decoders) == 0', { - 'sources': [ - '../default/jpeg_reader.cpp', - '../default/webp_reader.cpp', - ], - 'variables': { - 'cflags': [ - '<@(libjpeg-turbo_cflags)', - '<@(webp_cflags)', - ], - 'ldflags': [ - '<@(libjpeg-turbo_ldflags)', - '<@(webp_ldflags)', - ], - 'libraries': [ - '<@(libjpeg-turbo_static_libs)', - '<@(webp_static_libs)', - ], - }, - }, { - 'variables': { - 'cflags': [ - '-DQT_IMAGE_DECODERS', - ], - }, - }], - ['<(qt_version_major) == 4', { - 'variables': { - 'cflags': [ - '<@(qt_opengl_cflags)', - # Qt4 generates code with unused variables. - '-Wno-unused-variable', - ], - 'ldflags': [ - '<@(qt_opengl_ldflags)', - ], - }, - }], - ['<(qt_version_major) == 5', { - 'variables': { - 'cflags': [ - '<@(qt_location_cflags)', - '<@(qt_positioning_cflags)', - '<@(qt_quick_cflags)', - ], - 'ldflags': [ - '<@(qt_location_ldflags)', - '<@(qt_positioning_ldflags)', - '<@(qt_quick_ldflags)', - ], - }, - }, { - 'sources/': [ [ 'exclude', 'qquick*' ] ], - }], - ['OS == "mac"', { - 'xcode_settings': { - 'OTHER_CPLUSPLUSFLAGS': [ '<@(cflags)' ], - }, - 'sources': [ - '../darwin/src/nsthread.mm', - ], - }, { - 'cflags_cc': [ '<@(cflags)' ], - 'sources': [ - '../default/thread.cpp', - ], - }] - ], - - 'link_settings': { - 'conditions': [ - ['OS == "mac"', { - 'libraries': [ - '<@(libraries)', - '$(SDKROOT)/System/Library/Frameworks/Cocoa.framework', - ], - 'xcode_settings': { 'OTHER_LDFLAGS': [ '<@(ldflags)' ] } - }, { - 'libraries': [ '<@(libraries)', '<@(ldflags)' ], - }] - ], - }, - }, - { - 'target_name': 'qt-lib', - 'product_name': 'qmapboxgl', - 'type': 'shared_library', - 'product_extension': 'so.<(qtlibversion)', - - 'includes': [ - 'qt.gypi', - ], - - 'dependencies': [ - 'platform-lib', - ], - - 'link_settings': { - 'conditions': [ - ['OS == "mac"', { - 'xcode_settings': { - 'OTHER_LDFLAGS': [ '-all_load' ], - 'LD_DYLIB_INSTALL_NAME': '@executable_path/libqmapboxgl.so.<(qtlibversion)', - } - }] - ], - }, - }, - { - 'target_name': 'test', - 'type': 'executable', - - 'dependencies': [ - 'test-lib', - 'platform-lib', - ], - - 'sources': [ - '../../test/src/main.cpp', - ], - }, - ], -} diff --git a/platform/qt/qmlapp/qquickmapboxgl.gypi b/platform/qt/qmlapp/qquickmapboxgl.gypi deleted file mode 100644 index 7b539a52f..000000000 --- a/platform/qt/qmlapp/qquickmapboxgl.gypi +++ /dev/null @@ -1,60 +0,0 @@ -{ - 'targets': [ - { - 'target_name': 'qt-qml-app', - 'product_name': 'qquickmapboxgl', - 'type': 'executable', - - 'includes': [ - '../qt.gypi', - ], - - 'dependencies': [ - 'qt-lib', - ], - - 'sources': [ - 'main.cpp', - 'qml.qrc', - ], - - 'include_dirs': [ - '../include', - ], - - 'variables': { - 'cflags': [ - '<@(opengl_cflags)', - '<@(qt_core_cflags)', - '<@(qt_gui_cflags)', - '<@(qt_location_cflags)', - '<@(qt_positioning_cflags)', - '<@(qt_qml_cflags)', - '<@(qt_quick_cflags)', - '-fPIC', - ], - 'ldflags': [ - '<@(opengl_ldflags)', - '<@(qt_core_ldflags)', - '<@(qt_gui_ldflags)', - '<@(qt_location_ldflags)', - '<@(qt_positioning_ldflags)', - '<@(qt_qml_ldflags)', - '<@(qt_quick_ldflags)', - ], - }, - - 'conditions': [ - ['OS == "mac"', { - 'xcode_settings': { - 'OTHER_CPLUSPLUSFLAGS': [ '<@(cflags)' ], - 'OTHER_LDFLAGS': [ '<@(ldflags)' ], - }, - }, { - 'cflags_cc': [ '<@(cflags)' ], - 'libraries': [ '<@(ldflags)' ], - }], - ], - }, - ], -} diff --git a/platform/qt/qt.gypi b/platform/qt/qt.gypi deleted file mode 100644 index e98b3254b..000000000 --- a/platform/qt/qt.gypi +++ /dev/null @@ -1,20 +0,0 @@ -{ - 'rules': [ - { - 'rule_name': 'MOC files', - 'extension': 'hpp', - 'process_outputs_as_sources': 1, - 'outputs': [ '<(SHARED_INTERMEDIATE_DIR)/<(RULE_INPUT_DIRNAME)/moc_<(RULE_INPUT_ROOT).cpp' ], - 'action': [ '<(qt_moc)', '<(RULE_INPUT_PATH)', '-o', '<(SHARED_INTERMEDIATE_DIR)/<(RULE_INPUT_DIRNAME)/moc_<(RULE_INPUT_ROOT).cpp' ], - 'message': 'Generating MOC <(RULE_INPUT_ROOT).cpp', - }, - { - 'rule_name': 'QRC files', - 'extension': 'qrc', - 'process_outputs_as_sources': 1, - 'outputs': [ '<(SHARED_INTERMEDIATE_DIR)/<(RULE_INPUT_DIRNAME)/qrc_<(RULE_INPUT_ROOT).cpp' ], - 'action': [ '<(qt_rcc)', '<(RULE_INPUT_PATH)', '-name', '<(RULE_INPUT_ROOT)', '-o', '<(SHARED_INTERMEDIATE_DIR)/<(RULE_INPUT_DIRNAME)/qrc_<(RULE_INPUT_ROOT).cpp' ], - 'message': 'Generating QRC <(RULE_INPUT_ROOT).cpp', - }, - ], -} diff --git a/platform/qt/scripts/configure.sh b/platform/qt/scripts/configure.sh deleted file mode 100644 index 23f4b0bf5..000000000 --- a/platform/qt/scripts/configure.sh +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env bash - -CXX11ABI=${CXX11ABI:-$(scripts/check-cxx11abi.sh)} - -UNIQUE_RESOURCE_VERSION=dev -PROTOZERO_VERSION=1.3.0 -BOOST_VERSION=1.60.0 -GEOMETRY_VERSION=0.8.0 -GEOJSON_VERSION=0.1.4${CXX11ABI:-} -GEOJSONVT_VERSION=6.1.2 -SUPERCLUSTER_VERSION=0.2.0 -KDBUSH_VERSION=0.1.1 -GTEST_VERSION=1.7.0${CXX11ABI:-} -LIBJPEG_TURBO_VERSION=1.4.2 -PIXELMATCH_VERSION=0.9.0 -RAPIDJSON_VERSION=1.0.2 -SQLITE_VERSION=3.9.1 -VARIANT_VERSION=1.1.0 -ZLIB_VERSION=system -WEBP_VERSION=0.5.0 -EARCUT_VERSION=0.11 - -function print_default_flags { - CONFIG+=" 'cflags': $(quote_flags -fvisibility=hidden -D__QT__),"$LN -} - -if [ "$MASON_PLATFORM" == "osx" ]; then - # XXX: Argh, adding the __QT__ flag here because GYP for OSX does - # not respect the `cflags` variable above and we need it to reach - # the utests somehow. Gonna be fixed properly when we move to CMake. - function print_opengl_flags { - CONFIG+=" 'opengl_cflags%': ['-D__QT__'],"$LN - CONFIG+=" 'opengl_ldflags%': ['-framework OpenGL', '-framework CoreFoundation'],"$LN - } -else - function print_opengl_flags { - CONFIG+=" 'opengl_cflags%': $(quote_flags $(pkg-config gl x11 --cflags)),"$LN - CONFIG+=" 'opengl_ldflags%': $(quote_flags $(pkg-config gl x11 --libs)),"$LN - } -fi - -function print_qt_flags { - mason install Qt system - - QMAKE="qmake" - if [ ! $(which ${QMAKE} 2>/dev/null) ]; then - QMAKE="qmake-qt5" - fi - - QT_VERSION_MAJOR=$(${QMAKE} -query QT_VERSION | cut -d. -f1) - CONFIG+=" 'qt_version_major%': ['${QT_VERSION_MAJOR}'],"$LN - CONFIG+=" 'qt_image_decoders%': [0],"$LN - - CONFIG+=" 'qt_core_cflags%': $(quote_flags $(mason cflags Qt system "QtCore")),"$LN - CONFIG+=" 'qt_gui_cflags%': $(quote_flags $(mason cflags Qt system "QtGui")),"$LN - CONFIG+=" 'qt_opengl_cflags%': $(quote_flags $(mason cflags Qt system "QtOpenGL")),"$LN - CONFIG+=" 'qt_network_cflags%': $(quote_flags $(mason cflags Qt system "QtNetwork")),"$LN - - CONFIG+=" 'qt_core_ldflags%': $(quote_flags $(mason ldflags Qt system "QtCore")),"$LN - CONFIG+=" 'qt_gui_ldflags%': $(quote_flags $(mason ldflags Qt system "QtGui")),"$LN - CONFIG+=" 'qt_opengl_ldflags%': $(quote_flags $(mason ldflags Qt system "QtOpenGL")),"$LN - CONFIG+=" 'qt_network_ldflags%': $(quote_flags $(mason ldflags Qt system "QtNetwork")),"$LN - - if [ ${QT_VERSION_MAJOR} -gt 4 ]; then - CONFIG+=" 'qt_location_cflags%': $(quote_flags $(mason cflags Qt system "QtLocation")),"$LN - CONFIG+=" 'qt_qml_cflags%': $(quote_flags $(mason cflags Qt system "QtQml")), "$LN - CONFIG+=" 'qt_quick_cflags%': $(quote_flags $(mason cflags Qt system "QtQuick")), "$LN - CONFIG+=" 'qt_positioning_cflags%': $(quote_flags $(mason cflags Qt system "QtPositioning")),"$LN - - CONFIG+=" 'qt_location_ldflags%': $(quote_flags $(mason ldflags Qt system "QtLocation")),"$LN - CONFIG+=" 'qt_qml_ldflags%': $(quote_flags $(mason ldflags Qt system "QtQml")), "$LN - CONFIG+=" 'qt_quick_ldflags%': $(quote_flags $(mason ldflags Qt system "QtQuick")), "$LN - CONFIG+=" 'qt_positioning_ldflags%': $(quote_flags $(mason ldflags Qt system "QtPositioning")),"$LN - fi - - if hash moc 2>/dev/null && hash rcc 2>/dev/null; then - CONFIG+=" 'qt_moc%': '$(which moc)',"$LN - CONFIG+=" 'qt_rcc%': '$(which rcc)',"$LN - elif [ ${QT_VERSION_MAJOR} -gt 4 ] ; then - CONFIG+=" 'qt_moc%': '$(pkg-config Qt${QT_VERSION_MAJOR}Core --variable=host_bins)/moc',"$LN - CONFIG+=" 'qt_rcc%': '$(pkg-config Qt${QT_VERSION_MAJOR}Core --variable=host_bins)/rcc',"$LN - else - CONFIG+=" 'qt_moc%': '$(pkg-config QtCore --variable=moc_location)',"$LN - CONFIG+=" 'qt_rcc%': '$(pkg-config QtCore --variable=rcc_location)',"$LN - fi -} - -CONFIGURE_SUPLATFORM=platform/qt/scripts/configure-${MASON_PLATFORM_VERSION}.sh - -if [ -f $CONFIGURE_SUPLATFORM ]; then - source $CONFIGURE_SUPLATFORM -fi diff --git a/scripts/clang-tools.sh b/scripts/clang-tools.sh index f26b06526..6a10740c7 100755 --- a/scripts/clang-tools.sh +++ b/scripts/clang-tools.sh @@ -18,6 +18,8 @@ command -v ${CLANG_TIDY} >/dev/null 2>&1 || { cd $1 +CDUP=$(git rev-parse --show-cdup) + function check_tidy() { echo "Running clang-tidy on $0..." if [[ -n $1 ]] && [[ $1 == "--fix" ]]; then @@ -34,7 +36,7 @@ function check_tidy() { function check_format() { echo "Running clang-format on $0..." - ${CLANG_FORMAT} -i ../../../$0 + ${CLANG_FORMAT} -i ${CDUP}/$0 } export CLANG_TIDY CLANG_FORMAT @@ -61,6 +63,6 @@ if [ -n $2 ] && [ $2 == "--diff" ]; then fi echo "All looks good!" else - git ls-files '../../../src/mbgl/*.cpp' '../../../platform/*.cpp' '../../../test/*.cpp' | \ + git ls-files '${CDUP}/src/mbgl/*.cpp' '${CDUP}/platform/*.cpp' '${CDUP}/test/*.cpp' | \ xargs -I{} -P ${JOBS} bash -c 'check_tidy' {} fi diff --git a/scripts/generate-core-files.sh b/scripts/generate-core-files.sh new file mode 100755 index 000000000..a14239b8f --- /dev/null +++ b/scripts/generate-core-files.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash + +set -e +set -o pipefail + +echo "# Do not edit. Regenerate this with ./scripts/generate-core-files.sh" > cmake/core-files.cmake +echo "" >> cmake/core-files.cmake +echo "set(MBGL_CORE_FILES" >> cmake/core-files.cmake +PREFIX= +for FILE in $(find include src -type f -a \( -name "*.hpp" -o -name "*.cpp" -o -name "*.h" -o -name "*.c" \) | perl -p -e "s/^((src|include)\/(mbgl\/)?(.+)\/\w+\.\w+)$/\$4#\$1/g" | sort) ; do + CURRENT_PREFIX="${FILE%#*}" + if [ "${PREFIX}" != "${CURRENT_PREFIX}" ]; then + if [ ! -z "${PREFIX}" ]; then echo "" >> cmake/core-files.cmake ; fi + echo " # ${CURRENT_PREFIX}" >> cmake/core-files.cmake + PREFIX="${CURRENT_PREFIX}" + fi + echo " ${FILE#*#}" >> cmake/core-files.cmake +done +echo ")" >> cmake/core-files.cmake +git diff cmake/core-files.cmake diff --git a/scripts/generate-test-files.sh b/scripts/generate-test-files.sh new file mode 100755 index 000000000..0af6828c6 --- /dev/null +++ b/scripts/generate-test-files.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash + +set -e +set -o pipefail + +echo "# Do not edit. Regenerate this with ./scripts/generate-test-files.sh" > cmake/test-files.cmake +echo "" >> cmake/test-files.cmake +echo "set(MBGL_TEST_FILES" >> cmake/test-files.cmake +PREFIX= +for FILE in $(find test -type f -a \( -name "*.hpp" -o -name "*.cpp" -o -name "*.h" -o -name "*.c" \) | sort) ; do + CURRENT_PREFIX=$(dirname ${FILE#test/}) + if [ "${PREFIX}" != "${CURRENT_PREFIX}" ]; then + if [ ! -z "${PREFIX}" ]; then echo "" >> cmake/test-files.cmake ; fi + echo " # ${CURRENT_PREFIX}" >> cmake/test-files.cmake + PREFIX="${CURRENT_PREFIX}" + fi + echo " ${FILE}" >> cmake/test-files.cmake +done +echo ")" >> cmake/test-files.cmake +git diff cmake/test-files.cmake diff --git a/scripts/travis_setup.sh b/scripts/travis_setup.sh index dfd045224..ae8dda46b 100755 --- a/scripts/travis_setup.sh +++ b/scripts/travis_setup.sh @@ -43,6 +43,10 @@ export DISPLAY=:99.0 mapbox_time "checkout_mason" \ git submodule update --init .mason +# Touch package.json so that we are definitely going to run an npm update action +mapbox_time "touch_package_json" \ +touch package.json + # Install and set up to load a more recent version of mesa mapbox_time "install_mesa" \ mason install mesa 11.2.2 diff --git a/test/src/main.cpp b/test/src/main.cpp index a481dc5dc..d01cf75ff 100644 --- a/test/src/main.cpp +++ b/test/src/main.cpp @@ -1,5 +1,20 @@ #include +#include +#include +#include +#include + +#define xstr(s) str(s) +#define str(s) #s int main(int argc, char *argv[]) { +#ifdef WORK_DIRECTORY + const int result = chdir(xstr(WORK_DIRECTORY)); + if (result != 0) { + fprintf(stderr, "failed to change directory: %s\n", strerror(errno)); + return errno; + } +#endif + return mbgl::runTests(argc, argv); } diff --git a/test/src/mbgl/test/util.cpp b/test/src/mbgl/test/util.cpp index 4021fd89b..393d65b66 100644 --- a/test/src/mbgl/test/util.cpp +++ b/test/src/mbgl/test/util.cpp @@ -14,10 +14,17 @@ #include +#ifndef NODE_EXECUTABLE +#define NODE_EXECUTABLE node +#endif + +#define xstr(s) str(s) +#define str(s) #s + namespace mbgl { namespace test { -Server::Server(const char* executable) { +Server::Server(const char* script) { int input[2]; int output[2]; @@ -48,14 +55,18 @@ Server::Server(const char* executable) { close(output[1]); close(output[0]); + const char* executable = xstr(NODE_EXECUTABLE); + + fprintf(stderr, "executable: %s\n", executable); + // Launch the actual server process. - int ret = execl(executable, executable, nullptr); + int ret = execl(executable, executable, script, nullptr); // This call should not return. In case execl failed, we exit anyway. if (ret < 0) { Log::Error(Event::Setup, "Failed to start server: %s", strerror(errno)); } - exit(0); + abort(); } else { // This is the parent process. diff --git a/test/src/mbgl/test/util.hpp b/test/src/mbgl/test/util.hpp index 30108a886..66499c6fd 100644 --- a/test/src/mbgl/test/util.hpp +++ b/test/src/mbgl/test/util.hpp @@ -59,7 +59,7 @@ namespace test { class Server { public: - Server(const char* executable); + Server(const char* script); ~Server(); private: diff --git a/test/test.gypi b/test/test.gypi deleted file mode 100644 index 82bd02bd8..000000000 --- a/test/test.gypi +++ /dev/null @@ -1,169 +0,0 @@ -{ - 'targets': [ - { - 'target_name': 'test-lib', - 'type': 'static_library', - 'standalone_static_library': 1, - 'hard_dependency': 1, - 'dependencies': [ - 'core', - ], - - 'include_dirs': [ - '../include', - '../src', - '../platform/default', - 'include', - 'src', - ], - - 'sources': [ - 'util/async_task.cpp', - 'util/geo.cpp', - 'util/image.cpp', - 'util/mapbox.cpp', - 'util/memory.cpp', - 'util/merge_lines.cpp', - 'util/run_loop.cpp', - 'util/number_conversions.cpp', - 'util/text_conversions.cpp', - 'util/thread.cpp', - 'util/thread_local.cpp', - 'util/tile_cover.cpp', - 'util/timer.cpp', - 'util/token.cpp', - 'util/work_queue.cpp', - 'util/projection.cpp', - - 'algorithm/covered_by_children.cpp', - 'algorithm/generate_clip_ids.cpp', - 'algorithm/mock.hpp', - 'algorithm/update_renderables.cpp', - - 'api/annotations.cpp', - 'api/api_misuse.cpp', - 'api/repeated_render.cpp', - 'api/render_missing.cpp', - 'api/set_style.cpp', - 'api/custom_layer.cpp', - - 'geometry/binpack.cpp', - - 'gl/object.cpp', - - 'map/map.cpp', - 'map/transform.cpp', - - 'math/minmax.cpp', - 'math/clamp.cpp', - - 'text/quads.cpp', - - 'tile/geometry_tile_data.cpp', - 'tile/tile_id.cpp', - - 'storage/offline.cpp', - 'storage/offline_database.cpp', - 'storage/offline_download.cpp', - 'storage/asset_file_source.cpp', - 'storage/default_file_source.cpp', - 'storage/http_file_source.cpp', - 'storage/online_file_source.cpp', - 'storage/headers.cpp', - 'storage/resource.cpp', - - 'style/glyph_store.cpp', - 'style/source.cpp', - 'style/style.cpp', - 'style/style_layer.cpp', - 'style/tile_source.cpp', - 'style/filter.cpp', - 'style/functions.cpp', - 'style/style_parser.cpp', - - 'sprite/sprite_atlas.cpp', - 'sprite/sprite_image.cpp', - 'sprite/sprite_parser.cpp', - 'sprite/sprite_store.cpp', - - 'src/mbgl/test/stub_file_source.hpp', - 'src/mbgl/test/stub_file_source.cpp', - 'src/mbgl/test/util.hpp', - 'src/mbgl/test/util.cpp', - 'src/mbgl/test/fixture_log_observer.hpp', - 'src/mbgl/test/fixture_log_observer.cpp', - 'src/mbgl/test/test.cpp' - ], - - 'variables': { - 'cflags_cc': [ - '<@(gtest_cflags)', - '<@(opengl_cflags)', - '<@(protozero_cflags)', - '<@(boost_cflags)', - '<@(sqlite_cflags)', - '<@(geojsonvt_cflags)', - '<@(supercluster_cflags)', - '<@(kdbush_cflags)', - '<@(rapidjson_cflags)', - '<@(pixelmatch_cflags)', - '<@(earcut_cflags)', - ], - 'ldflags': [ - '<@(gtest_ldflags)', - '<@(sqlite_ldflags)', - ], - 'libraries': [ - '<@(gtest_static_libs)', - '<@(sqlite_static_libs)' - ], - }, - - 'conditions': [ - ['OS == "mac"', { - 'xcode_settings': { - 'OTHER_CPLUSPLUSFLAGS': [ '<@(cflags_cc)' ], - }, - }, { - 'cflags_cc': [ '<@(cflags_cc)' ], - }], - ], - 'link_settings': { - 'conditions': [ - ['OS == "mac"', { - 'libraries': [ '<@(libraries)' ], - 'xcode_settings': { 'OTHER_LDFLAGS': [ '<@(ldflags)' ] } - }, { - 'libraries': [ '<@(libraries)', '<@(ldflags)' ], - }] - ], - }, - - 'direct_dependent_settings': { - 'include_dirs': [ - 'include', - ], - - # Force the linker to include all the objects from the lib-test archive. Otherwise they'd - # be discarded because there are no undefined symbols to pull them in, and the resulting - # executable would run zero tests. - - 'conditions': [ - ['OS == "mac"', { - 'xcode_settings': { - 'OTHER_LDFLAGS': [ - '-Wl,-force_load,<(PRODUCT_DIR)/libtest-lib.a', - ], - } - }, { - 'link_settings': { - 'ldflags': [ - '-Wl,-whole-archive <(PRODUCT_DIR)/libtest-lib.a -Wl,-no-whole-archive', - ], - }, - }], - ], - }, - }, - ] -}