如何为6502 CPU(C64)设置CMake交叉装配工具链?

时间:2019-06-29 17:00:15

标签: assembly cmake cross-platform 6502 commodore

我正在尝试为称为TMPx的Commodore 64/6502交叉汇编器建立一个尽可能可重用的cmake构建系统。

我的问题是:

  • 我该如何使CMake [尝试]检测并设置tmpxTMPx.exe可执行文件以及正确的路径(取决于主机平台)在各个指定的位置?强>
    • 还有 if 甚至有可能在下面列出的./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)

this guide from the CMake wiki之后,到目前为止,我已经完成了以下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 个答案:

答案 0 :(得分:1)

在使用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”处运行)

      

    注意:例如,这取决于在 CMakeLists.txt 中设置的 SET(CMAKE_SYSTEM_NAME“ C64”);然后,CMake将查找例如 ./ cmake / Platform / C64.cmake

  3. ./ cmake / CMake LANG_DIALECT Information.cmake (在每个“ cmake”处运行)

    < / li>
  4. ./ cmake / CMakeTest LANG_DIALECT Compiler.cmake (仅在初始的'cmake上运行)

所以我猜测 CMakeDetermine LANG_DIALECT Compiler.cmake 是汇编程序可执行文件的位置的所有检测,以及汇编程序版本的任何提取,是命令行参数等,可能并且需要执行。