commonmark / cmark

CommonMark parsing and rendering library and program in C
Other
1.6k stars 534 forks source link

`make mingw` should forward/use CC, CXX, HOST variables if set #484

Open ell1e opened 10 months ago

ell1e commented 10 months ago

Right now, make mingw seems to have some notion of MinGW hardcoded. This is nice as a start until you try to run it on a distribution where it's named differently. So I thought why not just specify CXX, CXX, and HOST, like the cmake error actually encourages me to, but it's all ignored:

$ make mingw CC=/usr/bin/x86_64-w64-mingw32-gcc CXX=/usr/bin/x86_64-w64-mingw32-g++ HOST=/usr/bin/x86_64-w64-mingw32 CFLAGS="-m64"
mkdir -p build-mingw; \
cd build-mingw; \
cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchain-mingw32.cmake -DCMAKE_INSTALL_PREFIX=windows ;\
make && make install
-- The C compiler identification is unknown
-- The CXX compiler identification is unknown
CMake Error at CMakeLists.txt:2 (project):
  The CMAKE_C_COMPILER:

    i686-w64-mingw32-gcc

  is not a full path and was not found in the PATH.

  Tell CMake where to find the compiler by setting either the environment
  variable "CC" or the CMake cache entry CMAKE_C_COMPILER to the full path to
  the compiler, or to the compiler name if it is in the PATH.

CMake Error at CMakeLists.txt:2 (project):
  The CMAKE_CXX_COMPILER:

    i686-w64-mingw32-g++

  is not a full path and was not found in the PATH.

  Tell CMake where to find the compiler by setting either the environment
  variable "CXX" or the CMake cache entry CMAKE_CXX_COMPILER to the full path
  to the compiler, or to the compiler name if it is in the PATH.

-- Configuring incomplete, errors occurred!
See also "/home/user/commonmark/build-mingw/CMakeFiles/CMakeOutput.log".
See also "/home/user/commonmark/build-mingw/CMakeFiles/CMakeError.log".
make[1]: Entering directory '/home/user/commonmark/build-mingw'
make[1]: *** No targets specified and no makefile found.  Stop.
make[1]: Leaving directory '/home/user/commonmark/build-mingw'
make: *** [Makefile:102: mingw] Error 2

I even tried to modify cmark's Makefile to pass on the CC, CXX, HOST vars to the cmake call (which I think they should be), but cmake still ignores it. If that could be made to work that would be great, because with autotools and similar, setting CC/CXX and specifying the --host version works perfectly, same for most plain Makefiles that don't use cmake behind the scenes.

ell1e commented 10 months ago

Funnily enough, with this hacky 3 line edit, it works just fine:

$ git --no-pager diff
diff --git a/Makefile b/Makefile
index 4938044..087b2e6 100644
--- a/Makefile
+++ b/Makefile
@@ -101,7 +101,7 @@ lint: $(BUILDDIR)
 mingw:
    mkdir -p $(MINGW_BUILDDIR); \
    cd $(MINGW_BUILDDIR); \
-   cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchain-mingw32.cmake -DCMAKE_INSTALL_PREFIX=$(MINGW_INSTALLDIR) ;\
+   cmake ..  -DCMAKE_TOOLCHAIN_FILE=../toolchain-mingw32.cmake -DCMAKE_INSTALL_PREFIX=$(MINGW_INSTALLDIR) -DCMAKE_C_COMPILER="$(CC)" -DCMAKE_CXX_COMPILER="$(CXX)" ;\
    $(MAKE) && $(MAKE) install

 man/man3/cmark.3: src/cmark.h | $(CMARK)
diff --git a/toolchain-mingw32.cmake b/toolchain-mingw32.cmake
index ad84aad..cbd3979 100644
--- a/toolchain-mingw32.cmake
+++ b/toolchain-mingw32.cmake
@@ -2,8 +2,8 @@
 SET(CMAKE_SYSTEM_NAME Windows)

 # which compilers to use for C and C++
-SET(CMAKE_C_COMPILER i686-w64-mingw32-gcc)
-SET(CMAKE_CXX_COMPILER i686-w64-mingw32-g++)
+#SET(CMAKE_C_COMPILER i686-w64-mingw32-gcc)
+#SET(CMAKE_CXX_COMPILER i686-w64-mingw32-g++)
 SET(CMAKE_RC_COMPILER i686-w64-mingw32-windres)

 # here is the target environment located
ellie@emeraldpc:~/Develop/hvm.horse64.org/vendor/commonmark$ make mingw CC=/usr/bin/x86_64-w64-mingw32-gcc CXX=/usr/bin/x86_64-w64-mingw32-g++ HOST=/usr/bin/x86_64-w64-mingw32 CFLAGS="-m64"
mkdir -p build-mingw; \
cd build-mingw; \
cmake ..  -DCMAKE_TOOLCHAIN_FILE=../toolchain-mingw32.cmake -DCMAKE_INSTALL_PREFIX=windows -DCMAKE_C_COMPILER="/usr/bin/x86_64-w64-mingw32-gcc" -DCMAKE_CXX_COMPILER="/usr/bin/x86_64-w64-mingw32-g++" ;\
make && make install
-- The C compiler identification is GNU 9.2.0
-- The CXX compiler identification is GNU 9.2.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/x86_64-w64-mingw32-gcc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/x86_64-w64-mingw32-g++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Performing Test HAVE_FLAG_ADDRESS_SANITIZER
-- Performing Test HAVE_FLAG_ADDRESS_SANITIZER - Failed
-- Performing Test HAVE_FLAG_SANITIZE_ADDRESS
-- Performing Test HAVE_FLAG_SANITIZE_ADDRESS - Failed
-- Performing Test COMPILER_HAS_DEPRECATED_ATTR
-- Performing Test COMPILER_HAS_DEPRECATED_ATTR - Success
-- Looking for stdbool.h
-- Looking for stdbool.h - found
-- Performing Test HAVE___BUILTIN_EXPECT
-- Performing Test HAVE___BUILTIN_EXPECT - Success
-- Performing Test HAVE___ATTRIBUTE__
-- Performing Test HAVE___ATTRIBUTE__ - Success
-- Found PythonInterp: /usr/bin/python3 (found suitable version "3.6.15", minimum required is "3") 
-- Configuring done
-- Generating done
-- Build files have been written to: /home/user/vendor/commonmark/build-mingw
make[1]: Entering directory '/home/user/vendor/commonmark/build-mingw'
make[2]: Entering directory '/home/user/vendor/commonmark/build-mingw'
make[3]: Entering directory '/home/user/vendor/commonmark/build-mingw'
make[3]: Leaving directory '/home/user/vendor/commonmark/build-mingw'
make[3]: Entering directory '/home/user/vendor/commonmark/build-mingw'
[  2%] Building C object src/CMakeFiles/cmark_static.dir/cmark.c.obj
[  4%] Building C object src/CMakeFiles/cmark_static.dir/node.c.obj
[  6%] Building C object src/CMakeFiles/cmark_static.dir/iterator.c.obj
[  8%] Building C object src/CMakeFiles/cmark_static.dir/blocks.c.obj
[ 10%] Building C object src/CMakeFiles/cmark_static.dir/inlines.c.obj
[ 13%] Building C object src/CMakeFiles/cmark_static.dir/scanners.c.obj
[ 15%] Building C object src/CMakeFiles/cmark_static.dir/utf8.c.obj
[ 17%] Building C object src/CMakeFiles/cmark_static.dir/buffer.c.obj
[ 19%] Building C object src/CMakeFiles/cmark_static.dir/references.c.obj
[ 21%] Building C object src/CMakeFiles/cmark_static.dir/render.c.obj
[ 23%] Building C object src/CMakeFiles/cmark_static.dir/man.c.obj
[ 26%] Building C object src/CMakeFiles/cmark_static.dir/xml.c.obj
[ 28%] Building C object src/CMakeFiles/cmark_static.dir/html.c.obj
[ 30%] Building C object src/CMakeFiles/cmark_static.dir/commonmark.c.obj
[ 32%] Building C object src/CMakeFiles/cmark_static.dir/latex.c.obj
[ 34%] Building C object src/CMakeFiles/cmark_static.dir/houdini_href_e.c.obj
[ 36%] Building C object src/CMakeFiles/cmark_static.dir/houdini_html_e.c.obj
[ 39%] Building C object src/CMakeFiles/cmark_static.dir/houdini_html_u.c.obj
[ 41%] Building C object src/CMakeFiles/cmark_static.dir/cmark_ctype.c.obj
[ 43%] Linking C static library libcmark.a
make[3]: Leaving directory '/home/user/vendor/commonmark/build-mingw'
[ 43%] Built target cmark_static
make[3]: Entering directory '/home/user/vendor/commonmark/build-mingw'
make[3]: Leaving directory '/home/user/vendor/commonmark/build-mingw'
make[3]: Entering directory '/home/user/vendor/commonmark/build-mingw'
[ 45%] Building C object src/CMakeFiles/cmark.dir/cmark.c.obj
[ 47%] Building C object src/CMakeFiles/cmark.dir/node.c.obj
[ 50%] Building C object src/CMakeFiles/cmark.dir/iterator.c.obj
[ 52%] Building C object src/CMakeFiles/cmark.dir/blocks.c.obj
[ 54%] Building C object src/CMakeFiles/cmark.dir/inlines.c.obj
[ 56%] Building C object src/CMakeFiles/cmark.dir/scanners.c.obj
[ 58%] Building C object src/CMakeFiles/cmark.dir/utf8.c.obj
[ 60%] Building C object src/CMakeFiles/cmark.dir/buffer.c.obj
[ 63%] Building C object src/CMakeFiles/cmark.dir/references.c.obj
[ 65%] Building C object src/CMakeFiles/cmark.dir/render.c.obj
[ 67%] Building C object src/CMakeFiles/cmark.dir/man.c.obj
[ 69%] Building C object src/CMakeFiles/cmark.dir/xml.c.obj
[ 71%] Building C object src/CMakeFiles/cmark.dir/html.c.obj
[ 73%] Building C object src/CMakeFiles/cmark.dir/commonmark.c.obj
[ 76%] Building C object src/CMakeFiles/cmark.dir/latex.c.obj
[ 78%] Building C object src/CMakeFiles/cmark.dir/houdini_href_e.c.obj
[ 80%] Building C object src/CMakeFiles/cmark.dir/houdini_html_e.c.obj
[ 82%] Building C object src/CMakeFiles/cmark.dir/houdini_html_u.c.obj
[ 84%] Building C object src/CMakeFiles/cmark.dir/cmark_ctype.c.obj
[ 86%] Linking C shared library libcmark.dll
make[3]: Leaving directory '/home/user/vendor/commonmark/build-mingw'
[ 86%] Built target cmark
make[3]: Entering directory '/home/user/vendor/commonmark/build-mingw'
make[3]: Leaving directory '/home/user/vendor/commonmark/build-mingw'
make[3]: Entering directory '/home/user/vendor/commonmark/build-mingw'
[ 89%] Building C object src/CMakeFiles/cmark_exe.dir/main.c.obj
[ 91%] Linking C executable cmark.exe
make[3]: Leaving directory '/home/user/vendor/commonmark/build-mingw'
[ 91%] Built target cmark_exe
make[3]: Entering directory '/home/user/vendor/commonmark/build-mingw'
make[3]: Leaving directory '/home/user/vendor/commonmark/build-mingw'
make[3]: Entering directory '/home/user/vendor/commonmark/build-mingw'
[ 93%] Building CXX object api_test/CMakeFiles/api_test.dir/cplusplus.cpp.obj
[ 95%] Building C object api_test/CMakeFiles/api_test.dir/harness.c.obj
[ 97%] Building C object api_test/CMakeFiles/api_test.dir/main.c.obj
[100%] Linking CXX executable api_test.exe
make[3]: Leaving directory '/home/user/vendor/commonmark/build-mingw'
[100%] Built target api_test
make[2]: Leaving directory '/home/user/vendor/commonmark/build-mingw'
make[1]: Leaving directory '/home/user/vendor/commonmark/build-mingw'
make[1]: Entering directory '/home/user/vendor/commonmark/build-mingw'
make[2]: Entering directory '/home/user/vendor/commonmark/build-mingw'
make[3]: Entering directory '/home/user/vendor/commonmark/build-mingw'
Consolidate compiler generated dependencies of target cmark_static
make[3]: Leaving directory '/home/user/vendor/commonmark/build-mingw'
[ 43%] Built target cmark_static
make[3]: Entering directory '/home/user/vendor/commonmark/build-mingw'
Consolidate compiler generated dependencies of target cmark
make[3]: Leaving directory '/home/user/vendor/commonmark/build-mingw'
[ 86%] Built target cmark
make[3]: Entering directory '/home/user/vendor/commonmark/build-mingw'
Consolidate compiler generated dependencies of target cmark_exe
make[3]: Leaving directory '/home/user/vendor/commonmark/build-mingw'
[ 91%] Built target cmark_exe
make[3]: Entering directory '/home/user/vendor/commonmark/build-mingw'
Consolidate compiler generated dependencies of target api_test
make[3]: Leaving directory '/home/user/vendor/commonmark/build-mingw'
[100%] Built target api_test
make[2]: Leaving directory '/home/user/vendor/commonmark/build-mingw'
Install the project...
-- Install configuration: "Release"
-- Installing: /home/user/vendor/commonmark/build-mingw/windows/bin/cmark.exe
-- Installing: /home/user/vendor/commonmark/build-mingw/windows/lib/libcmark.dll.a
-- Installing: /home/user/vendor/commonmark/build-mingw/windows/bin/libcmark.dll
-- Installing: /home/user/vendor/commonmark/build-mingw/windows/lib/libcmark.a
-- Installing: /home/user/vendor/commonmark/build-mingw/windows/lib/pkgconfig/libcmark.pc
-- Installing: /home/user/vendor/commonmark/build-mingw/windows/include/cmark.h
-- Installing: /home/user/vendor/commonmark/build-mingw/windows/include/cmark_export.h
-- Installing: /home/user/vendor/commonmark/build-mingw/windows/include/cmark_version.h
-- Installing: /home/user/vendor/commonmark/build-mingw/windows/lib/cmake/cmark/cmark-config.cmake
-- Installing: /home/user/vendor/commonmark/build-mingw/windows/lib/cmake/cmark/cmark-config-version.cmake
-- Installing: /home/user/vendor/commonmark/build-mingw/windows/lib/cmake/cmark/cmark-targets.cmake
-- Installing: /home/user/vendor/commonmark/build-mingw/windows/lib/cmake/cmark/cmark-targets-release.cmake
make[1]: Leaving directory '/home/user/vendor/commonmark/build-mingw'
$

Now the problem is, obviously that will break it for users who are not overriding CC and CXX via the command line.

Maybe someone who actually knows their way around cmake can fix this? Ideally what it should do is see if the compilers set in the toolchain file actually exist, and only if they don't, use CC and CXX from the command line as provided to make mingw. Funnily enough, the error message seems to suggest that it does that, but it doesn't and just always ignores CC and CXX no matter how I pass it into cmake.

ell1e commented 10 months ago

I've switched to a different markdown library now that is easier to build for more unusual platforms. Would be cool though if at least for others this could be eventually addressed.