Thank you. It works nicely, with the basic test: $ ./make -f - .ALLOW_RECURSIVE_CHAINS: %/dir: %; # mkdir $@ target/dir/dir/file: target/dir/dir; # touch $@ target:; # mkdir $@ # mkdir target # mkdir target/dir # mkdir target/dir/dir # touch target/dir/dir/file
It does perfectly what the aim was. The original use case is rather unusual: Some of the build steps cannot be automated and instead of having text files with manual steps laying here and there I wanted to show the manual instructions to the user directly from make. Further, thought that steps like '1. ..., 2... etc.' are actually 'ordinal' targets in and each later step is dependent on the earlier one. (Also it would be easy to extend in the future, no worries about step re-numbering.) And to avoid potential name collisions (e.g. the user have to do more than once 'Next') and to accommodate sub-steps with arbitrary order ('Location' and 'Virtual machine name' in the attached example) let's use some 'growing path construct' as target naming convention. (Maybe this is an overkill but I like it and I believe it will be easier to maintain these tasks as 'makefile'. It is not aimed to be used excessively, only for some tasks which are unfortunately manual.) Thank you. I would be happy to see the new '.ALLOW_RECURSIVE_CHAINS' target in the next GNU 'make' release and / or committed to master before. --- Here is the 'makefile' for the above mentioned user case. It waits for the 'virtual_machine_name.vmx' file to be created manually, for this test it times out after 10 seconds, hence the 'Error 124': $ ./make -s -f ~/makefile2 virtual_machine_name.vmx vmware_workstation_16_player VMware Workstation 16 Player virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next/.../next/.../freebsd_version_10_and_earlier/version/other/guest_operating_system/next/.../i_will_install_the_operating_system_later./install_20_from_3a_/new_virtual_machine.../file/.../player Player virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next/.../next/.../freebsd_version_10_and_earlier/version/other/guest_operating_system/next/.../i_will_install_the_operating_system_later./install_20_from_3a_/new_virtual_machine.../file File virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next/.../next/.../freebsd_version_10_and_earlier/version/other/guest_operating_system/next/.../i_will_install_the_operating_system_later./install_20_from_3a_/new_virtual_machine... [-New Virtual Machine...-] {+New virtual machine...+} virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next/.../next/.../freebsd_version_10_and_earlier/version/other/guest_operating_system/next/.../i_will_install_the_operating_system_later./install_20_from_3a_ Install from: virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next/.../next/.../freebsd_version_10_and_earlier/version/other/guest_operating_system/next/.../i_will_install_the_operating_system_later. I will install the operating system later. virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next/.../next/.../freebsd_version_10_and_earlier/version/other/guest_operating_system/next [-Next >-] {+Next+} virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next/.../next/.../freebsd_version_10_and_earlier/version/other/guest_operating_system Guest operating system virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next/.../next/.../freebsd_version_10_and_earlier/version/other Other virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next/.../next/.../freebsd_version_10_and_earlier/version Version virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next/.../next/.../freebsd_version_10_and_earlier FreeBSD version 10 and earlier virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next/.../next [-Next >-] {+Next+} virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next/.../c_3a__5c_cygwin64_5c_home_5c_user_5c_/location_3a_ Location: virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next/.../c_3a__5c_cygwin64_5c_home_5c_user_5c_ C:\cygwin64\home\User\ virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next/.../virtual_machine_name/virtual_20_machine_20_name_3a_ Virtual machine name: virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next/.../virtual_machine_name virtual_machine_name virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next [-Next >-] {+Next+} virtual_machine_name.vmx/finish/close/customize_hardware.../next [-Next >-] {+Next+} virtual_machine_name.vmx/finish/close/customize_hardware... [-Customize Hardware...-] {+Customize hardware...+} virtual_machine_name.vmx/finish/close/.../512_mib/memory_20_for_20_this_20_virtual_20_machine_3a_/memory Memory virtual_machine_name.vmx/finish/close/.../512_mib/memory_20_for_20_this_20_virtual_20_machine_3a_ Memory for this virtual machine: virtual_machine_name.vmx/finish/close/.../512_mib [-512 MB-] {+512 MiB+} virtual_machine_name.vmx/finish/close Close virtual_machine_name.vmx/finish Finish virtual_machine_name.vmx ........make: *** [/home/User/makefile2:228: virtual_machine_name.vmx] Error 124 --- $ ./make -s -f ~/makefile virtual_machine_name.vmx > stdout; ./make -s -f ~/makefile2 virtual_machine_name.vmx > stdout2; git diff --no-index --word-diff --word-diff-regex=. stdout stdout2; git diff --no-index --word-diff --word-diff-regex=. ~/makefile ~/makefile2 make: *** [/home/User/makefile:245: virtual_machine_name.vmx] Error 124 make: *** [/home/User/makefile2:228: virtual_machine_name.vmx] Error 124 diff --git a/stdout b/stdout2 index 06132d03..98acda3c 100644 --- a/stdout +++ b/stdout2 @@ -1,20 +1,20 @@ vmware_workstation_16_player VMware Workstation 16 Player virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next[-2-]/.../next[-3-]/.../freebsd_version_10_and_earlier/version/other/guest_operating_system/next[-4-]/.../i_will_install_the_operating_system_later./install_20_from_3a_/new_virtual_machine.../file/.../player {+ +}Player virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next[-2-]/.../next[-3-]/.../freebsd_version_10_and_earlier/version/other/guest_operating_system/next[-4-]/.../i_will_install_the_operating_system_later./install_20_from_3a_/new_virtual_machine.../file {+ +}File virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next[-2-]/.../next[-3-]/.../freebsd_version_10_and_earlier/version/other/guest_operating_system/next[-4-]/.../i_will_install_the_operating_system_later./install_20_from_3a_/new_virtual_machine... {+ +}[-New Virtual Machine...-] {+New virtual machine...+} virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next[-2-]/.../next[-3-]/.../freebsd_version_10_and_earlier/version/other/guest_operating_system/next[-4-]/.../i_will_install_the_operating_system_later./install_20_from_3a_ {+ +}Install from: virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next[-2-]/.../next[-3-]/.../freebsd_version_10_and_earlier/version/other/guest_operating_system/next[-4-]/.../i_will_install_the_operating_system_later. {+ +}I will install the operating system later. virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next[-2-]/.../next[-3-]/.../freebsd_version_10_and_earlier/version/other/guest_operating_system/next[-4-]{+ +} [-Next >-] {+Next+} virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next[-2-]/.../next[-3-]/.../freebsd_version_10_and_earlier/version/other/guest_operating_system {+ +}Guest operating system virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next[-2-]/.../next[-3-]/.../freebsd_version_10_and_earlier/version/other {+ +}Other virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next[-2-]/.../next[-3-]/.../freebsd_version_10_and_earlier/version {+ +}Version virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next[-2-]/.../next[-3-]/.../freebsd_version_10_and_earlier {+ +}FreeBSD version 10 and earlier virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next[-2-]/.../next[-3-]{+ +} [-Next >-] {+Next+} virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next[-2-]/.../c_3a__5c_cygwin64_5c_home_5c_user_5c_/location_3a_ {+ +}Location: virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next[-2-]/.../c_3a__5c_cygwin64_5c_home_5c_user_5c_ {+ +}C:\cygwin64\home\User\ virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next[-2-]/.../virtual_machine_name/virtual_20_machine_20_name_3a_ {+ +}Virtual machine name: virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next[-2-]/.../virtual_machine_name {+ +}virtual_machine_name virtual_machine_name.vmx/finish/close/customize_hardware.../next/.../next[-2-]{+ +} [-Next >-] {+Next+} virtual_machine_name.vmx/finish/close/customize_hardware.../next [-Next >-] {+Next+} virtual_machine_name.vmx/finish/close/customize_hardware... [-Customize Hardware...-] {+Customize hardware...+} virtual_machine_name.vmx/finish/close/.../512_mib/memory_20_for_20_this_20_virtual_20_machine_3a_/memory Memory diff --git a/home/User/makefile b/home/User/makefile2 index 865b8470..dff93180 100755 --- a/home/User/makefile +++ b/home/User/makefile2 @@ -1,3 +1,4 @@ {+.ALLOW_RECURSIVE_CHAINS:+} .SECONDARY: %/.../512_mib/memory_20_for_20_this_20_virtual_20_machine_3a_/memory/...: \ @@ -12,7 +13,7 @@ printf '%.300s\t%s\n' $@ "$$(cat names/512_mib)" | expand -t 1,301 %/c_3a__5c_cygwin64_5c_home_5c_user_5c_/location_3a_: \ %/next[-3-] \ names/location_3a_ \ printf '%.300s\t%s\n' $@ "$$(cat names/location_3a_)" | expand -t 1,301 @@ -29,19 +30,19 @@ printf '%.300s\t%s\n' $@ "$$(cat names/close)" | expand -t 1,301 %/customize_hardware.../next/.../next[-2-]/...: \ %/customize_hardware.../next/.../next[-2-]/.../c_3a__5c_cygwin64_5c_home_5c_user_5c_ \ %/customize_hardware.../next/.../next[-2-]/.../virtual_machine_name \ : %/customize_hardware.../next/.../next[-2-]/.../next[-3-]/...: \ %/customize_hardware.../next/.../next[-2-]/.../next[-3-]/.../freebsd_version_10_and_earlier \ : %/customize_hardware.../next/...: \ %/customize_hardware.../next/.../next[-2-] \ : @@ -69,13 +70,13 @@ printf '%.300s\t%s\n' $@ "$$(cat names/freebsd_version_10_and_earlier)" | expand -t 1,301 %/guest_operating_system/next[-4-]/...: \ %/guest_operating_system/next[-4-]/.../i_will_install_the_operating_system_later. \ : %/guest_operating_system: \ %/guest_operating_system/next[-4-] \ names/guest_operating_system \ printf '%.300s\t%s\n' $@ "$$(cat names/guest_operating_system)" | expand -t 1,301 @@ -115,24 +116,6 @@ printf '%.300s\t%s\n' $@ "$$(cat names/new_virtual_machine...)" | expand -t 1,301 [-%/next2: \-] [- %/next2/... \-] [- names/next \-] [- printf '%.300s\t%s\n' $@ "$$(cat names/next)" | expand -t 1,301-] [-%/next3: \-] [- %/next3/... \-] [- names/next \-] [- printf '%.300s\t%s\n' $@ "$$(cat names/next)" | expand -t 1,301-] [-%/next4: \-] [- %/next4/... \-] [- names/next \-] [- printf '%.300s\t%s\n' $@ "$$(cat names/next)" | expand -t 1,301-] %/next: \ %/next/... \ names/next \ @@ -158,7 +141,7 @@ printf '%.300s\t%s\n' $@ "$$(cat names/version)" | expand -t 1,301 %/virtual_machine_name/virtual_20_machine_20_name_3a_: \ %/next[-3-] \ names/virtual_20_machine_20_name_3a_ \ printf '%.300s\t%s\n' $@ "$$(cat names/virtual_20_machine_20_name_3a_)" | expand -t 1,301 --- $ base64 ~/makefile LlNFQ09OREFSWToKCiUvLi4uLzUxMl9taWIvbWVtb3J5XzIwX2Zvcl8yMF90aGlzXzIwX3ZpcnR1 YWxfMjBfbWFjaGluZV8zYV8vbWVtb3J5Ly4uLjogXAoJJS9jdXN0b21pemVfaGFyZHdhcmUuLi4g XAoKCToKCiUvNTEyX21pYjogXAoJJS81MTJfbWliL21lbW9yeV8yMF9mb3JfMjBfdGhpc18yMF92 aXJ0dWFsXzIwX21hY2hpbmVfM2FfIFwKCW5hbWVzLzUxMl9taWIgXAoKCXByaW50ZiAnJS4zMDBz XHQlc1xuJyAkQCAiJCQoY2F0IG5hbWVzLzUxMl9taWIpIiB8IGV4cGFuZCAtdCAxLDMwMQoKJS9j XzNhX181Y19jeWd3aW42NF81Y19ob21lXzVjX3VzZXJfNWNfL2xvY2F0aW9uXzNhXzogXAoJJS9u ZXh0MyBcCgluYW1lcy9sb2NhdGlvbl8zYV8gXAoKCXByaW50ZiAnJS4zMDBzXHQlc1xuJyAkQCAi JCQoY2F0IG5hbWVzL2xvY2F0aW9uXzNhXykiIHwgZXhwYW5kIC10IDEsMzAxCgolL2NfM2FfXzVj X2N5Z3dpbjY0XzVjX2hvbWVfNWNfdXNlcl81Y186IFwKCSUvY18zYV9fNWNfY3lnd2luNjRfNWNf aG9tZV81Y191c2VyXzVjXy9sb2NhdGlvbl8zYV8gXAoJbmFtZXMvY18zYV9fNWNfY3lnd2luNjRf NWNfaG9tZV81Y191c2VyXzVjXyBcCgoJcHJpbnRmICclLjMwMHNcdCVzXG4nICRAICIkJChjYXQg bmFtZXMvY18zYV9fNWNfY3lnd2luNjRfNWNfaG9tZV81Y191c2VyXzVjXykiIHwgZXhwYW5kIC10 IDEsMzAxCgolL2Nsb3NlOiBcCgklL2Nsb3NlLy4uLiBcCgluYW1lcy9jbG9zZSBcCgoJcHJpbnRm ICclLjMwMHNcdCVzXG4nICRAICIkJChjYXQgbmFtZXMvY2xvc2UpIiB8IGV4cGFuZCAtdCAxLDMw MQoKJS9jdXN0b21pemVfaGFyZHdhcmUuLi4vbmV4dC8uLi4vbmV4dDIvLi4uOiBcCgklL2N1c3Rv bWl6ZV9oYXJkd2FyZS4uLi9uZXh0Ly4uLi9uZXh0Mi8uLi4vY18zYV9fNWNfY3lnd2luNjRfNWNf aG9tZV81Y191c2VyXzVjXyBcCgklL2N1c3RvbWl6ZV9oYXJkd2FyZS4uLi9uZXh0Ly4uLi9uZXh0 Mi8uLi4vdmlydHVhbF9tYWNoaW5lX25hbWUgXAoKCToKCiUvY3VzdG9taXplX2hhcmR3YXJlLi4u L25leHQvLi4uL25leHQyLy4uLi9uZXh0My8uLi46IFwKCSUvY3VzdG9taXplX2hhcmR3YXJlLi4u L25leHQvLi4uL25leHQyLy4uLi9uZXh0My8uLi4vZnJlZWJzZF92ZXJzaW9uXzEwX2FuZF9lYXJs aWVyIFwKCgk6CgolL2N1c3RvbWl6ZV9oYXJkd2FyZS4uLi9uZXh0Ly4uLjogXAoJJS9jdXN0b21p emVfaGFyZHdhcmUuLi4vbmV4dC8uLi4vbmV4dDIgXAoKCToKCiUvY3VzdG9taXplX2hhcmR3YXJl Li4uOiBcCgklL2N1c3RvbWl6ZV9oYXJkd2FyZS4uLi9uZXh0IFwKCW5hbWVzL2N1c3RvbWl6ZV9o YXJkd2FyZS4uLiBcCgoJcHJpbnRmICclLjMwMHNcdCVzXG4nICRAICIkJChjYXQgbmFtZXMvY3Vz dG9taXplX2hhcmR3YXJlLi4uKSIgfCBleHBhbmQgLXQgMSwzMDEKCiUvZmlsZTogXAoJJS9maWxl Ly4uLiBcCgluYW1lcy9maWxlIFwKCglwcmludGYgJyUuMzAwc1x0JXNcbicgJEAgIiQkKGNhdCBu YW1lcy9maWxlKSIgfCBleHBhbmQgLXQgMSwzMDEKCiUvZmluaXNoOiBcCgklL2ZpbmlzaC9jbG9z ZSBcCgluYW1lcy9maW5pc2ggXAoKCXByaW50ZiAnJS4zMDBzXHQlc1xuJyAkQCAiJCQoY2F0IG5h bWVzL2ZpbmlzaCkiIHwgZXhwYW5kIC10IDEsMzAxCgolL2ZyZWVic2RfdmVyc2lvbl8xMF9hbmRf ZWFybGllcjogXAoJJS9mcmVlYnNkX3ZlcnNpb25fMTBfYW5kX2VhcmxpZXIvdmVyc2lvbiBcCglu YW1lcy9mcmVlYnNkX3ZlcnNpb25fMTBfYW5kX2VhcmxpZXIgXAoKCXByaW50ZiAnJS4zMDBzXHQl c1xuJyAkQCAiJCQoY2F0IG5hbWVzL2ZyZWVic2RfdmVyc2lvbl8xMF9hbmRfZWFybGllcikiIHwg ZXhwYW5kIC10IDEsMzAxCgolL2d1ZXN0X29wZXJhdGluZ19zeXN0ZW0vbmV4dDQvLi4uOiBcCgkl L2d1ZXN0X29wZXJhdGluZ19zeXN0ZW0vbmV4dDQvLi4uL2lfd2lsbF9pbnN0YWxsX3RoZV9vcGVy YXRpbmdfc3lzdGVtX2xhdGVyLiBcCgoJOgoKJS9ndWVzdF9vcGVyYXRpbmdfc3lzdGVtOiBcCgkl L2d1ZXN0X29wZXJhdGluZ19zeXN0ZW0vbmV4dDQgXAoJbmFtZXMvZ3Vlc3Rfb3BlcmF0aW5nX3N5 c3RlbSBcCgoJcHJpbnRmICclLjMwMHNcdCVzXG4nICRAICIkJChjYXQgbmFtZXMvZ3Vlc3Rfb3Bl cmF0aW5nX3N5c3RlbSkiIHwgZXhwYW5kIC10IDEsMzAxCgolL2lfd2lsbF9pbnN0YWxsX3RoZV9v cGVyYXRpbmdfc3lzdGVtX2xhdGVyLjogXAoJJS9pX3dpbGxfaW5zdGFsbF90aGVfb3BlcmF0aW5n X3N5c3RlbV9sYXRlci4vaW5zdGFsbF8yMF9mcm9tXzNhXyBcCgluYW1lcy9pX3dpbGxfaW5zdGFs bF90aGVfb3BlcmF0aW5nX3N5c3RlbV9sYXRlci4gXAoKCXByaW50ZiAnJS4zMDBzXHQlc1xuJyAk QCAiJCQoY2F0IG5hbWVzL2lfd2lsbF9pbnN0YWxsX3RoZV9vcGVyYXRpbmdfc3lzdGVtX2xhdGVy LikiIHwgZXhwYW5kIC10IDEsMzAxCgolL2luc3RhbGxfMjBfZnJvbV8zYV86IFwKCSUvaW5zdGFs bF8yMF9mcm9tXzNhXy9uZXdfdmlydHVhbF9tYWNoaW5lLi4uIFwKCW5hbWVzL2luc3RhbGxfMjBf ZnJvbV8zYV8gXAoKCXByaW50ZiAnJS4zMDBzXHQlc1xuJyAkQCAiJCQoY2F0IG5hbWVzL2luc3Rh bGxfMjBfZnJvbV8zYV8pIiB8IGV4cGFuZCAtdCAxLDMwMQoKJS9tZW1vcnk6IFwKCSUvbWVtb3J5 Ly4uLiBcCgluYW1lcy9tZW1vcnkgXAoKCXByaW50ZiAnJS4zMDBzXHQlc1xuJyAkQCAiJCQoY2F0 IG5hbWVzL21lbW9yeSkiIHwgZXhwYW5kIC10IDEsMzAxCgolL21lbW9yeV8yMF9mb3JfMjBfdGhp c18yMF92aXJ0dWFsXzIwX21hY2hpbmVfM2FfOiBcCgklL21lbW9yeV8yMF9mb3JfMjBfdGhpc18y MF92aXJ0dWFsXzIwX21hY2hpbmVfM2FfL21lbW9yeSBcCgluYW1lcy9tZW1vcnlfMjBfZm9yXzIw X3RoaXNfMjBfdmlydHVhbF8yMF9tYWNoaW5lXzNhXyBcCgoJcHJpbnRmICclLjMwMHNcdCVzXG4n ICRAICIkJChjYXQgbmFtZXMvbWVtb3J5XzIwX2Zvcl8yMF90aGlzXzIwX3ZpcnR1YWxfMjBfbWFj aGluZV8zYV8pIiB8IGV4cGFuZCAtdCAxLDMwMQoKJS9uZXdfdmlydHVhbF9tYWNoaW5lLi4uL2Zp bGUvLi4uOiBcCgklL25ld192aXJ0dWFsX21hY2hpbmUuLi4vZmlsZS8uLi4vcGxheWVyIFwKCgk6 CgolL25ld192aXJ0dWFsX21hY2hpbmUuLi46IFwKCSUvbmV3X3ZpcnR1YWxfbWFjaGluZS4uLi9m aWxlIFwKCW5hbWVzL25ld192aXJ0dWFsX21hY2hpbmUuLi4gXAoKCXByaW50ZiAnJS4zMDBzXHQl c1xuJyAkQCAiJCQoY2F0IG5hbWVzL25ld192aXJ0dWFsX21hY2hpbmUuLi4pIiB8IGV4cGFuZCAt dCAxLDMwMQoKJS9uZXh0MjogXAoJJS9uZXh0Mi8uLi4gXAoJbmFtZXMvbmV4dCBcCgoJcHJpbnRm ICclLjMwMHNcdCVzXG4nICRAICIkJChjYXQgbmFtZXMvbmV4dCkiIHwgZXhwYW5kIC10IDEsMzAx CgolL25leHQzOiBcCgklL25leHQzLy4uLiBcCgluYW1lcy9uZXh0IFwKCglwcmludGYgJyUuMzAw c1x0JXNcbicgJEAgIiQkKGNhdCBuYW1lcy9uZXh0KSIgfCBleHBhbmQgLXQgMSwzMDEKCiUvbmV4 dDQ6IFwKCSUvbmV4dDQvLi4uIFwKCW5hbWVzL25leHQgXAoKCXByaW50ZiAnJS4zMDBzXHQlc1xu JyAkQCAiJCQoY2F0IG5hbWVzL25leHQpIiB8IGV4cGFuZCAtdCAxLDMwMQoKJS9uZXh0OiBcCgkl L25leHQvLi4uIFwKCW5hbWVzL25leHQgXAoKCXByaW50ZiAnJS4zMDBzXHQlc1xuJyAkQCAiJCQo Y2F0IG5hbWVzL25leHQpIiB8IGV4cGFuZCAtdCAxLDMwMQoKJS9vdGhlcjogXAoJJS9vdGhlci9n dWVzdF9vcGVyYXRpbmdfc3lzdGVtIFwKCW5hbWVzL290aGVyIFwKCglwcmludGYgJyUuMzAwc1x0 JXNcbicgJEAgIiQkKGNhdCBuYW1lcy9vdGhlcikiIHwgZXhwYW5kIC10IDEsMzAxCgolL3BsYXll cjogXAoJbmFtZXMvcGxheWVyIFwKCXZtd2FyZV93b3Jrc3RhdGlvbl8xNl9wbGF5ZXIgXAoKCXBy aW50ZiAnJS4zMDBzXHQlc1xuJyAkQCAiJCQoY2F0IG5hbWVzL3BsYXllcikiIHwgZXhwYW5kIC10 IDEsMzAxCgolL3ZlcnNpb246IFwKCSUvdmVyc2lvbi9vdGhlciBcCgluYW1lcy92ZXJzaW9uIFwK CglwcmludGYgJyUuMzAwc1x0JXNcbicgJEAgIiQkKGNhdCBuYW1lcy92ZXJzaW9uKSIgfCBleHBh bmQgLXQgMSwzMDEKCiUvdmlydHVhbF9tYWNoaW5lX25hbWUvdmlydHVhbF8yMF9tYWNoaW5lXzIw X25hbWVfM2FfOiBcCgklL25leHQzIFwKCW5hbWVzL3ZpcnR1YWxfMjBfbWFjaGluZV8yMF9uYW1l XzNhXyBcCgoJcHJpbnRmICclLjMwMHNcdCVzXG4nICRAICIkJChjYXQgbmFtZXMvdmlydHVhbF8y MF9tYWNoaW5lXzIwX25hbWVfM2FfKSIgfCBleHBhbmQgLXQgMSwzMDEKCiUvdmlydHVhbF9tYWNo aW5lX25hbWU6IFwKCSUvdmlydHVhbF9tYWNoaW5lX25hbWUvdmlydHVhbF8yMF9tYWNoaW5lXzIw X25hbWVfM2FfIFwKCW5hbWVzL3ZpcnR1YWxfbWFjaGluZV9uYW1lIFwKCglwcmludGYgJyUuMzAw c1x0JXNcbicgJEAgIiQkKGNhdCBuYW1lcy92aXJ0dWFsX21hY2hpbmVfbmFtZSkiIHwgZXhwYW5k IC10IDEsMzAxCgpuYW1lcy81MTJfbWliOiB8IG5hbWVzCglwcmludGYgJXMgJ1stNTEyIE1CLV0g eys1MTIgTWlCK30nID4gJEAKCm5hbWVzL2NfM2FfXzVjX2N5Z3dpbjY0XzVjX2hvbWVfNWNfdXNl cl81Y186IHwgbmFtZXMKCXByaW50ZiAlcyAnQzpcY3lnd2luNjRcaG9tZVxVc2VyXCcgPiAkQAoK bmFtZXMvY2xvc2U6IHwgbmFtZXMKCXByaW50ZiAlcyBDbG9zZSA+ICRACgpuYW1lcy9jdXN0b21p emVfaGFyZHdhcmUuLi46IHwgbmFtZXMKCXByaW50ZiAlcyAnWy1DdXN0b21pemUgSGFyZHdhcmUu Li4tXSB7K0N1c3RvbWl6ZSBoYXJkd2FyZS4uLit9JyA+ICRACgpuYW1lcy9maWxlOiB8IG5hbWVz CglwcmludGYgJXMgRmlsZSA+ICRACgpuYW1lcy9maW5pc2g6IHwgbmFtZXMKCXByaW50ZiAlcyBG aW5pc2ggPiAkQAoKbmFtZXMvZnJlZWJzZF92ZXJzaW9uXzEwX2FuZF9lYXJsaWVyOiB8IG5hbWVz CglwcmludGYgJXMgJ0ZyZWVCU0QgdmVyc2lvbiAxMCBhbmQgZWFybGllcicgPiAkQAoKbmFtZXMv Z3Vlc3Rfb3BlcmF0aW5nX3N5c3RlbTogfCBuYW1lcwoJcHJpbnRmICVzICdHdWVzdCBvcGVyYXRp bmcgc3lzdGVtJyA+ICRACgpuYW1lcy9pX3dpbGxfaW5zdGFsbF90aGVfb3BlcmF0aW5nX3N5c3Rl bV9sYXRlci46IHwgbmFtZXMKCXByaW50ZiAlcyAnSSB3aWxsIGluc3RhbGwgdGhlIG9wZXJhdGlu ZyBzeXN0ZW0gbGF0ZXIuJyA+ICRACgpuYW1lcy9pbnN0YWxsXzIwX2Zyb21fM2FfOiB8IG5hbWVz CglwcmludGYgJXMgJ0luc3RhbGwgZnJvbTonID4gJEAKCm5hbWVzL2xvY2F0aW9uXzNhXzogfCBu YW1lcwoJcHJpbnRmICVzIExvY2F0aW9uOiA+ICRACgpuYW1lcy9tZW1vcnk6IHwgbmFtZXMKCXBy aW50ZiAlcyBNZW1vcnkgPiAkQAoKbmFtZXMvbWVtb3J5XzIwX2Zvcl8yMF90aGlzXzIwX3ZpcnR1 YWxfMjBfbWFjaGluZV8zYV86IHwgbmFtZXMKCXByaW50ZiAlcyAnTWVtb3J5IGZvciB0aGlzIHZp cnR1YWwgbWFjaGluZTonID4gJEAKCm5hbWVzL25leHQ6IHwgbmFtZXMKCXByaW50ZiAlcyAnWy1O ZXh0ID4tXSB7K05leHQrfScgPiAkQAoKbmFtZXMvbmV3X3ZpcnR1YWxfbWFjaGluZS4uLjogfCBu YW1lcwoJcHJpbnRmICVzICdbLU5ldyBWaXJ0dWFsIE1hY2hpbmUuLi4tXSB7K05ldyB2aXJ0dWFs IG1hY2hpbmUuLi4rfScgPiAkQAoKbmFtZXMvb3RoZXI6IHwgbmFtZXMKCXByaW50ZiAlcyBPdGhl ciA+ICRACgpuYW1lcy9wbGF5ZXI6IHwgbmFtZXMKCXByaW50ZiAlcyBQbGF5ZXIgPiAkQAoKbmFt ZXMvdmVyc2lvbjogfCBuYW1lcwoJcHJpbnRmICVzIFZlcnNpb24gPiAkQAoKbmFtZXMvdmlydHVh bF8yMF9tYWNoaW5lXzIwX25hbWVfM2FfOiB8IG5hbWVzCglwcmludGYgJXMgJ1ZpcnR1YWwgbWFj aGluZSBuYW1lOicgPiAkQAoKbmFtZXMvdmlydHVhbF9tYWNoaW5lX25hbWU6IHwgbmFtZXMKCXBy aW50ZiAlcyB2aXJ0dWFsX21hY2hpbmVfbmFtZSA+ICRACgpuYW1lcy92bXdhcmVfd29ya3N0YXRp b25fMTZfcGxheWVyOiB8IG5hbWVzCglwcmludGYgJXMgJ1ZNd2FyZSBXb3Jrc3RhdGlvbiAxNiBQ bGF5ZXInID4gJEAKCm5hbWVzOgoJbWtkaXIgJEAKCnZpcnR1YWxfbWFjaGluZV9uYW1lLnZteC9m aW5pc2gvY2xvc2UvLi4uOiBcCgl2aXJ0dWFsX21hY2hpbmVfbmFtZS52bXgvZmluaXNoL2Nsb3Nl Ly4uLi81MTJfbWliCgp2aXJ0dWFsX21hY2hpbmVfbmFtZS52bXg6IFwKCXZpcnR1YWxfbWFjaGlu ZV9uYW1lLnZteC9maW5pc2ggXAoKCWVjaG8gJEAKCXRpbWVvdXQgMTAgc2ggLWMgJ3RvdWNoIC1j ICRAOyB2YXI9JCQobWt0ZW1wKTsgd2hpbGUgdGVzdCAkJHZhciAtbnQgJEA7IGRvIHNsZWVwIDE7 IHByaW50ZiAuOyBkb25lOyBybSAkJHZhcjsgcHJpbnRmICdcJydcbidcJycnCgp2bXdhcmVfd29y a3N0YXRpb25fMTZfcGxheWVyOiBcCgluYW1lcy92bXdhcmVfd29ya3N0YXRpb25fMTZfcGxheWVy IFwKCglwcmludGYgJyUuMzAwc1x0JXNcbicgJEAgIiQkKGNhdCBuYW1lcy92bXdhcmVfd29ya3N0 YXRpb25fMTZfcGxheWVyKSIgfCBleHBhbmQgLXQgMSwzMDEK --- $ base64 ~/makefile2 LkFMTE9XX1JFQ1VSU0lWRV9DSEFJTlM6Ci5TRUNPTkRBUlk6CgolLy4uLi81MTJfbWliL21lbW9y eV8yMF9mb3JfMjBfdGhpc18yMF92aXJ0dWFsXzIwX21hY2hpbmVfM2FfL21lbW9yeS8uLi46IFwK CSUvY3VzdG9taXplX2hhcmR3YXJlLi4uIFwKCgk6CgolLzUxMl9taWI6IFwKCSUvNTEyX21pYi9t ZW1vcnlfMjBfZm9yXzIwX3RoaXNfMjBfdmlydHVhbF8yMF9tYWNoaW5lXzNhXyBcCgluYW1lcy81 MTJfbWliIFwKCglwcmludGYgJyUuMzAwc1x0JXNcbicgJEAgIiQkKGNhdCBuYW1lcy81MTJfbWli KSIgfCBleHBhbmQgLXQgMSwzMDEKCiUvY18zYV9fNWNfY3lnd2luNjRfNWNfaG9tZV81Y191c2Vy XzVjXy9sb2NhdGlvbl8zYV86IFwKCSUvbmV4dCBcCgluYW1lcy9sb2NhdGlvbl8zYV8gXAoKCXBy aW50ZiAnJS4zMDBzXHQlc1xuJyAkQCAiJCQoY2F0IG5hbWVzL2xvY2F0aW9uXzNhXykiIHwgZXhw YW5kIC10IDEsMzAxCgolL2NfM2FfXzVjX2N5Z3dpbjY0XzVjX2hvbWVfNWNfdXNlcl81Y186IFwK CSUvY18zYV9fNWNfY3lnd2luNjRfNWNfaG9tZV81Y191c2VyXzVjXy9sb2NhdGlvbl8zYV8gXAoJ bmFtZXMvY18zYV9fNWNfY3lnd2luNjRfNWNfaG9tZV81Y191c2VyXzVjXyBcCgoJcHJpbnRmICcl LjMwMHNcdCVzXG4nICRAICIkJChjYXQgbmFtZXMvY18zYV9fNWNfY3lnd2luNjRfNWNfaG9tZV81 Y191c2VyXzVjXykiIHwgZXhwYW5kIC10IDEsMzAxCgolL2Nsb3NlOiBcCgklL2Nsb3NlLy4uLiBc CgluYW1lcy9jbG9zZSBcCgoJcHJpbnRmICclLjMwMHNcdCVzXG4nICRAICIkJChjYXQgbmFtZXMv Y2xvc2UpIiB8IGV4cGFuZCAtdCAxLDMwMQoKJS9jdXN0b21pemVfaGFyZHdhcmUuLi4vbmV4dC8u Li4vbmV4dC8uLi46IFwKCSUvY3VzdG9taXplX2hhcmR3YXJlLi4uL25leHQvLi4uL25leHQvLi4u L2NfM2FfXzVjX2N5Z3dpbjY0XzVjX2hvbWVfNWNfdXNlcl81Y18gXAoJJS9jdXN0b21pemVfaGFy ZHdhcmUuLi4vbmV4dC8uLi4vbmV4dC8uLi4vdmlydHVhbF9tYWNoaW5lX25hbWUgXAoKCToKCiUv Y3VzdG9taXplX2hhcmR3YXJlLi4uL25leHQvLi4uL25leHQvLi4uL25leHQvLi4uOiBcCgklL2N1 c3RvbWl6ZV9oYXJkd2FyZS4uLi9uZXh0Ly4uLi9uZXh0Ly4uLi9uZXh0Ly4uLi9mcmVlYnNkX3Zl cnNpb25fMTBfYW5kX2VhcmxpZXIgXAoKCToKCiUvY3VzdG9taXplX2hhcmR3YXJlLi4uL25leHQv Li4uOiBcCgklL2N1c3RvbWl6ZV9oYXJkd2FyZS4uLi9uZXh0Ly4uLi9uZXh0IFwKCgk6CgolL2N1 c3RvbWl6ZV9oYXJkd2FyZS4uLjogXAoJJS9jdXN0b21pemVfaGFyZHdhcmUuLi4vbmV4dCBcCglu YW1lcy9jdXN0b21pemVfaGFyZHdhcmUuLi4gXAoKCXByaW50ZiAnJS4zMDBzXHQlc1xuJyAkQCAi JCQoY2F0IG5hbWVzL2N1c3RvbWl6ZV9oYXJkd2FyZS4uLikiIHwgZXhwYW5kIC10IDEsMzAxCgol L2ZpbGU6IFwKCSUvZmlsZS8uLi4gXAoJbmFtZXMvZmlsZSBcCgoJcHJpbnRmICclLjMwMHNcdCVz XG4nICRAICIkJChjYXQgbmFtZXMvZmlsZSkiIHwgZXhwYW5kIC10IDEsMzAxCgolL2ZpbmlzaDog XAoJJS9maW5pc2gvY2xvc2UgXAoJbmFtZXMvZmluaXNoIFwKCglwcmludGYgJyUuMzAwc1x0JXNc bicgJEAgIiQkKGNhdCBuYW1lcy9maW5pc2gpIiB8IGV4cGFuZCAtdCAxLDMwMQoKJS9mcmVlYnNk X3ZlcnNpb25fMTBfYW5kX2VhcmxpZXI6IFwKCSUvZnJlZWJzZF92ZXJzaW9uXzEwX2FuZF9lYXJs aWVyL3ZlcnNpb24gXAoJbmFtZXMvZnJlZWJzZF92ZXJzaW9uXzEwX2FuZF9lYXJsaWVyIFwKCglw cmludGYgJyUuMzAwc1x0JXNcbicgJEAgIiQkKGNhdCBuYW1lcy9mcmVlYnNkX3ZlcnNpb25fMTBf YW5kX2VhcmxpZXIpIiB8IGV4cGFuZCAtdCAxLDMwMQoKJS9ndWVzdF9vcGVyYXRpbmdfc3lzdGVt L25leHQvLi4uOiBcCgklL2d1ZXN0X29wZXJhdGluZ19zeXN0ZW0vbmV4dC8uLi4vaV93aWxsX2lu c3RhbGxfdGhlX29wZXJhdGluZ19zeXN0ZW1fbGF0ZXIuIFwKCgk6CgolL2d1ZXN0X29wZXJhdGlu Z19zeXN0ZW06IFwKCSUvZ3Vlc3Rfb3BlcmF0aW5nX3N5c3RlbS9uZXh0IFwKCW5hbWVzL2d1ZXN0 X29wZXJhdGluZ19zeXN0ZW0gXAoKCXByaW50ZiAnJS4zMDBzXHQlc1xuJyAkQCAiJCQoY2F0IG5h bWVzL2d1ZXN0X29wZXJhdGluZ19zeXN0ZW0pIiB8IGV4cGFuZCAtdCAxLDMwMQoKJS9pX3dpbGxf aW5zdGFsbF90aGVfb3BlcmF0aW5nX3N5c3RlbV9sYXRlci46IFwKCSUvaV93aWxsX2luc3RhbGxf dGhlX29wZXJhdGluZ19zeXN0ZW1fbGF0ZXIuL2luc3RhbGxfMjBfZnJvbV8zYV8gXAoJbmFtZXMv aV93aWxsX2luc3RhbGxfdGhlX29wZXJhdGluZ19zeXN0ZW1fbGF0ZXIuIFwKCglwcmludGYgJyUu MzAwc1x0JXNcbicgJEAgIiQkKGNhdCBuYW1lcy9pX3dpbGxfaW5zdGFsbF90aGVfb3BlcmF0aW5n X3N5c3RlbV9sYXRlci4pIiB8IGV4cGFuZCAtdCAxLDMwMQoKJS9pbnN0YWxsXzIwX2Zyb21fM2Ff OiBcCgklL2luc3RhbGxfMjBfZnJvbV8zYV8vbmV3X3ZpcnR1YWxfbWFjaGluZS4uLiBcCgluYW1l cy9pbnN0YWxsXzIwX2Zyb21fM2FfIFwKCglwcmludGYgJyUuMzAwc1x0JXNcbicgJEAgIiQkKGNh dCBuYW1lcy9pbnN0YWxsXzIwX2Zyb21fM2FfKSIgfCBleHBhbmQgLXQgMSwzMDEKCiUvbWVtb3J5 OiBcCgklL21lbW9yeS8uLi4gXAoJbmFtZXMvbWVtb3J5IFwKCglwcmludGYgJyUuMzAwc1x0JXNc bicgJEAgIiQkKGNhdCBuYW1lcy9tZW1vcnkpIiB8IGV4cGFuZCAtdCAxLDMwMQoKJS9tZW1vcnlf MjBfZm9yXzIwX3RoaXNfMjBfdmlydHVhbF8yMF9tYWNoaW5lXzNhXzogXAoJJS9tZW1vcnlfMjBf Zm9yXzIwX3RoaXNfMjBfdmlydHVhbF8yMF9tYWNoaW5lXzNhXy9tZW1vcnkgXAoJbmFtZXMvbWVt b3J5XzIwX2Zvcl8yMF90aGlzXzIwX3ZpcnR1YWxfMjBfbWFjaGluZV8zYV8gXAoKCXByaW50ZiAn JS4zMDBzXHQlc1xuJyAkQCAiJCQoY2F0IG5hbWVzL21lbW9yeV8yMF9mb3JfMjBfdGhpc18yMF92 aXJ0dWFsXzIwX21hY2hpbmVfM2FfKSIgfCBleHBhbmQgLXQgMSwzMDEKCiUvbmV3X3ZpcnR1YWxf bWFjaGluZS4uLi9maWxlLy4uLjogXAoJJS9uZXdfdmlydHVhbF9tYWNoaW5lLi4uL2ZpbGUvLi4u L3BsYXllciBcCgoJOgoKJS9uZXdfdmlydHVhbF9tYWNoaW5lLi4uOiBcCgklL25ld192aXJ0dWFs X21hY2hpbmUuLi4vZmlsZSBcCgluYW1lcy9uZXdfdmlydHVhbF9tYWNoaW5lLi4uIFwKCglwcmlu dGYgJyUuMzAwc1x0JXNcbicgJEAgIiQkKGNhdCBuYW1lcy9uZXdfdmlydHVhbF9tYWNoaW5lLi4u KSIgfCBleHBhbmQgLXQgMSwzMDEKCiUvbmV4dDogXAoJJS9uZXh0Ly4uLiBcCgluYW1lcy9uZXh0 IFwKCglwcmludGYgJyUuMzAwc1x0JXNcbicgJEAgIiQkKGNhdCBuYW1lcy9uZXh0KSIgfCBleHBh bmQgLXQgMSwzMDEKCiUvb3RoZXI6IFwKCSUvb3RoZXIvZ3Vlc3Rfb3BlcmF0aW5nX3N5c3RlbSBc CgluYW1lcy9vdGhlciBcCgoJcHJpbnRmICclLjMwMHNcdCVzXG4nICRAICIkJChjYXQgbmFtZXMv b3RoZXIpIiB8IGV4cGFuZCAtdCAxLDMwMQoKJS9wbGF5ZXI6IFwKCW5hbWVzL3BsYXllciBcCgl2 bXdhcmVfd29ya3N0YXRpb25fMTZfcGxheWVyIFwKCglwcmludGYgJyUuMzAwc1x0JXNcbicgJEAg IiQkKGNhdCBuYW1lcy9wbGF5ZXIpIiB8IGV4cGFuZCAtdCAxLDMwMQoKJS92ZXJzaW9uOiBcCgkl L3ZlcnNpb24vb3RoZXIgXAoJbmFtZXMvdmVyc2lvbiBcCgoJcHJpbnRmICclLjMwMHNcdCVzXG4n ICRAICIkJChjYXQgbmFtZXMvdmVyc2lvbikiIHwgZXhwYW5kIC10IDEsMzAxCgolL3ZpcnR1YWxf bWFjaGluZV9uYW1lL3ZpcnR1YWxfMjBfbWFjaGluZV8yMF9uYW1lXzNhXzogXAoJJS9uZXh0IFwK CW5hbWVzL3ZpcnR1YWxfMjBfbWFjaGluZV8yMF9uYW1lXzNhXyBcCgoJcHJpbnRmICclLjMwMHNc dCVzXG4nICRAICIkJChjYXQgbmFtZXMvdmlydHVhbF8yMF9tYWNoaW5lXzIwX25hbWVfM2FfKSIg fCBleHBhbmQgLXQgMSwzMDEKCiUvdmlydHVhbF9tYWNoaW5lX25hbWU6IFwKCSUvdmlydHVhbF9t YWNoaW5lX25hbWUvdmlydHVhbF8yMF9tYWNoaW5lXzIwX25hbWVfM2FfIFwKCW5hbWVzL3ZpcnR1 YWxfbWFjaGluZV9uYW1lIFwKCglwcmludGYgJyUuMzAwc1x0JXNcbicgJEAgIiQkKGNhdCBuYW1l cy92aXJ0dWFsX21hY2hpbmVfbmFtZSkiIHwgZXhwYW5kIC10IDEsMzAxCgpuYW1lcy81MTJfbWli OiB8IG5hbWVzCglwcmludGYgJXMgJ1stNTEyIE1CLV0geys1MTIgTWlCK30nID4gJEAKCm5hbWVz L2NfM2FfXzVjX2N5Z3dpbjY0XzVjX2hvbWVfNWNfdXNlcl81Y186IHwgbmFtZXMKCXByaW50ZiAl cyAnQzpcY3lnd2luNjRcaG9tZVxVc2VyXCcgPiAkQAoKbmFtZXMvY2xvc2U6IHwgbmFtZXMKCXBy aW50ZiAlcyBDbG9zZSA+ICRACgpuYW1lcy9jdXN0b21pemVfaGFyZHdhcmUuLi46IHwgbmFtZXMK CXByaW50ZiAlcyAnWy1DdXN0b21pemUgSGFyZHdhcmUuLi4tXSB7K0N1c3RvbWl6ZSBoYXJkd2Fy ZS4uLit9JyA+ICRACgpuYW1lcy9maWxlOiB8IG5hbWVzCglwcmludGYgJXMgRmlsZSA+ICRACgpu YW1lcy9maW5pc2g6IHwgbmFtZXMKCXByaW50ZiAlcyBGaW5pc2ggPiAkQAoKbmFtZXMvZnJlZWJz ZF92ZXJzaW9uXzEwX2FuZF9lYXJsaWVyOiB8IG5hbWVzCglwcmludGYgJXMgJ0ZyZWVCU0QgdmVy c2lvbiAxMCBhbmQgZWFybGllcicgPiAkQAoKbmFtZXMvZ3Vlc3Rfb3BlcmF0aW5nX3N5c3RlbTog fCBuYW1lcwoJcHJpbnRmICVzICdHdWVzdCBvcGVyYXRpbmcgc3lzdGVtJyA+ICRACgpuYW1lcy9p X3dpbGxfaW5zdGFsbF90aGVfb3BlcmF0aW5nX3N5c3RlbV9sYXRlci46IHwgbmFtZXMKCXByaW50 ZiAlcyAnSSB3aWxsIGluc3RhbGwgdGhlIG9wZXJhdGluZyBzeXN0ZW0gbGF0ZXIuJyA+ICRACgpu YW1lcy9pbnN0YWxsXzIwX2Zyb21fM2FfOiB8IG5hbWVzCglwcmludGYgJXMgJ0luc3RhbGwgZnJv bTonID4gJEAKCm5hbWVzL2xvY2F0aW9uXzNhXzogfCBuYW1lcwoJcHJpbnRmICVzIExvY2F0aW9u OiA+ICRACgpuYW1lcy9tZW1vcnk6IHwgbmFtZXMKCXByaW50ZiAlcyBNZW1vcnkgPiAkQAoKbmFt ZXMvbWVtb3J5XzIwX2Zvcl8yMF90aGlzXzIwX3ZpcnR1YWxfMjBfbWFjaGluZV8zYV86IHwgbmFt ZXMKCXByaW50ZiAlcyAnTWVtb3J5IGZvciB0aGlzIHZpcnR1YWwgbWFjaGluZTonID4gJEAKCm5h bWVzL25leHQ6IHwgbmFtZXMKCXByaW50ZiAlcyAnWy1OZXh0ID4tXSB7K05leHQrfScgPiAkQAoK bmFtZXMvbmV3X3ZpcnR1YWxfbWFjaGluZS4uLjogfCBuYW1lcwoJcHJpbnRmICVzICdbLU5ldyBW aXJ0dWFsIE1hY2hpbmUuLi4tXSB7K05ldyB2aXJ0dWFsIG1hY2hpbmUuLi4rfScgPiAkQAoKbmFt ZXMvb3RoZXI6IHwgbmFtZXMKCXByaW50ZiAlcyBPdGhlciA+ICRACgpuYW1lcy9wbGF5ZXI6IHwg bmFtZXMKCXByaW50ZiAlcyBQbGF5ZXIgPiAkQAoKbmFtZXMvdmVyc2lvbjogfCBuYW1lcwoJcHJp bnRmICVzIFZlcnNpb24gPiAkQAoKbmFtZXMvdmlydHVhbF8yMF9tYWNoaW5lXzIwX25hbWVfM2Ff OiB8IG5hbWVzCglwcmludGYgJXMgJ1ZpcnR1YWwgbWFjaGluZSBuYW1lOicgPiAkQAoKbmFtZXMv dmlydHVhbF9tYWNoaW5lX25hbWU6IHwgbmFtZXMKCXByaW50ZiAlcyB2aXJ0dWFsX21hY2hpbmVf bmFtZSA+ICRACgpuYW1lcy92bXdhcmVfd29ya3N0YXRpb25fMTZfcGxheWVyOiB8IG5hbWVzCglw cmludGYgJXMgJ1ZNd2FyZSBXb3Jrc3RhdGlvbiAxNiBQbGF5ZXInID4gJEAKCm5hbWVzOgoJbWtk aXIgJEAKCnZpcnR1YWxfbWFjaGluZV9uYW1lLnZteC9maW5pc2gvY2xvc2UvLi4uOiBcCgl2aXJ0 dWFsX21hY2hpbmVfbmFtZS52bXgvZmluaXNoL2Nsb3NlLy4uLi81MTJfbWliCgp2aXJ0dWFsX21h Y2hpbmVfbmFtZS52bXg6IFwKCXZpcnR1YWxfbWFjaGluZV9uYW1lLnZteC9maW5pc2ggXAoKCWVj aG8gJEAKCXRpbWVvdXQgMTAgc2ggLWMgJ3RvdWNoIC1jICRAOyB2YXI9JCQobWt0ZW1wKTsgd2hp bGUgdGVzdCAkJHZhciAtbnQgJEA7IGRvIHNsZWVwIDE7IHByaW50ZiAuOyBkb25lOyBybSAkJHZh cjsgcHJpbnRmICdcJydcbidcJycnCgp2bXdhcmVfd29ya3N0YXRpb25fMTZfcGxheWVyOiBcCglu YW1lcy92bXdhcmVfd29ya3N0YXRpb25fMTZfcGxheWVyIFwKCglwcmludGYgJyUuMzAwc1x0JXNc bicgJEAgIiQkKGNhdCBuYW1lcy92bXdhcmVfd29ya3N0YXRpb25fMTZfcGxheWVyKSIgfCBleHBh bmQgLXQgMSwzMDEK On Friday, November 8th, 2024 at 5:41 AM, Dmitry Goncharov <dgoncha...@users.sf.net> wrote: > On Thu, Nov 7, 2024 at 3:49 AM WaitronCharm via Bug reports and > discussion for GNU make bug-make@gnu.org wrote: > > > > all: hello.tsk > > > %.tsk: %.o; $(info hello.tsk) > > > %.o: %.c %.tsk; $(info hello.c) > > > Wouldn't this result anyway in a cyclic graph due to '%.tsk'? > > > This is a legal makefile. Make drops the circular dependency and > successfully builds hello.tsk. > > > What I meant in my earlier email is that protecting from infinite recursion > > should not happen by forbidding recursion completely. > > > As i said earlier, the authors probably had other reasons. > Given that we mostly deal with files like hello.o, rather than > hello.o.o, one obvious question is why do you even want to do this? > > > Would this be then (1) check out the code, (2) add a new special target, > > (3) instead of 'break' simply continue around line 'Avoiding implicit rule > > recursion for rule', (4) compile and see the result? > > > (5) add tests, (6) update the manual. > > > What I meant by complications is whether the implementation uses the > > pattern rule name as some 'identifier' in any structures and multiples of > > the same pattern rule name (per target) would cause mess. (New 'identifier' > > could change to the combination of pattern rule name and instance no. of > > applying that rule). > > > No. > > > I am not familiar with the 'make' code and did not look into it yet. Want > > to just estimate how much work would this be. > > > i posted a diff below that you can use. This diff achieves the > behavior you desire. You can see, the change is small. The hard part > here, is not the size of the changeset. The hard part is to convince > yourself that, with this change, make still does the minimal necessary > amount of implicit searches. > > regards, Dmitry > > diff --git a/src/file.c b/src/file.c index 6f816c8a..c8017e34 100644 > --- a/src/file.c +++ b/src/file.c @@ -911,6 +911,10 @@ snap_deps > (void) d2->wait_here = 1; } + f = lookup_file > > (".ALLOW_RECURSIVE_CHAINS"); + if (f != 0 && f->is_target) + > > allow_recursive_chains = 1; + { struct dep *prereqs = > expand_extra_prereqs (lookup_variable > (STRING_SIZE_TUPLE(".EXTRA_PREREQS"))); diff --git a/src/implicit.c > b/src/implicit.c index 134e3fef..2bd2b90e 100644 --- a/src/implicit.c > +++ b/src/implicit.c @@ -297,7 +297,7 @@ pattern_search (struct file > file, int archive, / If this rule is in use by a parent > pattern_search, don't use it here. */ - if (rule->in_use) + if > > (rule->in_use && !allow_recursive_chains) { DBS (DB_IMPLICIT, > > (_("Avoiding implicit rule recursion for rule '%s'.\n"), diff --git > a/src/main.c b/src/main.c index 78084d09..5333df5f 100644 --- > a/src/main.c +++ b/src/main.c @@ -193,6 +193,10 @@ static int > old_builtin_variables_flag; int export_all_variables = 0; +/* Nonzero > means a chain of implicit rules can have a rule multiple times. / + > +int allow_recursive_chains; + / Nonzero means keep going even if > remaking some file fails (-k). */ int keep_going_flag; diff --git > a/src/makeint.h b/src/makeint.h index 61c78229..27a269ed 100644 --- > a/src/makeint.h +++ b/src/makeint.h @@ -736,6 +736,7 @@ extern int > print_version_flag, check_symlink_flag, posix_pedantic; extern int > not_parallel, second_expansion, clock_skew_detected; extern int > rebuilding_makefiles, one_shell, output_sync, verify_flag; extern int > export_all_variables; +extern int allow_recursive_chains; extern > unsigned long command_count; extern const char *default_shell;