Как настроить набор инструментов для кросс-сборки CMake для процессора 6502 (C64)? - PullRequest
2 голосов
/ 29 июня 2019

Я пытаюсь настроить, насколько это возможно, систему сборки cmake для кросс-ассемблера Commodore 64/6502 под названием TMPx .

Мои вопросы:

  • Как мне заставить CMake [попытаться] обнаружить и установить исполняемый и правильный путь tmpx или TMPx.exe в различных указанных местах, в зависимости от платформы хоста?
    • И , если это даже возможно, в какой из перечисленных ниже модулей ./cmake/ такой поиск / обнаружение будет добавлен?
  • Есть ли способ заставить cmake . обнаруживать и перечислять версию TMPX, вместо отображения :

    - Идентификатор компилятора ASM_TMPX неизвестен

Кроме того, приветствуются другие советы и предложения.

(Вот мое git repo с файлами ниже)

Мой ./CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 3.14)
set(CMAKE_SYSTEM_NAME "C64")
set(CMAKE_SYSTEM_PROCESSOR 6502)

LIST(APPEND CMAKE_MODULE_PATH "${CMAKE_BINARY_DIR}/cmake")
#TODO: Try to move this into one of the cmake/ modules..
SET(CMAKE_ASM_TMPX_COMPILER "${CMAKE_BINARY_DIR}/tools/TMPx_v1.1.0-STYLE/linux-x86_64/tmpx")

PROJECT(test001 ASM_TMPX)

Следуя этому руководству из вики CMake До сих пор я получил следующие модули cmake, почти готовые и полуобработанные:

./cmake/CMakeASM_TMPXInformation.cmake

SET(ASM_DIALECT "_TMPX")

SET(CMAKE_ASM${ASM_DIALECT}_SOURCE_FILE_EXTENSIONS ms;s;asm)


#Set any default arguments here
#TODO: remove the nasm args
IF(UNIX)
    SET(CMAKE_ASM_TMPX_COMPILER_ARG1 "-f elf")
ELSE(UNIX)
    SET(CMAKE_ASM_TMPX_COMPILER_ARG1 "-f win32")
ENDIF(UNIX)

# This section exists to override the one in CMakeASMInformation.cmake
# (the default Information file). This removes the <FLAGS>
# thing so that your C compiler flags that have been set via
# set_target_properties don't get passed to TMPx and confuse it.
IF(NOT CMAKE_ASM${ASM_DIALECT}_COMPILE_OBJECT)

    #TODO: Change nasm args to correct tmpx arguments
    SET(CMAKE_ASM${ASM_DIALECT}_COMPILE_OBJECT "<CMAKE_ASM${ASM_DIALECT}_COMPILER> -o <OBJECT> <SOURCE>")

ENDIF(NOT CMAKE_ASM${ASM_DIALECT}_COMPILE_OBJECT)

INCLUDE(CMakeASMInformation)
SET(ASM_DIALECT)

./cmake/CMakeDetermineASM_TMPXCompiler.cmake

SET(ASM_DIALECT "_TMPX")

IF(UNIX)
    SET(CMAKE_ASM${ASM_DIALECT}_COMPILER_LIST ${_CMAKE_TOOLCHAIN_PREFIX}tmpx)
ENDIF()

# TODO: Properly determine exen for other host platforms
# (The Windows exe would be 'TMPx.exe' but possibly 'tmpx.exe' or 'TMPX.EXE')

INCLUDE(CMakeDetermineASMCompiler)

SET(ASM_DIALECT)

./cmake/CMakeTestASM_TMPXCompiler.cmake

###
# From original template:
# This file is used by EnableLanguage in cmGlobalGenerator to
# determine that the selected ASM-ATT "compiler" works.
# For assembler this can only check whether the compiler has been found,
# because otherwise there would have to be a separate assembler source file
# for each assembler on every architecture.
###

set(ASM_DIALECT "_TMPX")
include(CMakeTestASMCompiler)
set(ASM_DIALECT)

./cmake/Platform/C64.cmake

MESSAGE("-¤# Building for Commodore 64 platform! #¤-")

#this does not seem to work
#SET(CMAKE_ASM_TMPX_COMPILER "${CMAKE_BINARY_DIR}/tools/TMPx_v1.1.0-STYLE/linux-x86_64/tmpx")

set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS FALSE)

1 Ответ

1 голос
/ 30 июня 2019

После небольшой проверки с помощью команд CMake 'MESSAGE ()' я думаю, что получил хотя бы ответ на мой первый вопрос; . / Cmake / CMakeDetermineASM_TMPXCompiler.cmake - это первое, что запускается (и только при самом первом 'cmake.') , например,

PROJECT(test001 ASM_TMPX) #asm_tmpx denoting the <lang>_<dialect>

устанавливается в . / CMakeLists.txt

В моем случае порядок выполнения в 'cmake.' выглядит следующим образом:

  1. . / Cmake / CMakeDetermine LANG_DIALECT Compiler.cmake (работает только при начальном 'cmake.')
  2. . / cmake / Platform / CMAKE_SYSTEM_NAME .cmake (работает при каждом 'cmake.')

    Примечание: это зависит, например, от SET (CMAKE_SYSTEM_NAME "C64") , установленного в CMakeLists.txt ; Затем CMake будет искать, например, . / Cmake / Platform / C64.cmake

  3. . / Cmake / CMake LANG_DIALECT Information.cmake (работает при каждом 'cmake.')

  4. . / Cmake / CMakeTest LANG_DIALECT Compiler.cmake (работает только при начальном 'cmake.')

Так что я предполагаю CMakeDetermine LANG_DIALECT Compiler.cmake , где любое обнаружение местоположения исполняемого файла ассемблера и любое извлечение версии ассемблера, это аргументы командной строки, и т. д. и т. д., можно и нужно было бы выполнить.

...