47604


環境はwindows10(32bit), gcc-5.3.0, cmake-3.4.0, GNUmake-3.81です。

defaultの設定ではVisual Studio付属のnmakeを使ってのbuildになってしまうため、`-G "MSYS
Makefiles"`というオプションを付けてcmakeを行いました。

directory構成は、  
sample/  
├ .#main.c  
└ CMakeLists.txt  
で、それぞれのソースコードは末尾に示します。<https://m-tmatma.github.io/cmake/cmake-
helloworld.html>から内容は引用し、main.cを.#main.cに変えただけのものです。これをsample内で`cmake -G "MSYS
Makefiles"`とすると、

[code]

    -- The C compiler identification is GNU 5.3.0
    -- The CXX compiler identification is GNU 5.3.0
    -- Check for working C compiler: C:/Pragram Files/MinGW/bin/gcc.exe
    -- Check for working C compiler: C:/Program Files/MinGW/bin/gcc.exe -- works
    -- Detecting C compiler ABI info
    -- Detecting C compiler ABI info - done
    -- Detecting C compile features
    -- Detecting C compile features - done
    -- Check for working CXX compiler: C:/Program Files/MinGW/bin/g++.exe
    -- Check for working CXX compiler: C:/Program Files/MinGW/bin/g++.exe -- works
    -- Detecting CXX compiler ABI info
    -- Detecting CXX compiler ABI info - done
    -- Detecting CXX compile features
    -- Detecting CXX compile features - done
    -- Configuring done
    -- Generating done
    -- Build files have been written to: C:/somedir/sample
    
[/code]

のようにoutputが得られ、成功します(生成されたMakefileは末尾に載せます)。  
しかし、ここで`make`を実行すると、

[code]

    Makefile:126: *** missing separator.  Stop.
    
[/code]

というerrorを吐きます。126行目は、

[code]

    .#main.obj: .#main.c.obj
    
[/code]

という行です。

ファイル名に#があるとエラーを吐くというところまでは分かりました。ファイル名を変更せずにこのエラーを解決するにはどうすればよいのでしょうか。

以下ソースコード

.#main.c

[code]

    #include <stdio.h>
    
    int main()
    {
        printf("Hello World\n");
        return 0;
    }
    
[/code]

CMakeLists.txt

[code]

    cmake_minimum_required(VERSION 2.6.4)
    
    # define a variable of project name
    set( project_name "HelloWorld")
    
    # set the project as the startup project
    set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT ${project_name} )
    
    # define a project name
    project (${project_name})
    
    # define a variable SRC with file GLOB
    file(GLOB SRC *.c)
    
    # define sources files of an executable
    add_executable(${project_name} ${SRC})
    
[/code]

Makefile

[code]

    # CMAKE generated file: DO NOT EDIT!
    # Generated by "MSYS Makefiles" Generator, CMake Version 3.4
    
    # Default target executed when no arguments are given to make.
    default_target: all
    
    .PHONY : default_target
    
    # Allow only one "make -f Makefile2" at a time, but pass parallelism.
    .NOTPARALLEL:
    
    
    #=============================================================================
    # Special targets provided by cmake.
    
    # Disable implicit rules so canonical targets will work.
    .SUFFIXES:
    
    
    # Remove some rules from gmake that .SUFFIXES does not remove.
    SUFFIXES =
    
    .SUFFIXES: .hpux_make_needs_suffix_list
    
    
    # Suppress display of executed commands.
    $(VERBOSE).SILENT:
    
    
    # A target that is always out of date.
    cmake_force:
    
    .PHONY : cmake_force
    
    #=============================================================================
    # Set environment variables for the build.
    
    # The shell in which to execute make rules.
    SHELL = /bin/sh
    
    # The CMake executable.
    CMAKE_COMMAND = /C/Program Files/CMake/bin/cmake.exe
    
    # The command to remove a file.
    RM = /C/Program Files/CMake/bin/cmake.exe -E remove -f
    
    # Escaping for special characters.
    EQUALS = =
    
    # The top-level source directory on which CMake was run.
    CMAKE_SOURCE_DIR = /C/somedir/sample
    
    # The top-level build directory on which CMake was run.
    CMAKE_BINARY_DIR = /C/somedir/sample
    
    #=============================================================================
    # Targets provided globally by CMake.
    
    # Special rule for the target edit_cache
    edit_cache:
        @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..."
        /c/Program Files/CMake/bin/cmake-gui.exe -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
    .PHONY : edit_cache
    
    # Special rule for the target edit_cache
    edit_cache/fast: edit_cache
    
    .PHONY : edit_cache/fast
    
    # Special rule for the target rebuild_cache
    rebuild_cache:
        @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..."
        /c/Program Files/CMake/bin/cmake.exe -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
    .PHONY : rebuild_cache
    
    # Special rule for the target rebuild_cache
    rebuild_cache/fast: rebuild_cache
    
    .PHONY : rebuild_cache/fast
    
    # The main all target
    all: cmake_check_build_system
        $(CMAKE_COMMAND) -E cmake_progress_start /C/somedir/sample/CMakeFiles /C/somedir/sample/CMakeFiles/progress.marks
        $(MAKE) -f CMakeFiles/Makefile2 all
        $(CMAKE_COMMAND) -E cmake_progress_start /C/somedir/sample/CMakeFiles 0
    .PHONY : all
    
    # The main clean target
    clean:
        $(MAKE) -f CMakeFiles/Makefile2 clean
    .PHONY : clean
    
    # The main clean target
    clean/fast: clean
    
    .PHONY : clean/fast
    
    # Prepare targets for installation.
    preinstall: all
        $(MAKE) -f CMakeFiles/Makefile2 preinstall
    .PHONY : preinstall
    
    # Prepare targets for installation.
    preinstall/fast:
        $(MAKE) -f CMakeFiles/Makefile2 preinstall
    .PHONY : preinstall/fast
    
    # clear depends
    depend:
        $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
    .PHONY : depend
    
    #=============================================================================
    # Target rules for targets named HelloWorld
    
    # Build rule for target.
    HelloWorld: cmake_check_build_system
        $(MAKE) -f CMakeFiles/Makefile2 HelloWorld
    .PHONY : HelloWorld
    
    # fast build rule for target.
    HelloWorld/fast:
        $(MAKE) -f CMakeFiles/HelloWorld.dir/build.make CMakeFiles/HelloWorld.dir/build
    .PHONY : HelloWorld/fast
    
    .#main.obj: .#main.c.obj
    
    .PHONY : .#main.obj
    
    # target to build an object file
    .#main.c.obj:
        $(MAKE) -f CMakeFiles/HelloWorld.dir/build.make "CMakeFiles/HelloWorld.dir/.#main.c.obj"
    .PHONY : .#main.c.obj
    
    .#main.i: .#main.c.i
    
    .PHONY : .#main.i
    
    # target to preprocess a source file
    .#main.c.i:
        $(MAKE) -f CMakeFiles/HelloWorld.dir/build.make "CMakeFiles/HelloWorld.dir/.#main.c.i"
    .PHONY : .#main.c.i
    
    .#main.s: .#main.c.s
    
    .PHONY : .#main.s
    
    # target to generate assembly for a file
    .#main.c.s:
        $(MAKE) -f CMakeFiles/HelloWorld.dir/build.make "CMakeFiles/HelloWorld.dir/.#main.c.s"
    .PHONY : .#main.c.s
    
    # Help Target
    help:
        @echo "The following are some of the valid targets for this Makefile:"
        @echo "... all (the default if no target is provided)"
        @echo "... clean"
        @echo "... depend"
        @echo "... edit_cache"
        @echo "... rebuild_cache"
        @echo "... HelloWorld"
        @echo "... .#main.obj"
        @echo "... .#main.i"
        @echo "... .#main.s"
    .PHONY : help
    
    
    
    #=============================================================================
    # Special targets to cleanup operation of make.
    
    # Special rule to run CMake to check the build system integrity.
    # No rule that depends on this can have commands that come from listfiles
    # because they might be regenerated.
    cmake_check_build_system:
        $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0
    .PHONY : cmake_check_build_system
    
[/code]


CC BY-SA 4.0
2018-08-18T09:59:54.443
47602
2018-08-18T11:02:10.613
29768
question
c makefile cmake
ファイル名が.#で始まるファイルに対して、cmakeで作製されたmakefileをmakeするとエラーを吐く


> ファイル名に#があるとエラーを吐くというところまでは分かりました。ファイル名を変更せずにこのエラーを解決するにはどうすればよいのでしょうか。

[makeのマニュアル](https://www.gnu.org/software/make/manual/make.html#Makefile-
Contents)によると、`#`をコメントではなく、リテラルとして使用したい場合は、`.\\#main.c`のように、バックスラッシュ(`\`)でエスケープするとあります。

そのため、Makefile内の`.#main`を`.\\#main`に置換すれば、該当エラーは解決するはずです。


CC BY-SA 4.0
2018-08-18T11:02:10.613
47604
2018-08-18T11:02:10.613
29553
47602
answer