Forráskód Böngészése

Combined sey of snap fixes for Linux

Signed-off-by: AMZN-Phil <[email protected]>
AMZN-Phil 2 éve
szülő
commit
997f68b01d

+ 5 - 0
cmake/LYPython.cmake

@@ -143,6 +143,11 @@ function(ly_pip_install_local_package_editable package_folder_path pip_package_n
     set(stamp_file ${CMAKE_BINARY_DIR}/packages/pip_installs/${pip_package_name}.stamp)
     get_filename_component(stamp_file_directory ${stamp_file} DIRECTORY)
     file(MAKE_DIRECTORY ${stamp_file_directory})
+    
+    # for the first release of the o3de snap we will only use packages shipped with o3de
+    if ($ENV{O3DE_SNAP})
+        file(TOUCH ${stamp_file})
+    endif()
    
     # we only ever need to do this once per runtime install, since its a link
     # not an actual install:

+ 20 - 8
cmake/Platform/Linux/CompilerSettings_linux.cmake

@@ -7,14 +7,26 @@
 #
 
 if(NOT CMAKE_C_COMPILER AND NOT CMAKE_CXX_COMPILER AND NOT "$ENV{CC}" AND NOT "$ENV{CXX}")
-    set(path_search
-        /bin
-        /usr/bin
-        /usr/local/bin
-        /sbin
-        /usr/sbin
-        /usr/local/sbin
-    )
+    if ($ENV{O3DE_SNAP})
+        set(path_search
+            $ENV{SNAP}/bin
+            $ENV{SNAP}/usr/bin
+            $ENV{SNAP}/usr/local/bin
+            $ENV{SNAP}/sbin
+            $ENV{SNAP}/usr/sbin
+            $ENV{SNAP}/usr/local/sbin
+        )
+    else()
+        set(path_search
+            /bin
+            /usr/bin
+            /usr/local/bin
+            /sbin
+            /usr/sbin
+            /usr/local/sbin
+        )
+
+    endif()
     list(TRANSFORM path_search APPEND "/clang-[0-9]*" OUTPUT_VARIABLE path_with_version_search)
     file(GLOB clang_versions ${path_with_version_search})
     unset(compiler_found)

+ 55 - 18
cmake/Platform/Linux/Configurations_linux.cmake

@@ -10,23 +10,55 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
 
     include(cmake/Platform/Common/Clang/Configurations_clang.cmake)
 
-    ly_append_configurations_options(
-        DEFINES
-            LINUX
-            __linux__
-            LINUX64
-        COMPILATION
-            -msse4.1
-        LINK_NON_STATIC
-            -Wl,--no-undefined
-            -fpie
-            -Wl,-z,relro,-z,now
-            -Wl,-z,noexecstack
-        LINK_EXE
-            -fpie
-            -Wl,-z,relro,-z,now
-            -Wl,-z,noexecstack
-    )
+    if ($ENV{O3DE_SNAP})
+        ly_append_configurations_options(
+            DEFINES
+                LINUX
+                __linux__
+                LINUX64
+            COMPILATION
+                -msse4.1
+            LINK_NON_STATIC
+                -Wl,--no-undefined
+                -fpie
+                -Wl,-z,relro,-z,now
+                -Wl,-z,noexecstack
+                -L$ENV{SNAP}/usr/lib/gcc/x86_64-linux-gnu/12/
+                -L/snap/core22/current/lib/x86_64-linux-gnu
+                -L/snap/core22/current/usr/lib/x86_64-linux-gnu
+                -L$ENV{SNAP}/lib/x86_64-linux-gnu
+                -L$ENV{SNAP}/lib32/x86_64-linux-gnu
+                -L$ENV{SNAP}/usr/lib/x86_64-linux-gnu
+            LINK_EXE
+                -fpie
+                -Wl,-z,relro,-z,now
+                -Wl,-z,noexecstack
+                -L$ENV{SNAP}/usr/lib/gcc/x86_64-linux-gnu/12/
+                -L/snap/core22/current/lib/x86_64-linux-gnu
+                -L/snap/core22/current/usr/lib/x86_64-linux-gnu
+                -L$ENV{SNAP}/lib/x86_64-linux-gnu
+                -L$ENV{SNAP}/lib32/x86_64-linux-gnu
+                -L$ENV{SNAP}/usr/lib/x86_64-linux-gnu
+        )
+    else()
+        ly_append_configurations_options(
+            DEFINES
+                LINUX
+                __linux__
+                LINUX64
+            COMPILATION
+                -msse4.1
+            LINK_NON_STATIC
+                -Wl,--no-undefined
+                -fpie
+                -Wl,-z,relro,-z,now
+                -Wl,-z,noexecstack
+            LINK_EXE
+                -fpie
+                -Wl,-z,relro,-z,now
+                -Wl,-z,noexecstack
+        )
+    endif()
 
     ly_set(CMAKE_CXX_EXTENSIONS OFF)
 elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
@@ -63,4 +95,9 @@ endif()
 
 ly_set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
 ly_set(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)
-ly_set(CMAKE_INSTALL_RPATH "$ORIGIN")
+
+if ($ENV{O3DE_SNAP})
+    ly_set(CMAKE_INSTALL_RPATH "$ORIGIN:/snap/core22/current/lib/x86_64-linux-gnu:/snap/core22/current/usr/lib/x86_64-linux-gnu")
+else()
+    ly_set(CMAKE_INSTALL_RPATH "$ORIGIN")
+endif()

+ 4 - 0
cmake/Platform/Linux/PAL_linux.cmake

@@ -28,6 +28,10 @@ ly_set(PAL_TRAIT_TEST_LYTESTTOOLS_SUPPORTED TRUE)
 ly_set(PAL_TRAIT_TEST_PYTEST_SUPPORTED TRUE)
 ly_set(PAL_TRAIT_TEST_TARGET_TYPE MODULE)
 
+if ($ENV{O3DE_SNAP})
+    list(APPEND CMAKE_PREFIX_PATH "$ENV{SNAP}/usr/lib/x86_64-linux-gnu")
+endif()
+
 if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
     ly_set(PAL_TRAIT_COMPILER_ID Clang)
     ly_set(PAL_TRAIT_COMPILER_ID_LOWERCASE clang)

+ 42 - 25
cmake/Platform/Linux/Packaging/snapcraft.yaml.in

@@ -12,55 +12,72 @@ parts:
     plugin: dump
     source: ./${CPACK_PACKAGE_NAME}
     source-type: local
+    build-attributes:
+     - enable-patchelf
     stage-packages:
-     - clang
+     - cmake
+     - clang-14
      - ninja-build
-     - libatomic1
-     - libfreetype6
-     - libpng16-16
-     - libgl1
+     - libglu1-mesa-dev
+     - libxcb-xinerama0
+     - libxcb-xinput0
+     - libxcb-xinput-dev
+     - libxcb-xfixes0-dev
+     - libxcb-xkb-dev
+     - libxkbcommon-dev
+     - libxkbcommon-x11-dev
+     - libfontconfig1-dev
+     - libcurl4-openssl-dev
+     - libsdl2-dev
+     - zlib1g-dev
+     - mesa-common-dev
+     - libssl-dev
+     - libffi8
      - libxcb-icccm4
      - libxcb-image0
      - libxcb-keysyms1
      - libxcb-randr0
      - libxcb-render-util0
-     - libxcb-render0
-     - libxcb-shape0
-     - libxcb-xinerama0
-     - libxcb-xinput0
-     - libxcb-xkb1
-     - libxkbcommon-x11-0
-     - libxkbcommon0
-     - libpcre2-16-0
-     - libopengl0
-     - libice6
-     - libsm6
-     - libcurl4
-     - libfontconfig1
      - libunwind-dev
-    stage-snaps:
-     - cmake
+     - pkg-config
+     - libc-dev
+     - libstdc++-12-dev
 
-layout:
-  /etc/o3de/${CPACK_PACKAGE_VERSION}/downloaded_packages:
-    bind: $SNAP/${CPACK_PACKAGE_VERSION}/python/downloaded_packages
-  /etc/o3de/${CPACK_PACKAGE_VERSION}/runtime:
-    bind: $SNAP/${CPACK_PACKAGE_VERSION}/python/runtime
+  patch-o3de:
+    plugin: nil
+    after: [o3de]
+    build-packages: [patchelf]
+    override-stage: |
+      snapcraftctl stage
+      find $SNAPCRAFT_STAGE/usr/bin/ -type f -executable -exec patchelf --set-interpreter /snap/core22/current/lib64/ld-linux-x86-64.so.2 {} \;
+      find $SNAPCRAFT_STAGE/usr/lib/ -type f -executable -exec patchelf --set-interpreter /snap/core22/current/lib64/ld-linux-x86-64.so.2 {} \;
+      find $SNAPCRAFT_STAGE/usr/bin/ -type f -executable -exec patchelf --force-rpath --set-rpath $(patchelf --print-rpath {})':/snap/core22/current/lib/x86_64-linux-gnu:/snap/core22/current/usr/lib/x86_64-linux-gnu' {} \;
+      find $SNAPCRAFT_STAGE/usr/lib/ -type f -exec patchelf --force-rpath --set-rpath $(patchelf --print-rpath {})':/snap/core22/current/lib/x86_64-linux-gnu:/snap/core22/current/usr/lib/x86_64-linux-gnu' {} \;
+      find $SNAPCRAFT_STAGE/lib/ -type f -exec patchelf --force-rpath --set-rpath $(patchelf --print-rpath {} )':/snap/core22/current/lib/x86_64-linux-gnu:/snap/core22/current/usr/lib/x86_64-linux-gnu' {} \;
+      find $SNAPCRAFT_STAGE/lib32/ -type f -exec patchelf --force-rpath --set-rpath $(patchelf --print-rpath {} )':/snap/core22/current/lib/x86_64-linux-gnu:/snap/core22/current/usr/lib/x86_64-linux-gnu' {} \;
+      cp $SNAPCRAFT_STAGE/${CPACK_PACKAGE_VERSION}/cmake/Platform/Linux/Packaging/libc.so $SNAPCRAFT_STAGE/usr/lib/x86_64-linux-gnu/libc.so
 
 apps:
   o3de:
     command: ${CPACK_PACKAGE_VERSION}/bin/Linux/profile/Default/o3de
     environment:
       LD_LIBRARY_PATH: $SNAP/${CPACK_PACKAGE_VERSION}/bin/Linux/profile/Default:$LD_LIBRARY_PATH
+      O3DE_SNAP: 1
+      SNAP_BUILD: ${CPACK_PACKAGE_VERSION}
+      PKG_CONFIG: $SNAP/usr/bin/pkg-config --define-variable=libdir=$SNAP/usr/lib/x86_64-linux-gnu
       DISABLE_WAYLAND: 1
   editor:
     command: ${CPACK_PACKAGE_VERSION}/bin/Linux/profile/Default/Editor
     environment:
       LD_LIBRARY_PATH: $SNAP/${CPACK_PACKAGE_VERSION}/bin/Linux/profile/Default:$LD_LIBRARY_PATH
+      O3DE_SNAP: 1
+      SNAP_BUILD: ${CPACK_PACKAGE_VERSION}
       DISABLE_WAYLAND: 1
   assetprocessor:
     command: ${CPACK_PACKAGE_VERSION}/bin/Linux/profile/Default/AssetProcessor
     environment:
       LD_LIBRARY_PATH: $SNAP/${CPACK_PACKAGE_VERSION}/bin/Linux/profile/Default:$LD_LIBRARY_PATH
+      O3DE_SNAP: 1
+      SNAP_BUILD: ${CPACK_PACKAGE_VERSION}
       DISABLE_WAYLAND: 1
     

+ 36 - 1
cmake/Platform/Linux/Packaging_Snapcraft.cmake

@@ -11,7 +11,42 @@ configure_file("${LY_ROOT_FOLDER}/cmake/Platform/Linux/Packaging/snapcraft.yaml.
     "${CPACK_TEMPORARY_DIRECTORY}/snapcraft.yaml"
 )
 
-# build snap
+execute_process (COMMAND lsb_release -a)
+
+execute_process (COMMAND bash ${CPACK_TEMPORARY_DIRECTORY}/O3DE/${CPACK_PACKAGE_VERSION}/python/get_python.sh)
+
+# Patch binaries to setup rpath and interpreter. Once snapcraft 7.3 is in stable, it should be possible to remove 
+# these 4 processes since automatic elf patching will be available for core22
+
+# setup the rpath
+execute_process (COMMAND find ./O3DE/${CPACK_PACKAGE_VERSION}/bin/Linux -type f -executable -exec patchelf --force-rpath --set-rpath \$ORIGIN:/snap/core22/current/lib/x86_64-linux-gnu:/snap/core22/current/usr/lib/x86_64-linux-gnu {} \;
+                 WORKING_DIRECTORY ${CPACK_TEMPORARY_DIRECTORY}
+)
+
+# setup the correct elf interpreter
+execute_process (COMMAND find ./O3DE/${CPACK_PACKAGE_VERSION}/bin/Linux -type f -executable -exec patchelf --set-interpreter /snap/core22/current/lib64/ld-linux-x86-64.so.2 {} \;
+                 WORKING_DIRECTORY ${CPACK_TEMPORARY_DIRECTORY}
+)
+
+execute_process (COMMAND find ./O3DE/${CPACK_PACKAGE_VERSION}/python/runtime -type f -executable -exec patchelf --force-rpath --set-rpath \$ORIGIN:/snap/core22/current/lib/x86_64-linux-gnu:/snap/core22/current/usr/lib/x86_64-linux-gnu {} \;
+                 WORKING_DIRECTORY ${CPACK_TEMPORARY_DIRECTORY}
+)
+
+# setup the correct elf interpreter
+execute_process (COMMAND find ./O3DE/${CPACK_PACKAGE_VERSION}/python/runtime -type f -executable -exec patchelf --set-interpreter /snap/core22/current/lib64/ld-linux-x86-64.so.2 {} \;
+                 WORKING_DIRECTORY ${CPACK_TEMPORARY_DIRECTORY}
+)
+
+# make sure that all files have the correct permissions
+execute_process (COMMAND chmod -R 755 O3DE
+                 WORKING_DIRECTORY ${CPACK_TEMPORARY_DIRECTORY}
+)
+
+# clean then build snap
+execute_process (COMMAND snapcraft clean
+                 WORKING_DIRECTORY ${CPACK_TEMPORARY_DIRECTORY}
+)
+
 execute_process (COMMAND snapcraft --verbose
                  WORKING_DIRECTORY ${CPACK_TEMPORARY_DIRECTORY}
 )

+ 6 - 0
cmake/install/Findo3de.cmake.in

@@ -41,6 +41,12 @@ if (disable_test_modules)
     set(PAL_TRAIT_BUILD_TESTS_SUPPORTED FALSE)
 endif()
 
+if ($ENV{O3DE_SNAP})
+    list(APPEND CMAKE_REQUIRED_INCLUDES "$ENV{SNAP}/usr/include;$ENV{SNAP}/usr/include/x86_64-linux-gnu;/snap/core22/current/usr/include;/snap/core22/current/usr/include/x86_64-linux-gnu")
+    list(APPEND CMAKE_REQUIRED_LINK_OPTIONS "Wl,-L$ENV{SNAP}/usr/lib/x86_64-linux-gnu")
+    list(APPEND CMAKE_REQUIRED_LINK_OPTIONS "-print-target-triple")
+endif()
+
 # Inject the CompilerSettings.cmake to be included before the project command
 set(CMAKE_PROJECT_INCLUDE_BEFORE "${engine_root_folder}cmake/CompilerSettings.cmake")
 

+ 11 - 1
python/get_python.sh

@@ -27,7 +27,17 @@ install_dependencies () {
         return $retVal
     fi
 
-    $DIR/pip.sh install -e $DIR/../scripts/o3de --no-deps --disable-pip-version-check  --no-warn-script-location
+    # if we're building a container app, create a package from o3de then install that to remove absolute paths to o3de scripts
+    if [ $O3DE_BUILDING_CONTAINER == 1 ]; then
+        pushd $DIR/../scripts/o3de/
+        $DIR/python.sh setup.py sdist
+        popd
+
+        $DIR/pip.sh install $DIR/../scripts/o3de/dist/o3de-1.0.0.tar.gz --no-deps --disable-pip-version-check --no-cache
+    else
+        $DIR/pip.sh install -e $DIR/../scripts/o3de --no-deps --disable-pip-version-check  --no-warn-script-location
+    fi
+
     retVal=$?
     if [ $retVal -ne 0 ]; then
         echo "Failed to install $DIR/../scripts/o3de into python.  Check the log above!"

+ 1 - 0
scripts/build/Platform/Linux/build_config.json

@@ -380,6 +380,7 @@
         "CONFIGURATION": "profile",
         "OUTPUT_DIRECTORY": "build/linux",
         "O3DE_PACKAGE_TYPE": "SNAP",
+        "O3DE_BUILDING_CONTAINER": "1",
         "CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DLY_PARALLEL_LINK_JOBS=4 -DLY_DISABLE_TEST_MODULES=TRUE -DO3DE_ENGINE_NAME=o3de-sdk -DLY_STRIP_DEBUG_SYMBOLS=TRUE",
         "CPACK_OPTIONS": "-D CPACK_UPLOAD_URL=${CPACK_UPLOAD_URL}",
         "CMAKE_TARGET": "all"

+ 4 - 1
scripts/o3de/o3de/manifest.py

@@ -25,7 +25,10 @@ logger.setLevel(logging.INFO)
 # Directory methods
 
 def get_this_engine_path() -> pathlib.Path:
-    return pathlib.Path(os.path.realpath(__file__)).parents[3].resolve()
+    if "SNAP" in os.environ:
+        return pathlib.Path(os.environ.get('SNAP')) / os.environ.get('SNAP_BUILD')
+    else:
+        return pathlib.Path(os.path.realpath(__file__)).parents[3].resolve()
 
 
 def get_home_folder() -> pathlib.Path:

+ 1 - 1
scripts/o3de/setup.py

@@ -28,7 +28,7 @@ if __name__ == '__main__':
         version="1.0.0",
         description='O3DE editor Python bindings test tools',
         long_description=long_description,
-        packages=find_packages(where='o3de', exclude=['tests']),
+        packages=find_packages(where='o3de', include=['o3de'], exclude=['tests']),
         install_requires=[
         ],
         tests_require=[