我正在尝试"翻译"将流动的vanilla makefile行转换为CMake语法。
SRCS = $(wildcard *.foo)
OBJS = $(SRCS:.foo=.bar)
my_rule: $(OBJS)
%.bar: %.foo
make_bar_from_foo $@ $<
FILE(GLOB SRCS "*.foo")
SET(outFiles)
FOREACH(SRC ${SRCS})
SET(OUTPUT_FILE_NAME "${SRC}.bar")
ADD_CUSTOM_COMMAND(
OUTPUT "${OUTPUT_FILE_NAME}"
COMMAND make_bar_from_foo ${SRC} ${OUTPUT_FILE_NAME}
DEPENDS "${SRC}")
SET(outFiles ${outFiles} "${OUTPUT_FILE_NAME}")
ENDFOREACH(SRC)
ADD_CUSTOM_TARGET(my_rule ALL DEPENDS ${outFiles})
我知道它会为每个文件生成一个命令而不是通用的。最简单/最干净的方法吗?
答案 0 :(得分:6)
在CMake中,您始终可以声明自己的编译器语言。所以在你的情况下,你可以例如做:
cmake_minimum_required(VERSION 2.8)
project(MakeBarFromFoo NONE)
set(
CMAKE_FOO_COMPILE_OBJECT
"make_bar_from_foo <SOURCE> <OBJECT>"
)
file(GLOB SRCS "*.foo")
add_library(my_rule OBJECT ${SRCS})
set_source_files_properties(${SRCS} PROPERTIES LANGUAGE FOO)
然后,您可以像使用其他object library目标一样使用它。但是,如果.bar
({需要更多工作,请参阅下文),您只会获得enable_language(FOO)
扩展名等内容。
CMake本身提供的示例包括ASM
或RC
编译器。
enable_language(FOO)
版本这需要另外四个文件,例如您项目的CMake
文件夹:
<强> CMake的\ CMakeDetermineFOOCompiler.cmake 强>
# Find the compiler
find_program(
CMAKE_FOO_COMPILER
NAMES "make_bar_from_foo"
HINTS "${CMAKE_SOURCE_DIR}"
DOC "FOO compiler"
)
mark_as_advanced(CMAKE_FOO_COMPILER)
set(CMAKE_FOO_SOURCE_FILE_EXTENSIONS foo;FOO)
set(CMAKE_FOO_OUTPUT_EXTENSION .bar)
set(CMAKE_FOO_COMPILER_ENV_VAR "FOO")
# Configure variables set in this file for fast reload later on
configure_file(${CMAKE_CURRENT_LIST_DIR}/CMakeFOOCompiler.cmake.in
${CMAKE_PLATFORM_INFO_DIR}/CMakeFOOCompiler.cmake)
<强> CMake的\ CMakeFOOCompiler.cmake.in 强>
set(CMAKE_FOO_COMPILER "@CMAKE_FOO_COMPILER@")
set(CMAKE_FOO_COMPILER_LOADED 1)
set(CMAKE_FOO_SOURCE_FILE_EXTENSIONS @CMAKE_FOO_SOURCE_FILE_EXTENSIONS@)
set(CMAKE_FOO_OUTPUT_EXTENSION @CMAKE_FOO_OUTPUT_EXTENSION@)
set(CMAKE_FOO_COMPILER_ENV_VAR "@CMAKE_FOO_COMPILER_ENV_VAR@")
<强> CMake的\ CMakeFOOInformation.cmake 强>
# This file sets the basic flags for the FOO compiler
if(NOT CMAKE_FOO_COMPILE_OBJECT)
set(CMAKE_FOO_COMPILE_OBJECT "<CMAKE_FOO_COMPILER> <SOURCE> <OBJECT>")
endif()
set(CMAKE_FOO_INFORMATION_LOADED 1)
<强> CMake的\ CMakeTestFOOCompiler.cmake 强>
# For now just do nothing in here
set(CMAKE_FOO_COMPILER_WORKS 1 CACHE INTERNAL "")
然后您的CMakeLists.txt
文件看起来像这样:
<强>的CMakeLists.txt 强>
cmake_minimum_required(VERSION 2.8)
project(MakeBarFromFoo NONE)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMake")
enable_language(FOO)
file(GLOB SRCS "*.foo")
add_library(my_rule OBJECT ${SRCS})
答案 1 :(得分:1)
您的尝试是正确的,几乎无法显着改善。
这就是CMake的工作原理:每个“规则”都是具体的;您无法创建“模板规则”。原因是平台独立性:并非每个构建系统都支持规则的“模板”。
另一方面,CMake支持在函数/宏中创建“规则”。因此,可以轻松地减少重复部分的输入。