Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有任何软件可以自动格式化Makefile中编写的代码?_Makefile_Code Formatting - Fatal编程技术网

是否有任何软件可以自动格式化Makefile中编写的代码?

是否有任何软件可以自动格式化Makefile中编写的代码?,makefile,code-formatting,Makefile,Code Formatting,各种软件用于自动格式化用不同编程语言编写的源代码 我指的是源代码的自动格式化(而不是着色)——添加空格、制表符、换行符等 除了Makefiles之外,还有其他方法可以做到这一点吗 我试着在“bash”中用“grep”、“sed”、“awk”来完成它,我几乎完成了 作为示例,请比较格式错误的Makefile.ught: CONFIG_ZERO=y CONFIG_ONE=y CONFIG_TWO=y ifeq ($(CONFIG_ZERO),y) list_of_targets += t1 t2

各种软件用于自动格式化用不同编程语言编写的源代码

我指的是源代码的自动格式化(而不是着色)——添加空格、制表符、换行符等

除了Makefiles之外,还有其他方法可以做到这一点吗

我试着在“bash”中用“grep”、“sed”、“awk”来完成它,我几乎完成了

作为示例,请比较格式错误的Makefile.ught:

CONFIG_ZERO=y
CONFIG_ONE=y
CONFIG_TWO=y

ifeq ($(CONFIG_ZERO),y)
list_of_targets += t1 t2 t4
ifeq ($(CONFIG_TWO),y)
list_of_targets += t5 t6 t7
endif
ifeq ($(CONFIG_ONE),y)
list_of_targets += t8 t9
endif
endif

.PHONY: all
all:
                $(info Using following targets: $(list_of_targets))
格式良好的版本(Makefile.formatted):


makefiles的水平布局相对来说是不可更改的:配方代码(规则中的shell代码)的主要制表符是一个语法元素,就像Python中的一样,不能更改得更好(您可以添加更多的选项卡,但效果可能比外观更好更糟)。其他代码(如变量定义)只能通过空格字符进行前置,此类定义正文中的所有空格和制表符,有时甚至结尾处的不可见空格都有功能用途,更改它们有可能破坏其预期效果

这就为垂直布局留下了选项。考虑到makefile执行的两个阶段,您有两个自由度:1)不具有相互依赖性的变量定义和2)规则的顺序(第一个规则除外,它将作为普通
make
call w/o参数的默认目标)是任意的。这意味着您可以将规则进一步移动到makefile的后面,前提是它们使用的变量在评估makefile的过程中没有改变它们的内容——这本身并不是很容易确定的。美化者必须构建相同的内部数据结构,如
make
,以确定源代码转换是否正确,而这一切都需要对规则进行适度的重新排序


TL;DR:
make
语法很难转换(在等价条件下),即使在同一个编程团队中,也很难捍卫由此产生的美感,因此这是很少做到的。

感谢您的评论。你说得对。制作这样的格式化软件很困难,但这是可能的(在列表中,Makefile的某些部分不是规则,例如,变量、函数等的嵌套条件定义)。所以,也有同样的问题。有什么软件可以做到这一点吗?@lollol我曾经尝试过这样做,但我甚至无法在自己面前为结果辩护。由于
make
缺少任何更大的结构,因此结果与原始版本一样混乱:D.我现在只接受它,并尝试通过其他方式隔离makefile中集中维护的部分。也许您想尝试一下,它通过支持表和适当的数据库功能(如
select
Thank you for advice),为生成文件提供了一种更结构化的方法。我也试着自己去做。我几乎已经用grep/awk/sed完成了。事实上,问题是我需要支持Makefile,它有1500多行,具有多级嵌套。这就是为什么,我不会放弃:)“gmtt”看起来不错。我会记住的。
CONFIG_ZERO=y
CONFIG_ONE=y
CONFIG_TWO=y

ifeq ($(CONFIG_ZERO),y)
  list_of_targets += t1 t2 t4

  ifeq ($(CONFIG_TWO),y)
    list_of_targets += t5 t6 t7
  endif

  ifeq ($(CONFIG_ONE),y)
    list_of_targets += t8 t9
  endif
endif

.PHONY: all
all:
    $(info Using following targets: $(list_of_targets))