Including files from one directory up with CMake or basic builders



  • I have an in-progress app I've been trying to create from a godot game demo.

    Mostly I've been making great progress with this. I got a click package to build and "start" godot (with a crash), and I actually contributed a fix to the docker image for arm64 hosts so it's now easier to debug + build the game on an arm64 machine before sending it to the phone.

    One thing I've been having a lot of unnecessary trouble with is keeping a reasonable directory structure and still compiling my click package. I have things arranged like this:

    repository
    |
    `--- main branch directories
    |
    `--- zensekai (experimental branch directory)
          |
          `--- bin (compiled game)
          |
          `--- zensekai-click (click package)
    

    And the Makefile in zensekai copies/compiles all the game binaries that should be needed for either the desktop version or the click package.

    From reading the clickable documentation I felt like I should be able to set the project root to ../ aka zensekai and from the zensekai-click/CMakeLists.txt file copy in binaries from bin. But CMake seems to only want to put files in zensekai-click into the container for building, and I have no idea what command or "makefile" to use for the pure or custom builders much less whether they can do this, and I'm very confused.



  • The solution to this was laughably simple.
    all I had to do was touch CMakeLists.txt making a completely empty file in the zensekai directory, and then CMake automatically decided to continue in zensekai-click with the other CMakeLists.txt.


    edit 7-13:
    There was actually a little more required.

    in the top CMakeLists.txt I had to put

    add_subdirectory(zensekai-click)
    

    and in the zensekai-click one I accessed/disambiguated the two directories with

    # set $PR_ROOT to upper directory
    get_filename_component(PR_ROOT "../" ABSOLUTE)
    # set $CLICK_DIR to zensekai-click directory
    set(CLICK_DIR "${PR_ROOT}/zensekai-click")
    

    another thing you might run into developing a click package that copies binaries is permissions on binaries.
    I set them in the loop that copies the binaries like so:

    foreach(binary ${BINARIES})
            install(FILES ${PR_ROOT}/bin/${binary}
                    # the important part
                    PERMISSIONS OWNER_READ OWNER_EXECUTE GROUP_READ WORLD_READ WORLD_EXECUTE
                    # this might actually be unnecessarily permissive*.
                    # it might be enough to just have OWNER_READ and OWNER_EXECUTE
                    DESTINATION ${DATA_DIR}
            )
    endforeach()
    

    (* I got sidetracked thinking the permissions weren't enough when I accidentally had my project copying the x86_64 godot binary for a bit - which had bash claiming it "wasn't permitted" to execute while it actually meant that was impossible.)


Log in to reply